v0.8.16
What's Changed
Analytics Stats Endpoints
Four new read-only GET /stats/* endpoints replace the raw SQL queries that analytics.html was running through POST /query:
GET /stats/call-volume— Hourly or daily call counts with avg durationGET /stats/daily-overview— Daily aggregates with active talkgroup countsGET /stats/category-breakdown— Calls grouped by talkgroup tagGET /stats/call-heatmap— Day-of-week × hour-of-day call matrix with timezone support
All support system_id filtering. analytics.html now uses these endpoints instead of /query.
Batch Transcription Endpoint
GET /transcriptions/batch?call_ids=1,2,3— Fetch primary transcription text + segments for up to 500 calls in one request. Replaces the raw SQL batch query inirc-radio-live.html.
/query Write Auth Restored
POST /query is back behind WriteAuth — no frontend pages depend on it anymore. The read token (public via /auth-init) can no longer execute arbitrary SQL.
MQTT Instance ID Rewriting
MQTT_INSTANCE_MAP— New config option to rewriteinstance_idin MQTT payloads based on topic prefix. Fixes identity collisions when multiple TR instances share the default "trunk-recorder" instance ID.
Signal Event Support
- Ingest and display signal events (MDC1200, FleetSync, STAR) from trunk-recorder's unit event stream.
- New
signalunit event subtype withsignal_system,signal_tag, andsignal_valuefields.
Conventional System Fixes
- Warmup gate releases immediately for conventional systems (no sysid to wait for)
- Filter bogus
unit_id: -1events from conventional systems - Expanded
system_typeto supportconventionalP25,conventionalDMR,conventionalSIGMF
Security
WriteAuthnow blocks all writes whenWRITE_TOKENis unset (read-only mode)- Documented Caddy conditional auth header injection pattern
Full Changelog: v0.8.15...v0.8.16