GopherTrunk v0.3.1 — social announcement drafts
One-click copy-paste blurbs for posting the v0.3.1 release. Each block below is a fenced code block so the rendered-markdown “copy” button grabs exactly what you’d paste.
Release: https://github.com/MattCheramie/GopherTrunk/releases/tag/v0.3.1
Reddit — title
GopherTrunk v0.3.1 — RTL-SDR Blog V4 finally receives, P25 live-decode reliability fixes, and a diagnostics banner on every error
Reddit — body
**[GopherTrunk](https://gophertrunk.org) v0.3.1 is out** — pure-Go digital-trunking scanner for RTL-SDR / HackRF / Airspy. P25 (Phase 1+2), DMR (AMBE+2 voice), NXDN, Motorola Type II, EDACS, LTR, MPT 1327, dPMR, D-STAR, YSF, M17, plus APRS, POCSAG + FLEX paging, and AIS / DSC / ADS-B. No CGO, single static binary for Linux / macOS / Windows.
**What's new since v0.3.0:**
* **RTL-SDR Blog V4 reception finally works** (#506, issue #264) — the V4 was receiving only noise: it runs a 28.8 MHz reference crystal (not the 16 MHz every other R828D uses) and has a switched HF/VHF/UHF input bank the stock driver never routed, so the wanted signal landed out of band. Both are now handled, gated entirely on V4 detection — R820T2 / non-V4 R828D paths are byte-for-byte unchanged. Plus #501 opens the WinUSB child interface of composite (usbccgp) dongles on Windows so `sdr doctor` stops reporting a false BAD, and #499 decodes spectrum-inverted (I/Q-reversed) DMR bursts on the R828D.
* **P25 live control-channel decode reliability** (#402, #489) — the long-standing "locks but TSBK CRC fails live while replay is clean" bug traced to the live ingest path dropping real-time IQ under any stall. #507 decouples IQ ingest from decode behind a bounded queue, #508 pools the queued buffers, #505 stops the driver shedding 25–48% of live chunks (reuse ring + LUT conversion), and #496 surfaces ADC clipping (`iq_clip_ratio`) so an overloaded front end is visible instead of being mistaken for low gain.
* **CQPSK / LSM carrier recovery** (#497, #503, issue #492) — the CQPSK path had no carrier-frequency recovery, so a real tuner offset spun the differential constellation and the Frame Sync Word never correlated. A two-stage recovery (lag-1 coarse seed + a decision-free Costas loop) now tracks the offset, with the seed fixed to fire under production streaming chunk sizes.
* **P25 Phase 1 voice decode** (#498, issue #489) — corrected the LDU voice-frame interleaving offsets so the §7.5 IMBE deinterleaver lands on the right bits (voice had stayed ~100% uncorrectable).
* **Diagnostic banner + verbose error reporting** (#502) — every error surface (CLI, HTTP API, gRPC, web) can now prepend a banner with build version, OS/kernel, host specs, and detected dongles, plus an opt-in full trace (`diagnostics.verbose_errors` / `-verbose-errors`) — so a single bug report carries everything needed to triage.
* **`cchunt.failed` now explains why** (#500) — the control-channel hunter reports the control SDR's live IQ health (power / DC / clip, or "no IQ at all → check `sdr list --probe`") instead of just "no lock".
* **Go toolchain bumped to 1.25.11** (#504) — clears two stdlib advisories.
**Downloads** (Linux / macOS / Windows, x64 + ARM64): https://github.com/MattCheramie/GopherTrunk/releases/tag/v0.3.1
**Docs:** https://gophertrunk.org
Heads-up: the v0.x line is still flagged prerelease — actively developed, feedback / captures / bug reports very welcome.
Discord
**GopherTrunk v0.3.1 is out** — pure-Go trunking scanner for RTL-SDR / HackRF / Airspy. P25, DMR, NXDN, M17, analog trunked, APRS, POCSAG + FLEX paging, AIS / DSC / ADS-B. Single static binary, zero CGO.
**What's new since v0.3.0:**
- **RTL-SDR Blog V4 finally receives** (#506, issue #264) — the V4 was getting only noise: wrong reference crystal (it's 28.8 MHz, not 16) + an unrouted HF/VHF/UHF input bank. Both fixed, V4-only, so other dongles are unchanged. Also #501 (WinUSB composite child on Windows) and #499 (spectrum-inverted DMR on R828D).
- **P25 live-decode reliability** (#402/#489) — #507/#508 decouple + pool live IQ ingest, #505 stops the driver shedding 25–48% of live chunks, #496 surfaces ADC clipping (`iq_clip_ratio`). Fixes "locks but TSBK CRC fails live, replay clean".
- **CQPSK carrier recovery** (#497/#503, issue #492) — a real tuner offset no longer kills control-channel lock.
- **P25 Phase 1 voice** (#498, issue #489) — corrected LDU voice-frame interleaving offsets.
- **Diagnostics banner + verbose errors** (#502) — build/OS/host/dongle banner on every error surface; opt-in full trace.
- **`cchunt.failed` explains why** (#500) and **Go 1.25.11** (#504).
Download: <https://github.com/MattCheramie/GopherTrunk/releases/tag/v0.3.1>
Docs: <https://gophertrunk.org>