GopherTrunk v0.4.9 — social announcement drafts

One-click copy-paste blurbs for posting the v0.4.9 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.4.9


Reddit — title

GopherTrunk v0.4.9 — a field-driven bug-fix release: closes a cross-call audio-bleed window in the live PCM fan-out, stops the web Scanner tab crashing on a null payload, makes trunked hunts actually converge on identity + topology, hardens RID/talkgroup alias imports against mojibake, prints full HackRF serials, and streams raw IMBE/AMBE+2 vocoder frames over gRPC

Reddit — body

**[GopherTrunk](https://gophertrunk.org) v0.4.9 is out** — pure-Go digital-trunking scanner for RTL-SDR / HackRF / Airspy / USRP. 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.

This one is built around six issues reported on a live P25 Phase 1 system, plus follow-up audio plumbing and import hardening.

**What's new since v0.4.8:**

* **No more cross-call audio bleed** (#743). The earlier on-disk CallID fence didn't cover the streaming tap, so a reused wideband voice-tap serial could relabel a draining call's audio with the next call's talkgroup. The session CallID is now threaded through the live PCM fan-out, dropping any frame whose CallID no longer matches the bound call.
* **Web Scanner tab no longer crashes** (#743, #746). A nil Go slice marshalled to JSON `null` and the panel dereferenced `systems.length` / `channels.length`. The payload now emits `[]`, the frontend null-guards the reads, and there's test coverage for both shapes.
* **Trunked hunts converge instead of timing out** (#743). P25 status broadcasts cycle too slowly to land in the old 3 s dwell, so only NAC surfaced. A trunked hunt now defaults to the streaming converge-and-stop monitor that ends early once identity + topology settle — and the blind-sweep form gained a matching "Monitor (minutes)" field (#746).
* **No more bogus talkgroups** (#743). Unit-to-unit / telephone / SNDCP-data grants publish a target unit as the grant "group"; discovery was recording those as talkgroups. They're now flagged Individual and skipped, and the spurious per-talkgroup frequency list (meaningless on a dynamically-assigned trunk) is gone.
* **Alias imports hardened against mojibake** (#744) — UTF-16/BOM SDRTrunk exports are transcoded to UTF-8 and non-printable runes stripped across both RID and talkgroup CSV/JSON loaders.
* **`sdr list` prints full HackRF serials** (#745) — columns size to the widest value instead of truncating to 16 chars (which left only the all-zero prefix), and `--probe` is bounded so a wedged device can't hang the command.
* **Raw vocoder frame streaming over gRPC** (#746) — `include_raw` subscribers finally receive verbatim IMBE / AMBE+2 frames, even for protocols with no in-process decoder (ProVoice, encrypted) where the raw bytes are the only audio. Purely additive; PCM-only clients are unaffected.

**Downloads** (Linux / macOS / Windows, x64 + ARM64): https://github.com/MattCheramie/GopherTrunk/releases/tag/v0.4.9

**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.4.9 is out** — pure-Go trunking scanner for RTL-SDR / HackRF / Airspy / USRP. P25, DMR, NXDN, M17, analog trunked, APRS, POCSAG + FLEX paging, AIS / DSC / ADS-B. Single static binary, zero CGO.

A field-driven bug-fix release built around six issues from a live P25 Phase 1 system.

**What's new since v0.4.8:**
- **No cross-call audio bleed** (#743) — the session CallID is now threaded through the live PCM fan-out, so a reused voice-tap serial can't leak a draining call's audio to the next call's talkgroup.
- **Scanner tab no longer crashes** (#743, #746) — null `systems`/`channels` payloads are normalized to `[]` and null-guarded, with test coverage.
- **Trunked hunts converge** (#743) — default to the streaming converge-and-stop monitor instead of a 3 s dwell; blind-sweep gains a "Monitor (minutes)" field (#746).
- **No bogus talkgroups** (#743) — unit-to-unit / telephone / SNDCP grants are flagged Individual and skipped; the meaningless per-talkgroup frequency list is dropped.
- **Alias imports hardened** (#744) — UTF-16/BOM SDRTrunk exports transcoded, mojibake stripped (RID + talkgroup, CSV + JSON).
- **`sdr list` full HackRF serials** (#745) — columns size to fit; `--probe` is bounded so a wedged device can't hang.
- **Raw vocoder frames over gRPC** (#746) — `include_raw` subs get verbatim IMBE/AMBE+2, including ProVoice/encrypted. Additive; PCM-only clients unaffected.

Download: <https://github.com/MattCheramie/GopherTrunk/releases/tag/v0.4.9>
Docs: <https://gophertrunk.org>