GopherTrunk v0.2.9 — social announcement drafts

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


Reddit — title

GopherTrunk v0.2.9 — FLEX paging + M17 link metadata decoders, and RTL-SDR finally works on real Windows

Reddit — body

**[GopherTrunk](https://gophertrunk.org) v0.2.9 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.2.8:**

* **RTL-SDR control transfers now work on real Windows hardware** (#481–#484) — the root cause was a calling-convention bug: `WinUsb_ControlTransfer` takes the setup packet *by value* (passed in a single register on x64/arm64), but GopherTrunk passed a *pointer*, so every vendor control transfer sent garbage and the dongle rejected it with `ERROR_GEN_FAILURE`. #483 fixes the packing; #481 makes the librtlsdr-style warmup write non-fatal, #482 adds clear-halt + retry and a full USB diagnostics dump to `sdr list --probe`, and #484 extends the NESDR v5 R82xx burst recovery to Windows pipe stalls. If your RTL-SDR worked in SDRTrunk but not GopherTrunk on Windows, this is the release.
* **FLEX paging decoder** (#478) — completes Phase 3: FLEX (1600 bps / 2-level) now decodes off the air alongside POCSAG, both sharing the `pager_log` table and `/pager` panel, tagged by protocol. Logical layer (sync + mode code → frame-info → de-interleave → BCH(31,21) → BIW / address / vector / message walk) for alphanumeric / numeric / tone vectors.
* **M17 link-layer metadata decoder** (#479) — recover M17 link-setup metadata (caller, callee, mode) off the LICH without decoding audio: base-40 callsigns, Golay(24,12) LICH reassembly, 0xFF5D stream-sync hunt, so an in-progress transmission is picked up in ~240 ms. New `m17_log` table, `/api/v1/m17/linksetups`, and `m17.channels` config. Codec2 voice is a documented follow-up.
* **P25 Phase 2: MAC-PDU scrambler now defaults on** (#476, issue #451) — every on-air P25 Phase 2 MAC PDU is PN44-scrambled (TIA-102.BBAC-1 §7.2.5), so the previous default-off setting meant source ID / talker alias / encryption sync could never decode on a live system. Now `ScramblerOn` by default, matching the trellis default.
* **RTL2838U documented as supported** (#458) — RTL2838U is the Realtek demod/USB-bridge chip (an RTL2832U variant), not a tuner; those dongles (`0bda:2838`, R820T2/R828D inside) already work out of the box. The device whitelist and `docs/hardware.md` now say so.

**Downloads** (Linux / macOS / Windows, x64 + ARM64): https://github.com/MattCheramie/GopherTrunk/releases/tag/v0.2.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.2.9 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.2.8:**
- **RTL-SDR works on real Windows now** (#481–#484) — the actual root cause: `WINUSB_SETUP_PACKET` was passed by pointer, not by value, so every vendor control transfer sent garbage (`ERROR_GEN_FAILURE`). #483 fixes the packing; #481/#482/#484 add warmup-non-fatal, clear-halt + retry + a USB diagnostics dump, and Windows NESDR v5 burst recovery. If it worked in SDRTrunk but not here on Windows — try again.
- **FLEX paging decoder** (#478) — FLEX (1600/2) decodes off the air alongside POCSAG, sharing `pager_log` + `/pager` panel, tagged by protocol.
- **M17 link-layer metadata** (#479) — caller / callee / mode off the LICH without audio (base-40 callsigns, Golay(24,12), ~240 ms pickup). New `m17_log` / REST / `m17.channels`. Codec2 voice follows.
- **P25 Phase 2 scrambler defaults on** (#476, issue #451) — PN44 descrambling is required for live MAC-PDU decode (source ID / talker alias / encryption sync); default was wrongly off.
- **RTL2838U documented as supported** (#458) — it's an RTL2832U variant; those dongles already work out of the box.

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