GopherTrunk

module
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 2, 2026 License: Apache-2.0

README

GopherTrunk logo

GopherTrunk

Pure-Go digital-trunking radio scanner engine for RTL-SDR · HackRF · Airspy · Airspy HF+.
P25 · DMR · TETRA · NXDN · Motorola Type II · EDACS · LTR · MPT 1327 · dPMR · D-STAR · YSF.
Zero CGO, single static binary, headless daemon + Bubbletea TUI cockpit + browser web console.

CI Release License Go version Go Report Card Docs


What is this?

GopherTrunk is a software-defined-radio scanner that follows digital trunked-radio voice calls and decodes them to audio. It runs on a pool of RTL-SDR (every osmocom tuner), HackRF (One / Jawbreaker / Rad1o), Airspy R2 / Mini, and Airspy HF+ dongles, has no C dependencies at build or runtime (no librtlsdr / libhackrf / libairspy / libairspyhf / libusb / libasound2 / libmp3lame), and ships as a single ~10 MB static binary for Linux, macOS, and Windows.

Completed calls stream to Broadcastify Calls, RdioScanner, OpenMHz, and live Icecast / ShoutCast mountpoints out of the box. Why does this exist? Read The Story of GopherTrunk.

Quick start

# Linux x86_64 — see https://gophertrunk.org/downloads.html for macOS, Windows, ARM64.
VERSION=v0.2.9
curl -L -o gophertrunk.tar.gz \
  https://github.com/MattCheramie/GopherTrunk/releases/download/${VERSION}/gophertrunk-${VERSION}-linux-amd64.tar.gz
tar xzf gophertrunk.tar.gz && cd gophertrunk-${VERSION}-linux-amd64
cp config.example.yaml config.yaml
./gophertrunk version
# Plain `./gophertrunk` (no subcommand, on a TTY) drops into the
# interactive launcher: pick [1] TUI, [2] Web, or [3] Headless.
# Skip the prompt with -tui / -web / -headless.
./gophertrunk -config config.yaml

Windows users get a one-click installer that bundles Zadig for WinUSB driver setup; macOS users get notarised tarballs for Apple Silicon and Intel. Full per-OS recipes at gophertrunk.org/downloads.html.

Features

  • Trunked control-channel decoders — P25 Phase 1 + Phase 2 (full TIA-102 chain), DMR Tier II + Tier III (vendor-aware: Capacity Plus / Capacity Max grants and rest-channel tracking), NXDN, Motorola Type II / SmartZone, EDACS / GE-Marc, LTR, MPT 1327, dPMR Mode 3, TETRA TMO. Amateur-radio: D-STAR and Yaesu System Fusion.
  • POCSAG + FLEX paging — protocol + DSP for the two dominant pager protocols, both decoding straight off the air and sharing the pager_log table / /pager panel (tagged by protocol). POCSAG (CCIR 584): BCH(31,21) FEC, batch carve-up, numeric (5 BCD/codeword) + alphanumeric (7-bit packed ASCII), 512 / 1200 / 2400 bps. FLEX: 1600 bps / 2-level mode — 32-bit sync + mode code → frame-info word → block de-interleave → BCH(31,21) → BIW / address / vector / message-word walk → alphanumeric / numeric pages. Pin SDRs via paging.pocsag / paging.flex. Foundation for fire / EMS dispatch text alongside the trunked-voice pipeline. See docs/pocsag.md.
  • APRS / AX.25 packet — end-to-end pipeline for the amateur-radio APRS metadata bus (position beacons, messages, bulletins, status, Mic-E mobile-tracker compressed format). Bell-202 AFSK DSP frontend (FM demod → FFSK tone discriminator → symbol-time recovery → NRZI → HDLC framer), AX.25 frame parser with CRC-16-CCITT, APRS info-field decoders including full Mic-E (lat/lon, speed, course, altitude, message code), plus events.KindAPRSPacket bus event, SQLite aprs_log, GET /api/v1/aprs/packets, and /aprs web panel. See docs/aprs.md.
  • AIS marine — end-to-end pipeline for the Automatic Identification System every commercial vessel broadcasts on marine VHF 87B / 88B (161.975 / 162.025 MHz). 9600 Bd GMSK DSP frontend (FM demod → GFSK matched filter at BT = 0.4 → symbol-time recovery → NRZI → HDLC framer → CRC-CCITT validation), ITU-R M.1371-5 message-type dispatch (Class A position reports 1/2/3, Class B 18 + 19 extended, base-station 4, static + voyage 5, Class B static 24 A + B), signed-integer lat/lon decoder (1/600000 minute resolution), 6-bit ASCII text fields (vessel name, call-sign, destination), spec "not-available" sentinels. Plus events.KindAISMessage bus event, SQLite vessel_log, GET /api/v1/ais/vessels, and /ais web panel. See docs/ais.md.
  • MDC1200 signaling — end-to-end pipeline for Motorola's analog FFSK data burst keyed at the head / tail of a transmission on conventional VHF / UHF voice channels. 1200-baud CCIR FFSK DSP frontend (FM demod → FFSK discriminator at 1200 / 1800 Hz → Mueller-Müller timing → NRZ slicer), 40-bit sync framer with polarity tolerance, 16×7 de-interleave, op / arg / unit-ID decode with CRC-16-CCITT check, and an op/arg table (PTT ANI, emergency, status, radio check, call alert, selective call). Plus events.KindMDC1200Message bus event, SQLite mdc1200_log, GET /api/v1/mdc1200/messages, and /mdc1200 web panel. See docs/mdc1200.md.
  • DSC marine distress — protocol layer for the GMDSS Digital Selective Calling system that fires every marine VHF channel- 70 distress alert. ITU-R M.493-15 format dispatch (Distress, All-Ships, Individual, Group, Geographic, Auto-Individual), BCH(10,7) syndrome check, position decoder with quadrant hemisphere flip, nature-of-distress table. Plus events.KindDSCMessage bus event, SQLite dsc_log, GET /api/v1/dsc/messages, and /dsc web panel (rows tint by category — distress=red, urgency=orange, safety=blue). DSP frontend decodes straight off the air: FM demod → FFSK discriminator (1200 Bd, 1300/2100 Hz tones) → symbol-timing recovery → direct-FSK slicer → BCH(10,7) character sync → ITU-R M.493 parser. Pin an SDR via dsc.channels. See docs/dsc.md.
  • ADS-B aviation — end-to-end pipeline for the 1090 MHz Mode-S transponder broadcasts every commercial flight emits. ICAO Annex 10 Vol IV / DO-260B parser (CRC-24 + DF dispatch + type-code dispatch for identification, airborne / surface position with 12-bit Q-bit altitude, airborne velocity); globally-unambiguous CPR position decoder + per-ICAO even+odd pair tracker. BEAST upstream consumes Mode-S frames from any dump1090 / readsb / BeastSplitter via TCP — most 1090 MHz receive chains already run one, GopherTrunk decodes its output. Native PPM DSP frontend is the alternative: pin an SDR (>= 2 Msps) to 1090 MHz via adsb.channels and GopherTrunk demodulates Mode-S itself — magnitude envelope → 8 µs preamble correlation → PPM bit slice → CRC/DF dispatch — feeding the same decode/track path the BEAST upstream uses. Plus events.KindAircraftReport bus event, SQLite aircraft_log, GET /api/v1/adsb/aircraft, and /adsb web panel. See docs/adsb.md.
  • M17 link layer — metadata decoder for the open, Codec2-based M17 digital voice mode (4FSK, 4800 sym/s). C4FM demod → symbol timing → 4FSK slice → sync hunt → LICH reassembly (Golay(24,12), six chunks) → Link Setup Frame parse: source / destination base-40 callsigns, mode (voice / data / packet), channel-access number, CRC-16. Recovers "who's talking to whom" from an in-progress transmission without decoding audio (Codec2 voice is a planned follow-up). events.KindM17LinkSetup bus event, SQLite m17_log, GET /api/v1/m17/linksetups. Pin an SDR via m17.channels. See docs/m17.md.
  • Live map — Shared Leaflet map at the top of each position-bearing panel (APRS / AIS / DSC / ADS-B) renders decoded positions over OpenStreetMap tiles, colour-coded per protocol (blue / cyan / red-distress / purple), with marker tooltips and camera auto-fit. Same <PositionMap> component drives all four panels.
  • Pure-Go voice path — IMBE (P25 Phase 1) and AMBE+2 (P25 Phase 2 / DMR) vocoders in Go, no DVSI / mbelib dependency. Per-call WAV + raw-frame sidecars; live PCM playback via direct ALSA / WASAPI / CoreAudio.
  • Pure-Go SDR drivers — RTL-SDR, HackRF, Airspy R2 / Mini, Airspy HF+ family. USB transport on Linux (USBDEVFS), Windows (WinUSB), macOS (IOKit). USB-disconnect self-healing recovers dongles that drop off the bus and re-enumerate without restarting the daemon. See docs/hardware.md.
  • Remote rtl_tcp SDRs — Mount any number of rtl_tcp endpoints as virtual tuners alongside local USB dongles. The SDR can live on a Raspberry Pi at the antenna while the daemon runs on a beefier host; one entry per remote in sdr.rtl_tcp.
  • Live spectrum / waterfall — In-browser FFT waterfall served off the same IQ stream the trunking decoder consumes. New internal/sdr/iqtap multi-consumer fan-out lets future trunking-adjacent decoders (paging, AIS, ADS-B, ...) tap the same source without disturbing CC decode. GET /api/v1/spectrum/devices
    • WS /api/v1/spectrum/stream; web panel under /spectrum.
  • CC Activity panel — focused web view of the trunked control- channel chatter (grants, affiliations, registrations, patches, talker aliases, CC lock / loss). Pure filter over the events stream with per-row payload rendering; web panel at /cc. RIDs in the feed are clickable chips that pivot into the per-radio detail view.
  • Radio IDs panel — per-radio (subscriber-unit) entity browser with the same shape as Talkgroups. Merges the operator-configured alias catalogue (per-system rid_alias_file CSV or JSON: alias, owner, tag, group, priority, lockout, watch) with the live affiliation tracker (last talkgroup, last seen, call count, decoded talker alias). Detail modal pulls the last 50 calls for the RID from the persisted call log. Web panel at /rids; REST at /api/v1/rids; gRPC RIDService. Talker-alias decoders cover the Motorola vendor TSBK form (control channel) and the Motorola voice-channel LCs (P25 Phase 1 LDU1 LCO 0x15 header
    • N × LCO 0x17 data blocks, run through Motorola's reverse-engineered alias cipher).
  • Constellation viewer — live IQ scatter visualization that taps the same broker the trunking decoder reads. Useful for identifying signal shape (PSK / QPSK / FSK / C4FM / AM / noise), spotting frequency offset, and checking demod / equalizer health. Decimated to 2 ksps for the wire; canvas scatter with energy banner. Web panel at /constellation.
  • Bookmarks / frequency manager — UI-managed conventional channel list (marine VHF, NOAA weather, FRS/GMRS, repeater outputs, public-safety fall-back channels) stored in the daemon's SQLite database. Edit / create / delete from the web panel under /bookmarks; REST at /api/v1/bookmarks.
  • One dongle, many carriersrole: wideband pins a single SDR to a centre frequency and runs an internal channelizer so one dongle decodes every DMR Tier II conventional repeater, DMR Tier III control channel, P25 Phase 1 control channel, AND P25 Phase 2 control channel that fit inside its IQ bandwidth (e.g. several 12.5 kHz carriers inside a 2.4 MHz IQ window). Mix protocols on the same dongle.
  • One dongle, control + voice — with voice_taps: N on a wideband entry, the daemon allocates per-grant DDC tuners from the dongle's IQ stream so trunked voice grants (DMR T3, P25 Phase 1, P25 Phase 2) decode inline on the same SDR that's already hosting the control channel — no separate role: voice dongle needed for grants inside the wideband window. Out-of- window grants spill over to a physical voice SDR when present. See docs/hardware.md and samples/dmr-tier2-multichannel/.
  • DSP — Polyphase channelizer, Kaiser / RRC / Gaussian FIRs, FM / C4FM / GFSK / FFSK / DQPSK / π/4-DQPSK / π/8-H-DQPSK demods, Mueller-Müller + Gardner clock recovery, LMS + CMA equalizers, diversity combining.
  • APIs — gRPC + HTTP/SSE + WebSocket; optional TLS + bearer-token auth on mutations; Prometheus /metrics; pure-Go SQLite call log; in-process pub/sub event bus.
  • Hamlib rigctld integration — optional TCP server speaking the standard Hamlib wire protocol so loggers, satellite trackers, and amateur-radio tooling (Cloudlog, GridTracker, PSTRotator, rigctl(1)) can read and set the control SDR's frequency. RX-only backend; see docs/rigctld.md.
  • Outbound call streaming — Broadcastify Calls, RdioScanner, OpenMHz, live Icecast / ShoutCast with pre-encoded silence keep-alive. Pure-Go MP3 encoder. See internal/broadcast.
  • Baseband recording + offline replay — Two-channel 16-bit WAV capture and a replay driver that mounts captures back into the SDR pool as virtual tuners. Looping replay simulates a continuous source.
  • Operator surfaces — Bubbletea TUI cockpit with 12 panels, pure-browser React SPA web console, runtime config editing via PATCH /api/v1/settings, RadioReference PDF / CSV importer with a config-builder wizard.
  • Location + affiliation — NMEA-0183 GGA / RMC over the air decoded into a SQLite location_log; protocol-agnostic affiliation tracker fed from grants / registrations / affiliation events.

For the full per-protocol FEC chain reference, receiver internals, frame layouts, and API routes, see docs/architecture.md and docs/opt-in-features.md.

Status snapshot

Once a grant event lands on the bus, the engine + recorder pipeline runs end-to-end: voice device is allocated, the composer pulls IQ → PCM, the recorder writes a WAV, the call is logged to SQLite, and the API + TUI surfaces all light up. Every trunked control modulation in the Features list has an end-to-end IQ → CC chain shipping. SDRtrunk-parity subsystems (outbound streaming, baseband recording, GPS / location, affiliation tracking, decoded-message log, per-talkgroup policy) all ship.

Remaining gaps:

  • Digital-voice composer chains. FM, DMR, P25 Phase 1 / 2 decode to audio. NXDN, dPMR, TETRA, YSF, D-STAR voice (plus EDACS ProVoice) are followed and logged but not yet turned into PCM.
  • Additional SDR validation. HackRF / Airspy / HF+ drivers exercise the documented USB vendor protocols under unit tests against a mock transport; on-air validation against attached hardware is the documented follow-up.
  • FEC inner-layer real-air validation. NXDN per-protocol interleaver and TETRA on-air recovery margins need live captures to characterise.
  • Vocoder level calibration awaits reference WAVs in internal/voice/{imbe,ambe2}/testdata/.

The long-form status, per-protocol detail, and shipping-vs-pending checklist live in docs/status.md. Near-term plans live in docs/roadmap.md. Released work lives in CHANGELOG.md.

Build from source

make dist     # SPA + daemon — single binary that serves the web console at /
make build    # Go-only — fast iteration; daemon shows a helpful 404 at / until bundled
make test     # go test -race ./...
make vet      # go vet ./...
make integration  # daemon end-to-end test (no SDR required)

The per-protocol "lights up" integration tests (make integration-cc-<proto>) and the DVSI hardware-backend tests (make test-dvsi) are documented in CONTRIBUTING.md.

A bare go build ./cmd/gophertrunk works too — the binary auto-stamps its version line from Go's built-in VCS info. Useful when attaching a log to an issue and you want the commit hash in the build-info line.

Docker

docker compose up -d
curl -s http://localhost:8080/api/v1/health
curl -s http://localhost:8080/metrics | grep gophertrunk_build_info

USB pass-through recipe and the operator hardening playbook (TLS, bearer-token auth, Prometheus catalogue, smoke tests) live in docs/hardening.md.

Documentation

Operator-facing docs live at gophertrunk.org (rendered from this docs/ tree):

Support the project

GopherTrunk is developed in the open and powered entirely by community support. If it's useful to you, please consider chipping in:

More ways to help: docs/support.md.

License

See LICENSE.

Directories

Path Synopsis
cmd
gophertrunk command
voice-calibrate command
Command voice-calibrate compares an in-tree Vocoder's PCM output against a reference WAV (DSD-FME, OP25, or similar) decoded from the same compressed-frame source.
Command voice-calibrate compares an in-tree Vocoder's PCM output against a reference WAV (DSD-FME, OP25, or similar) decoded from the same compressed-frame source.
internal
api
Package api exposes GopherTrunk's read + write control surface, the streaming events feed, and the gRPC mirror of the same state.
Package api exposes GopherTrunk's read + write control surface, the streaming events feed, and the gRPC mirror of the same state.
api/rigctld
Package rigctld implements a subset of Hamlib's rigctld TCP wire protocol so external amateur-radio tooling (Cloudlog, N1MM, GridTracker, PSTRotator, satellite trackers, logging programs) can read and set the frequency of one of GopherTrunk's SDRs over the network.
Package rigctld implements a subset of Hamlib's rigctld TCP wire protocol so external amateur-radio tooling (Cloudlog, N1MM, GridTracker, PSTRotator, satellite trackers, logging programs) can read and set the frequency of one of GopherTrunk's SDRs over the network.
broadcast
Package broadcast streams completed trunked-radio calls to external call aggregators — Broadcastify Calls, RdioScanner, OpenMHz — and to live Icecast/ShoutCast audio servers.
Package broadcast streams completed trunked-radio calls to external call aggregators — Broadcastify Calls, RdioScanner, OpenMHz — and to live Icecast/ShoutCast audio servers.
crypto/rc4
Package rc4 implements the RC4 stream cipher (also known as ARC4, "alleged RC4") as a keystream generator.
Package rc4 implements the RC4 stream cipher (also known as ARC4, "alleged RC4") as a keystream generator.
dsp
dsp/channelizer
Package channelizer implements an M-channel critically-sampled polyphase channelizer.
Package channelizer implements an M-channel critically-sampled polyphase channelizer.
dsp/demod
Package demod contains baseband demodulators that convert IQ streams into real-valued symbol streams (or audio, for FM).
Package demod contains baseband demodulators that convert IQ streams into real-valued symbol streams (or audio, for FM).
dsp/diag
Package diag provides developer/diagnostic helpers — IQ-sample decimation, energy + bandwidth estimation — that feed the web console's Constellation panel.
Package diag provides developer/diagnostic helpers — IQ-sample decimation, energy + bandwidth estimation — that feed the web console's Constellation panel.
dsp/diversity
Package diversity combines IQ streams from N receivers tuned to the same frequency into a single per-sample IQ stream that's stronger and less faded than any one source.
Package diversity combines IQ streams from N receivers tuned to the same frequency into a single per-sample IQ stream that's stronger and less faded than any one source.
dsp/equalizer
Package equalizer implements adaptive channel equalizers used to fight simulcast distortion — the inter-symbol interference produced when multiple transmitters cover the same frequency at slightly different arrival delays at the receiver.
Package equalizer implements adaptive channel equalizers used to fight simulcast distortion — the inter-symbol interference produced when multiple transmitters cover the same frequency at slightly different arrival delays at the receiver.
dsp/fft
Package fft provides a swappable FFT abstraction.
Package fft provides a swappable FFT abstraction.
dsp/filter
Package filter implements the FIR/CIC/halfband primitives used by the DSP pipeline.
Package filter implements the FIR/CIC/halfband primitives used by the DSP pipeline.
dsp/spectrum
Package spectrum produces frame-rate-limited windowed FFT magnitude frames from a stream of IQ chunks.
Package spectrum produces frame-rate-limited windowed FFT magnitude frames from a stream of IQ chunks.
dsp/sync
Package sync provides symbol-time recovery and frame sync correlators.
Package sync provides symbol-time recovery and frame sync correlators.
dsp/tuner
Package tuner extracts narrow-band baseband IQ for one or more frequency offsets from a single wide-band SDR IQ stream.
Package tuner extracts narrow-band baseband IQ for one or more frequency offsets from a single wide-band SDR IQ stream.
dsp/window
Package window provides standard window functions for FIR design and FFT pre-processing.
Package window provides standard window functions for FIR design and FFT pre-processing.
events
Package events implements an in-process pub/sub bus used by the engine to publish trunking events.
Package events implements an in-process pub/sub bus used by the engine to publish trunking events.
log
metrics
Package metrics exposes a Prometheus collector for GopherTrunk.
Package metrics exposes a Prometheus collector for GopherTrunk.
radio/adsb
Package adsb decodes Mode S extended-squitter messages transmitted by aircraft transponders on 1090 MHz.
Package adsb decodes Mode S extended-squitter messages transmitted by aircraft transponders on 1090 MHz.
radio/adsb/beast
Package beast implements a client for the BEAST binary protocol — the de-facto wire format dump1090, readsb, dump1090-fa, BeastSplitter, and every commercial ADS-B hub speak.
Package beast implements a client for the BEAST binary protocol — the de-facto wire format dump1090, readsb, dump1090-fa, BeastSplitter, and every commercial ADS-B hub speak.
radio/adsb/ppm
Package ppm is the native 1090 MHz Mode-S / ADS-B receiver: it demodulates the pulse-position-modulated downlink directly from an IQ stream, with no external dump1090 / readsb required.
Package ppm is the native 1090 MHz Mode-S / ADS-B receiver: it demodulates the pulse-position-modulated downlink directly from an IQ stream, with no external dump1090 / readsb required.
radio/ais
Package ais decodes the Automatic Identification System messages commercial vessels broadcast on marine VHF channels 87B / 88B (161.975 / 162.025 MHz).
Package ais decodes the Automatic Identification System messages commercial vessels broadcast on marine VHF channels 87B / 88B (161.975 / 162.025 MHz).
radio/ais/gmsk
Package gmsk wires the AIS DSP pipeline together: an IQ stream from the iqtap broker becomes 9600 Bd GMSK audio, then a pre-NRZI bit stream, then HDLC frame bodies, then AIS messages on the events bus.
Package gmsk wires the AIS DSP pipeline together: an IQ stream from the iqtap broker becomes 9600 Bd GMSK audio, then a pre-NRZI bit stream, then HDLC frame bodies, then AIS messages on the events bus.
radio/ais/receiver
Package receiver wires the AIS pipeline together: HDLC framer reads bits, validates the trailing CRC-CCITT, unpacks the payload bytes into the MSB-first bit slice the AIS message parser expects, and publishes one events.KindAISMessage per successfully-parsed message.
Package receiver wires the AIS pipeline together: HDLC framer reads bits, validates the trailing CRC-CCITT, unpacks the payload bytes into the MSB-first bit slice the AIS message parser expects, and publishes one events.KindAISMessage per successfully-parsed message.
radio/aprs
Package aprs decodes the APRS info-field payload that rides on top of AX.25 (the link layer in package aprs/ax25).
Package aprs decodes the APRS info-field payload that rides on top of AX.25 (the link layer in package aprs/ax25).
radio/aprs/afsk
Package afsk wires the APRS DSP pipeline together: an IQ stream from the iqtap broker becomes Bell-202 AFSK audio, then a pre-NRZI bit stream, then HDLC frame bodies, then APRS packets on the events bus.
Package afsk wires the APRS DSP pipeline together: an IQ stream from the iqtap broker becomes Bell-202 AFSK audio, then a pre-NRZI bit stream, then HDLC frame bodies, then APRS packets on the events bus.
radio/aprs/ax25
Package ax25 decodes the AX.25 link-layer frames APRS rides on top of.
Package ax25 decodes the AX.25 link-layer frames APRS rides on top of.
radio/aprs/hdlc
Package hdlc implements the High-level Data Link Control framing AX.25 (and therefore APRS) wraps its bytes in.
Package hdlc implements the High-level Data Link Control framing AX.25 (and therefore APRS) wraps its bytes in.
radio/aprs/receiver
Package receiver wires the APRS pipeline together: HDLC framer reads bits, hands frame bodies to the AX.25 parser, the APRS info-field decoder turns each parsed frame into a typed packet, and the receiver publishes one events.KindAPRSPacket per successfully-parsed UI frame.
Package receiver wires the APRS pipeline together: HDLC framer reads bits, hands frame bodies to the AX.25 parser, the APRS info-field decoder turns each parsed frame into a typed packet, and the receiver publishes one events.KindAPRSPacket per successfully-parsed UI frame.
radio/dmr
Package dmr decodes ETSI TS 102 361 (DMR) burst structure: sync patterns, slot-type fields, and Tier II / III control signaling.
Package dmr decodes ETSI TS 102 361 (DMR) burst structure: sync patterns, slot-type fields, and Tier II / III control signaling.
radio/dmr/receiver
Package receiver wires the IQ → C4FM dibit chain that feeds the DMR control-channel state machines (Tier II conventional + Tier III trunked).
Package receiver wires the IQ → C4FM dibit chain that feeds the DMR control-channel state machines (Tier II conventional + Tier III trunked).
radio/dmr/tier2
Package tier2 decodes DMR Tier II conventional traffic.
Package tier2 decodes DMR Tier II conventional traffic.
radio/dmr/tier3
Package tier3 decodes DMR Tier III (trunked-mode) Control Signaling Blocks.
Package tier3 decodes DMR Tier III (trunked-mode) Control Signaling Blocks.
radio/dmr/voice
Package voice decodes the DMR voice path: it recognises voice superframes in a dibit stream and extracts the AMBE+2 frames they carry.
Package voice decodes the DMR voice path: it recognises voice superframes in a dibit stream and extracts the AMBE+2 frames they carry.
radio/dpmr
Package dpmr decodes dPMR (digital PMR446 / ETSI TS 102 658) Mode 3 trunking signalling.
Package dpmr decodes dPMR (digital PMR446 / ETSI TS 102 658) Mode 3 trunking signalling.
radio/dpmr/receiver
Package receiver wires the IQ → C4FM dibit chain that feeds the dPMR Mode 3 control-channel state machine.
Package receiver wires the IQ → C4FM dibit chain that feeds the dPMR Mode 3 control-channel state machine.
radio/dsc
Package dsc decodes Digital Selective Calling messages transmitted on marine VHF channel 70 (156.525 MHz) and medium / high-frequency DSC channels (2.187.5 kHz, 8.414.5 kHz, etc.).
Package dsc decodes Digital Selective Calling messages transmitted on marine VHF channel 70 (156.525 MHz) and medium / high-frequency DSC channels (2.187.5 kHz, 8.414.5 kHz, etc.).
radio/dsc/ffsk
Package ffsk wires the DSC DSP pipeline together: an IQ stream from the iqtap broker becomes 1200-baud FFSK audio, then a direct-FSK bit stream, then decoded DSC sequences on the events bus.
Package ffsk wires the DSC DSP pipeline together: an IQ stream from the iqtap broker becomes 1200-baud FFSK audio, then a direct-FSK bit stream, then decoded DSC sequences on the events bus.
radio/dsc/receiver
Package receiver frames a demodulated DSC bit stream: it slides a 10-bit window through the bits, uses the BCH(10,7) syndrome check to lock onto the phasing-sequence DX characters (value 125, repeating every 20 bits), then samples the DX cadence to recover the 7-bit data symbols, detects the end-of-sequence character, and hands the symbol run to internal/radio/dsc.Decode.
Package receiver frames a demodulated DSC bit stream: it slides a 10-bit window through the bits, uses the BCH(10,7) syndrome check to lock onto the phasing-sequence DX characters (value 125, repeating every 20 bits), then samples the DX cadence to recover the 7-bit data symbols, detects the end-of-sequence character, and hands the symbol run to internal/radio/dsc.Decode.
radio/dstar
Package dstar decodes D-STAR (Digital Smart Technology for Amateur Radio) signalling per the JARL D-STAR specification, freely published by the Japanese Amateur Radio League.
Package dstar decodes D-STAR (Digital Smart Technology for Amateur Radio) signalling per the JARL D-STAR specification, freely published by the Japanese Amateur Radio League.
radio/dstar/receiver
Package receiver wires the IQ → GMSK bit chain that feeds the D-STAR repeater-channel state machine.
Package receiver wires the IQ → GMSK bit chain that feeds the D-STAR repeater-channel state machine.
radio/edacs
Package edacs decodes Enhanced Digital Access Communications System trunked control channels (also marketed as GE-Marc / Ericsson EDACS).
Package edacs decodes Enhanced Digital Access Communications System trunked control channels (also marketed as GE-Marc / Ericsson EDACS).
radio/edacs/receiver
Package receiver wires the IQ → GFSK bit chain that feeds the EDACS / GE-Marc control-channel state machine.
Package receiver wires the IQ → GFSK bit chain that feeds the EDACS / GE-Marc control-channel state machine.
radio/framing
Package framing provides the bit-level primitives shared across P25, DMR, and NXDN: bit packing, CRC, Hamming, Golay, and convolutional/Viterbi decoders.
Package framing provides the bit-level primitives shared across P25, DMR, and NXDN: bit packing, CRC, Hamming, Golay, and convolutional/Viterbi decoders.
radio/location
Package location decodes geographic positions reported over the air by trunked-radio subscriber units — P25 Motorola Unit GPS, L3Harris Talker GPS, and DMR LRRP all ultimately carry a latitude/longitude pair, and several (Tait CCDI, many MOTOTRBO GPS profiles) transport it as a verbatim NMEA-0183 sentence.
Package location decodes geographic positions reported over the air by trunked-radio subscriber units — P25 Motorola Unit GPS, L3Harris Talker GPS, and DMR LRRP all ultimately carry a latitude/longitude pair, and several (Tait CCDI, many MOTOTRBO GPS profiles) transport it as a verbatim NMEA-0183 sentence.
radio/ltr
Package ltr decodes Logic Trunked Radio (LTR) — the legacy distributed-trunking system invented by E.F. Johnson in the 1970s and still in deployment for utility / industrial fleets.
Package ltr decodes Logic Trunked Radio (LTR) — the legacy distributed-trunking system invented by E.F. Johnson in the 1970s and still in deployment for utility / industrial fleets.
radio/ltr/receiver
Package receiver wires the IQ → sub-audible bit chain that feeds the LTR per-repeater state machine.
Package receiver wires the IQ → sub-audible bit chain that feeds the LTR per-repeater state machine.
radio/m17
Package m17 decodes the link layer of the M17 digital voice/data protocol — an open, Codec2-based amateur mode (4FSK, 4800 sym/s).
Package m17 decodes the link layer of the M17 digital voice/data protocol — an open, Codec2-based amateur mode (4FSK, 4800 sym/s).
radio/m17/receiver
Package receiver wires the M17 link-layer decoder onto a live IQ stream from the iqtap broker.
Package receiver wires the M17 link-layer decoder onto a live IQ stream from the iqtap broker.
radio/mdc1200
Package mdc1200 decodes Motorola MDC1200 signaling bursts.
Package mdc1200 decodes Motorola MDC1200 signaling bursts.
radio/mdc1200/afsk
Package afsk wires the MDC1200 DSP pipeline together: an IQ stream from the iqtap broker becomes 1200-baud FFSK audio, then an NRZ bit stream, then framed MDC1200 bursts on the events bus.
Package afsk wires the MDC1200 DSP pipeline together: an IQ stream from the iqtap broker becomes 1200-baud FFSK audio, then an NRZ bit stream, then framed MDC1200 bursts on the events bus.
radio/mdc1200/receiver
Package receiver frames a demodulated MDC1200 bit stream: it hunts the 40-bit sync word, captures the 112-bit data block(s) that follow, hands each block to internal/radio/mdc1200 for decode, and publishes one events.KindMDC1200Message per burst.
Package receiver frames a demodulated MDC1200 bit stream: it hunts the 40-bit sync word, captures the 112-bit data block(s) that follow, hands each block to internal/radio/mdc1200 for decode, and publishes one events.KindMDC1200Message per burst.
radio/motorola
Package motorola decodes Motorola Type II / SmartZone trunked control channels.
Package motorola decodes Motorola Type II / SmartZone trunked control channels.
radio/motorola/receiver
Package receiver wires the IQ → MSK bit chain that feeds the Motorola Type II / SmartZone control-channel state machine.
Package receiver wires the IQ → MSK bit chain that feeds the Motorola Type II / SmartZone control-channel state machine.
radio/mpt1327
Package mpt1327 decodes MPT 1327 trunked control-channel signaling — the UK / Commonwealth utility trunking system standardised by the UK Department of Trade and Industry's Code of Practice MPT 1327 (1988).
Package mpt1327 decodes MPT 1327 trunked control-channel signaling — the UK / Commonwealth utility trunking system standardised by the UK Department of Trade and Industry's Code of Practice MPT 1327 (1988).
radio/mpt1327/receiver
Package receiver wires the IQ → FFSK bit chain that feeds the MPT 1327 control-channel state machine.
Package receiver wires the IQ → FFSK bit chain that feeds the MPT 1327 control-channel state machine.
radio/nxdn
Package nxdn decodes NXDN frame structure (TIA-102.AABG / NXDN technical specification rev 1.4).
Package nxdn decodes NXDN frame structure (TIA-102.AABG / NXDN technical specification rev 1.4).
radio/nxdn/receiver
Package receiver wires the IQ → C4FM dibit chain that feeds the NXDN control-channel state machine for the 9600-baud 4-FSK variant (the most common deployment; the 4800-baud BFSK variant uses a 2-level slicer and lives in a follow-up).
Package receiver wires the IQ → C4FM dibit chain that feeds the NXDN control-channel state machine for the 9600-baud 4-FSK variant (the most common deployment; the 4800-baud BFSK variant uses a 2-level slicer and lives in a follow-up).
radio/p25
Package p25 holds protocol-neutral helpers shared by the P25 Phase 1 and Phase 2 packages.
Package p25 holds protocol-neutral helpers shared by the P25 Phase 1 and Phase 2 packages.
radio/p25/phase1
Package phase1 decodes the P25 Phase 1 (C4FM, FDMA) frame structure.
Package phase1 decodes the P25 Phase 1 (C4FM, FDMA) frame structure.
radio/p25/phase1/receiver
Package receiver wires the IQ → dibit chain that feeds either the P25 Phase 1 LDU assembler (voice path) or the control-channel state machine (CC path) — or both at once.
Package receiver wires the IQ → dibit chain that feeds either the P25 Phase 1 LDU assembler (voice path) or the control-channel state machine (CC path) — or both at once.
radio/p25/phase2
Package phase2 decodes P25 Phase 2 traffic-channel framing per TIA-102.BBAB / BBAC.
Package phase2 decodes P25 Phase 2 traffic-channel framing per TIA-102.BBAB / BBAC.
radio/p25/phase2/receiver
Package receiver wires the IQ → H-DQPSK dibit chain that feeds the P25 Phase 2 control-channel state machine.
Package receiver wires the IQ → H-DQPSK dibit chain that feeds the P25 Phase 2 control-channel state machine.
radio/pager/flex
Package flex decodes Motorola FLEX paging — the high-throughput successor to POCSAG used by most modern paging networks (hospital / EMS dispatch, commercial carriers).
Package flex decodes Motorola FLEX paging — the high-throughput successor to POCSAG used by most modern paging networks (hospital / EMS dispatch, commercial carriers).
radio/pager/flex/receiver
Package receiver wires the FLEX protocol layer (sync acquisition, frame-info word, block de-interleaving, BCH, page assembly) onto a live IQ stream from the iqtap broker.
Package receiver wires the FLEX protocol layer (sync acquisition, frame-info word, block de-interleaving, BCH, page assembly) onto a live IQ stream from the iqtap broker.
radio/pager/pocsag
Package pocsag decodes POCSAG paging traffic — the dominant wireline FSK paging protocol used by fire / EMS dispatch (Knox tone-out boxes often forward POCSAG text to crews), commercial paging services (now mostly dead in NA but very alive in EU / JP / hospital paging), and amateur DAPNET.
Package pocsag decodes POCSAG paging traffic — the dominant wireline FSK paging protocol used by fire / EMS dispatch (Knox tone-out boxes often forward POCSAG text to crews), commercial paging services (now mostly dead in NA but very alive in EU / JP / hospital paging), and amateur DAPNET.
radio/pager/pocsag/receiver
Package receiver wires the POCSAG protocol layer (sync detection, codeword parsing, page assembly) onto a live IQ stream coming off the iqtap broker.
Package receiver wires the POCSAG protocol layer (sync detection, codeword parsing, page assembly) onto a live IQ stream coming off the iqtap broker.
radio/tetra
Package tetra decodes TETRA (Terrestrial Trunked Radio) Trunked- Mode Operation (TMO) signalling per ETSI EN 300 392-2.
Package tetra decodes TETRA (Terrestrial Trunked Radio) Trunked- Mode Operation (TMO) signalling per ETSI EN 300 392-2.
radio/tetra/receiver
Package receiver wires the IQ → π/4-DQPSK dibit chain that feeds the TETRA TMO control-channel state machine.
Package receiver wires the IQ → π/4-DQPSK dibit chain that feeds the TETRA TMO control-channel state machine.
radio/ysf
Package ysf decodes the wire format of Yaesu System Fusion, the amateur-radio digital mode.
Package ysf decodes the wire format of Yaesu System Fusion, the amateur-radio digital mode.
radio/ysf/receiver
Package receiver wires the IQ → C4FM dibit chain that feeds the YSF control-channel state machine.
Package receiver wires the IQ → C4FM dibit chain that feeds the YSF control-channel state machine.
scanner/ccdecoder
Package ccdecoder is the connector that closes the IQ → control- channel decoder gap listed in the README "Status & known gaps".
Package ccdecoder is the connector that closes the IQ → control- channel decoder gap listed in the README "Status & known gaps".
scanner/cchunt
Package cchunt is the multi-system control-channel scanner.
Package cchunt is the multi-system control-channel scanner.
scanner/conventional
Package conventional is the fixed-frequency analog FM scanner.
Package conventional is the fixed-frequency analog FM scanner.
scanner/widebandt2
Package widebandt2 monitors several trunked / conventional carriers with a single SDR dongle.
Package widebandt2 monitors several trunked / conventional carriers with a single SDR dongle.
sdr
Package sdr defines the abstract Device interface for IQ sources and the pool that supervises a fleet of dongles.
Package sdr defines the abstract Device interface for IQ sources and the pool that supervises a fleet of dongles.
sdr/airspy
Package airspy is a pure-Go driver for the Airspy R2 / Airspy Mini software-defined radios, implementing sdr.Driver and sdr.Device.
Package airspy is a pure-Go driver for the Airspy R2 / Airspy Mini software-defined radios, implementing sdr.Driver and sdr.Device.
sdr/airspyhf
Package airspyhf is a pure-Go driver for the Airspy HF+ family (Discovery, Dual Port, and the legacy HF+), implementing sdr.Driver and sdr.Device.
Package airspyhf is a pure-Go driver for the Airspy HF+ family (Discovery, Dual Port, and the legacy HF+), implementing sdr.Driver and sdr.Device.
sdr/baseband
Package baseband adds wideband IQ recording and offline replay to the SDR layer.
Package baseband adds wideband IQ recording and offline replay to the SDR layer.
sdr/hackrf
Package hackrf is a pure-Go driver for the Great Scott Gadgets HackRF One software-defined radio, implementing the sdr.Driver and sdr.Device interfaces.
Package hackrf is a pure-Go driver for the Great Scott Gadgets HackRF One software-defined radio, implementing the sdr.Driver and sdr.Device interfaces.
sdr/iqtap
Package iqtap fans an SDR's IQ stream out to additional observers without disturbing the primary consumer's StreamIQ contract.
Package iqtap fans an SDR's IQ stream out to additional observers without disturbing the primary consumer's StreamIQ contract.
sdr/rtlsdr/purego
Package purego is the pure-Go RTL-SDR driver — the sdr.Device / sdr.Driver implementation that composes the platform USB transport (internal/sdr/rtlsdr/usb), the RTL2832U register layer (internal/sdr/rtlsdr/rtl2832u), and the per-chip tuner drivers (internal/sdr/rtlsdr/tuners).
Package purego is the pure-Go RTL-SDR driver — the sdr.Device / sdr.Driver implementation that composes the platform USB transport (internal/sdr/rtlsdr/usb), the RTL2832U register layer (internal/sdr/rtlsdr/rtl2832u), and the per-chip tuner drivers (internal/sdr/rtlsdr/tuners).
sdr/rtlsdr/rtl2832u
Package rtl2832u is the pure-Go register / I2C-bridge layer that sits between the platform USB transport (internal/sdr/rtlsdr/usb) and the per-tuner drivers.
Package rtl2832u is the pure-Go register / I2C-bridge layer that sits between the platform USB transport (internal/sdr/rtlsdr/usb) and the per-tuner drivers.
sdr/rtlsdr/tuners
Package tuners houses the per-chip tuner drivers that sit between the RTL2832U register layer (internal/sdr/rtlsdr/rtl2832u) and the top-level [sdr.Device].
Package tuners houses the per-chip tuner drivers that sit between the RTL2832U register layer (internal/sdr/rtlsdr/rtl2832u) and the top-level [sdr.Device].
sdr/rtlsdr/usb
Package usb is the platform-abstraction layer that the pure-Go RTL-SDR driver speaks to.
Package usb is the platform-abstraction layer that the pure-Go RTL-SDR driver speaks to.
sdr/rtltcp
Package rtltcp implements an sdr.Driver that talks to a remote rtl_tcp server.
Package rtltcp implements an sdr.Driver that talks to a remote rtl_tcp server.
sdr/wbvoice
Package wbvoice puts P25 / DMR voice grants on the same SDR that's hosting a trunked control channel via the wideband channelizer.
Package wbvoice puts P25 / DMR voice grants on the same SDR that's hosting a trunked control channel via the wideband channelizer.
storage
ADS-B / aircraft log writer — drains KindAircraftReport events off the shared bus and writes one row per decoded Mode-S frame to the SQLite aircraft_log table.
ADS-B / aircraft log writer — drains KindAircraftReport events off the shared bus and writes one row per decoded Mode-S frame to the SQLite aircraft_log table.
trunking
Package trunking holds the cross-protocol orchestration: System definitions, control-channel hunting, talkgroup priority, voice grant following, and (later) multi-site neighbor tracking.
Package trunking holds the cross-protocol orchestration: System definitions, control-channel hunting, talkgroup priority, voice grant following, and (later) multi-site neighbor tracking.
tui
Package tui is the GopherTrunk TUI — a read-only operator view over the daemon's REST + SSE API.
Package tui is the GopherTrunk TUI — a read-only operator view over the daemon's REST + SSE API.
tui/client
Package client is the TUI's network layer.
Package client is the TUI's network layer.
tui/panels
Package panels contains the eight read-only panels rendered by the TUI.
Package panels contains the eight read-only panels rendered by the TUI.
tui/state
Package state holds the SharedState struct and PanelKind enum so the root tui package and panels sub-package can both import it without an import cycle.
Package state holds the SharedState struct and PanelKind enum so the root tui package and panels sub-package can both import it without an import cycle.
tui/theme
Package theme owns the TUI's semantic colour palette and the derived high-level lipgloss styles.
Package theme owns the TUI's semantic colour palette and the derived high-level lipgloss styles.
version
Package version exposes build metadata injected at link time via `go build -ldflags "-X ...Version=..." -ldflags "-X ...Commit=..." -ldflags "-X ...BuildTime=..."`.
Package version exposes build metadata injected at link time via `go build -ldflags "-X ...Version=..." -ldflags "-X ...Commit=..." -ldflags "-X ...BuildTime=..."`.
voice
Package voice provides the voice-decoding plumbing that sits between the trunking engine and the audio output / recording layer.
Package voice provides the voice-decoding plumbing that sits between the trunking engine and the audio output / recording layer.
voice/ambe2
Package ambe2 is the in-progress pure-Go AMBE+2 2400 bps voice decoder used by P25 Phase 2, DMR (Tier II / III), and NXDN voice frames.
Package ambe2 is the in-progress pure-Go AMBE+2 2400 bps voice decoder used by P25 Phase 2, DMR (Tier II / III), and NXDN voice frames.
voice/calibrate
Package calibrate compares an in-tree Vocoder's PCM output against a reference WAV (typically produced by DSD-FME or OP25) from the same raw vocoder-frame source.
Package calibrate compares an in-tree Vocoder's PCM output against a reference WAV (typically produced by DSD-FME or OP25) from the same raw vocoder-frame source.
voice/composer
Package composer bridges the trunking engine's CallStart events to the per-call demod chain that turns IQ samples on a freshly-tuned Voice device into 16-bit PCM the recorder can write.
Package composer bridges the trunking engine's CallStart events to the per-call demod chain that turns IQ samples on a freshly-tuned Voice device into 16-bit PCM the recorder can write.
voice/dvsi
Package dvsi implements the DVSI USB-3000 / AMBE-3003 hardware vocoder backend.
Package dvsi implements the DVSI USB-3000 / AMBE-3003 hardware vocoder backend.
voice/imbe
Package imbe is the pure-Go IMBE 4400 bps voice decoder used by P25 Phase 1 LDU1 / LDU2 frames.
Package imbe is the pure-Go IMBE 4400 bps voice decoder used by P25 Phase 1 LDU1 / LDU2 frames.
voice/mbe
Package mbe is the shared Multi-Band Excitation synthesis core used by GopherTrunk's IMBE 4400 (P25 Phase 1) and AMBE+2 2400 (P25 Phase 2 / DMR / NXDN) decoders.
Package mbe is the shared Multi-Band Excitation synthesis core used by GopherTrunk's IMBE 4400 (P25 Phase 1) and AMBE+2 2400 (P25 Phase 2 / DMR / NXDN) decoders.
voice/mp3
Package mp3 provides a pure-Go MP3 encoder used to compress completed call audio before it is streamed to broadcast aggregators (Broadcastify Calls, RdioScanner, OpenMHz, Icecast).
Package mp3 provides a pure-Go MP3 encoder used to compress completed call audio before it is streamed to broadcast aggregators (Broadcastify Calls, RdioScanner, OpenMHz, Icecast).
voice/player
Package player is the live-audio sink that turns int16 PCM coming out of the per-call composer / conventional scanner into sound out of the host's speakers.
Package player is the live-audio sink that turns int16 PCM coming out of the per-call composer / conventional scanner into sound out of the host's speakers.
voice/toneout
Package toneout detects fire/EMS paging tones — Two-Tone Sequential (Motorola Quick Call II), single-tone, and DTMF — over the PCM stream produced by the voice composer, and emits events.KindToneAlert when a configured profile matches.
Package toneout detects fire/EMS paging tones — Two-Tone Sequential (Motorola Quick Call II), single-tone, and DTMF — over the PCM stream produced by the voice composer, and emits events.KindToneAlert when a configured profile matches.
samples
cmd/audio_smoketest command
Audio-to-bits smoke-test harness for the MPT 1327 control channel.
Audio-to-bits smoke-test harness for the MPT 1327 control channel.
Package web embeds the built SPA so the daemon binary can serve the operator console without a sibling `gophertrunk-web/` directory.
Package web embeds the built SPA so the daemon binary can serve the operator console without a sibling `gophertrunk-web/` directory.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL