GopherTrunk

module
v0.7.0 Latest Latest
Warning

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

Go to latest
Published: Jul 14, 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.

New to radio or SDR? Start with the Learn RF & SDR path — a free, structured course that takes you from "what is a radio wave?" to decoding digital trunked systems with GopherTrunk, one short lesson at a time.

Quick start

# Linux x86_64 — see https://gophertrunk.org/downloads.html for macOS, Windows, ARM64.
VERSION=v0.6.4
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.
  • Remote SoapySDRServer SDRs — Mount professional / high-bit-depth hardware (USRP, LimeSDR, bladeRF, HackRF, Airspy, SDRplay, …) over the network via the SoapyRemote protocol, in pure Go with no CGO. Carries 16/32-bit IQ with native frequency / sample-rate / gain control; one entry per remote in sdr.soapy_remote. See docs/hardware.md.
  • 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.
  • Symbol scope — live oscilloscope of the demodulated symbol stream (OP25's "Symbol" plot): the pre-slicer soft waveform for P25 C4FM and the sliced dibit decisions for CQPSK, driven off the production receiver. Shares the constellation's offset / Hold / follow-active-call controls. Web panel at /symbols; offline view in SigLab. See docs/symbol-scope.md.
  • 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. DMR Tier III is 2-slot TDMA, so a single carrier can run two simultaneous calls — TS1 and TS2 are tracked, recorded (with a _ts1 / _ts2 filename suffix), and logged as distinct calls, each binding its own voice tap. 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.
  • Site/system huntinggophertrunk hunt maps a previously undocumented trunked system from one or more control-channel IQ captures: auto-identifies the protocol, accumulates identity (P25 NAC / WACN / SYSID / RFSS / Site, and per-protocol ids), per-site control channels and observed talkgroups, then exports a GopherTrunk import bundle, a trunk-recorder config stanza, and a ready-to-paste RadioReference submission package — with an optional read-only RadioReference duplicate check so you don't submit a system that already exists. See docs/hunt.md.
  • 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.
  • DMR 2-slot interleaved voice + embedded-LC labelling. Both timeslots of a carrier are tracked, recorded, and logged as separate calls; a stride-2 interleaved superframe decoder (voice.NewInterleavedDecoder) separates the two slots and reassembles each slot's embedded Link Control (EMB → variable BPTC(128,72) → talkgroup/source) so a slot is routed to its call by talkgroup. The whole path is wired through the voice composer behind a per-system opt-in (dmr_interleaved_voice: true) and unit-tested end-to-end against synthetic modulated IQ. Each slot's calls are visible per-timeslot in the TUI / web active-call views and in the gophertrunk_dmr_voice_calls_total{system,timeslot} metric. It defaults off: confirming the exact on-air dibit cadence (CACH/guard) and the ETSI embedded-signalling interleave / EMB FEC / CRC against a real IQ capture is what's needed before it becomes the production default — see docs/status.md.
  • 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
encodetest command
Command encodetest encodes a 16-bit PCM mono WAV file to MP3 using the same internal/voice/mp3 path the broadcast backends use, writing the result to a file.
Command encodetest encodes a 16-bit PCM mono WAV file to MP3 using the same internal/voice/mp3 path the broadcast backends use, writing the result to a file.
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.
autotune
Package autotune tracks the per-dongle carrier-frequency error of an SDR source and turns it into a digital tuning correction, ported in concept from trunk-recorder's AutotuneManager (trunk-recorder/autotune.cc).
Package autotune tracks the per-dongle carrier-frequency error of an SDR source and turns it into a digital tuning correction, ported in concept from trunk-recorder's AutotuneManager (trunk-recorder/autotune.cc).
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.
carriers
Package carriers holds protocol-neutral carrier-discovery primitives: finding candidate carriers in a power spectrum and snapping them onto the standard land-mobile channel rasters.
Package carriers holds protocol-neutral carrier-discovery primitives: finding candidate carriers in a power spectrum and snapping them onto the standard land-mobile channel rasters.
configbuilder
Package configbuilder holds the HTTP-free core shared by the web Config Builder (internal/api) and the terminal Config Builder (internal/configtui): talkgroup CSV sidecar IO, the RadioReference→config projection, the canonical section list + validation-error section bucketing, frequency formatting, and the AdvancedJSON field allow-list.
Package configbuilder holds the HTTP-free core shared by the web Config Builder (internal/api) and the terminal Config Builder (internal/configtui): talkgroup CSV sidecar IO, the RadioReference→config projection, the canonical section list + validation-error section bucketing, frequency formatting, and the AdvancedJSON field allow-list.
configtui
Package configtui is a standalone Bubble Tea terminal Config Builder/Editor that mirrors the web Config Builder (web/configbuilder).
Package configtui is a standalone Bubble Tea terminal Config Builder/Editor that mirrors the web Config Builder (web/configbuilder).
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.
cryptolab
Package cryptolab is GopherTrunk's optional cryptographic-research toolkit: a set of byte-oriented analysis and brute-force tools for the kinds of obfuscation and weak/keyless ciphers found in RF traffic.
Package cryptolab is GopherTrunk's optional cryptographic-research toolkit: a set of byte-oriented analysis and brute-force tools for the kinds of obfuscation and weak/keyless ciphers found in RF traffic.
cryptolab/engine/assess
Package assess is a cryptographic security-test harness for captured RF ciphertext.
Package assess is a cryptographic security-test harness for captured RF ciphertext.
cryptolab/engine/brute
Package brute is the toolkit's generic keyspace brute-force engine: pluggable Cipher, KeySpace, and Scorer interfaces driving an ordered, resumable sweep that keeps the top-scoring candidates.
Package brute is the toolkit's generic keyspace brute-force engine: pluggable Cipher, KeySpace, and Scorer interfaces driving an ordered, resumable sweep that keeps the top-scoring candidates.
cryptolab/engine/cipherinfo
Package cipherinfo is a knowledge base of the link-layer encryption algorithms used across the trunking protocols GopherTrunk decodes (P25, TETRA, DMR) and their published cryptographic weaknesses.
Package cipherinfo is a knowledge base of the link-layer encryption algorithms used across the trunking protocols GopherTrunk decodes (P25, TETRA, DMR) and their published cryptographic weaknesses.
cryptolab/engine/crc
Package crc provides parameterized CRC computation and recovery of CRC parameters from sample (data, crc) frames — the kind of task that comes up identifying the framing/FEC check on an unfamiliar RF protocol.
Package crc provides parameterized CRC computation and recovery of CRC parameters from sample (data, crc) frames — the kind of task that comes up identifying the framing/FEC check on an unfamiliar RF protocol.
cryptolab/engine/dmrcrypto
Package dmrcrypto generates the keystreams DMR's link-layer privacy algorithms produce, so the assessment harness and recipe pipeline can attempt DMR decryption the same way p25crypto handles P25.
Package dmrcrypto generates the keystreams DMR's link-layer privacy algorithms produce, so the assessment harness and recipe pipeline can attempt DMR decryption the same way p25crypto handles P25.
cryptolab/engine/extcipher
Package extcipher bridges to an external, operator-supplied cipher program so the toolkit can decrypt and brute-force ciphers it does not (and should not) bundle itself — most importantly TETRA TEA1, whose only public implementations are licence-incompatible (AGPL) with this Apache-2.0 project and which must not be re-authored unverified inside a security-test tool.
Package extcipher bridges to an external, operator-supplied cipher program so the toolkit can decrypt and brute-force ciphers it does not (and should not) bundle itself — most importantly TETRA TEA1, whose only public implementations are licence-incompatible (AGPL) with this Apache-2.0 project and which must not be re-authored unverified inside a security-test tool.
cryptolab/engine/fit
Package fit holds closed-form byte-function fitters over Z/256: given observed (input → output) byte pairs, find the affine coefficients that best explain them and report how many observations conflict.
Package fit holds closed-form byte-function fitters over Z/256: given observed (input → output) byte pairs, find the affine coefficients that best explain them and report how many observations conflict.
cryptolab/engine/gauge
Package gauge models the global affine gauge ambiguity that shows up when a byte-oriented obfuscator's state is recovered from output only: the recovered high byte and multiplier are pinned just up to an affine change of coordinates (Mg·x + Cg with Mg odd, hence invertible mod 256).
Package gauge models the global affine gauge ambiguity that shows up when a byte-oriented obfuscator's state is recovered from output only: the recovered high byte and multiplier are pinned just up to an affine change of coordinates (Mg·x + Cg with Mg odd, hence invertible mod 256).
cryptolab/engine/keystream
Package keystream implements keystream-reuse / many-time-pad analysis — the real-world break against additive stream ciphers (P25 DES-OFB and ADP/RC4, TETRA AIE) when a transmitter reuses an initialisation vector.
Package keystream implements keystream-reuse / many-time-pad analysis — the real-world break against additive stream ciphers (P25 DES-OFB and ADP/RC4, TETRA AIE) when a transmitter reuses an initialisation vector.
cryptolab/engine/lang
Package lang holds a small embedded English language model used to score candidate plaintexts during cipher solving (e.g.
Package lang holds a small embedded English language model used to score candidate plaintexts during cipher solving (e.g.
cryptolab/engine/lfsr
Package lfsr provides stream-cipher / LFSR analysis primitives relevant to RF scramblers and keystream study: Berlekamp–Massey recovery of the shortest LFSR that produces an observed bit sequence, Fibonacci-LFSR generation, and known-plaintext keystream extraction.
Package lfsr provides stream-cipher / LFSR analysis primitives relevant to RF scramblers and keystream study: Berlekamp–Massey recovery of the shortest LFSR that produces an observed bit sequence, Fibonacci-LFSR generation, and known-plaintext keystream extraction.
cryptolab/engine/p25crypto
Package p25crypto generates the keystreams P25's link-layer encryption algorithms produce from a key and a Message Indicator (IV).
Package p25crypto generates the keystreams P25's link-layer encryption algorithms produce from a key and a Message Indicator (IV).
cryptolab/engine/propagate
Package propagate is the toolkit's fast constraint propagator for the "is the next state a table lookup of some combined index?" family of hypotheses.
Package propagate is the toolkit's fast constraint propagator for the "is the next state a table lookup of some combined index?" family of hypotheses.
cryptolab/engine/randomness
Package randomness implements a battery of statistical randomness tests drawn from NIST SP 800-22 (the "STS" suite), specialised for the question an RF analyst actually asks of a captured payload or a recovered keystream: is this stream indistinguishable from random (strong keyed encryption — no weak structure to exploit), or does it carry exploitable structure (a keyless scrambler, a short LFSR, a biased generator)?
Package randomness implements a battery of statistical randomness tests drawn from NIST SP 800-22 (the "STS" suite), specialised for the question an RF analyst actually asks of a captured payload or a recovered keystream: is this stream indistinguishable from random (strong keyed encryption — no weak structure to exploit), or does it carry exploitable structure (a keyless scrambler, a short LFSR, a biased generator)?
cryptolab/engine/recipe
Package recipe is a CyberChef-style operation pipeline for RF payloads.
Package recipe is a CyberChef-style operation pipeline for RF payloads.
cryptolab/engine/stats
Package stats holds the cipher-agnostic statistical primitives the toolkit uses to triage a captured payload: is it plaintext, a weak classical cipher, an obfuscation, or strong encryption? Plus the repeating-key-XOR key-length estimators (Friedman/Hamming) and a crib-dragging helper for many-time-pad / keystream-reuse analysis.
Package stats holds the cipher-agnostic statistical primitives the toolkit uses to triage a captured payload: is it plaintext, a weak classical cipher, an obfuscation, or strong encryption? Plus the repeating-key-XOR key-length estimators (Friedman/Hamming) and a crib-dragging helper for many-time-pad / keystream-reuse analysis.
cryptolab/engine/subst
Package subst solves monoalphabetic substitution ciphers by hill-climbing over the 26! key space, scored by an embedded English n-gram model.
Package subst solves monoalphabetic substitution ciphers by hill-climbing over the 26! key space, scored by an embedded English n-gram model.
cryptolab/engine/voice
Package voice provides analog voice-privacy descramblers — the keyless / weak-key spectral schemes still found on RF voice channels.
Package voice provides analog voice-privacy descramblers — the keyless / weak-key spectral schemes still found on RF voice channels.
cryptolab/progress
Package progress provides the shared progress-logging and resumable checkpoint helpers used by every cryptolab tool: throttled structured logging for high-volume search loops, an append-only JSONL survivor log, and an atomically-written JSON checkpoint so multi-hour runs survive a kill and resume where they left off.
Package progress provides the shared progress-logging and resumable checkpoint helpers used by every cryptolab tool: throttled structured logging for high-volume search loops, an append-only JSONL survivor log, and an atomically-written JSON checkpoint so multi-hour runs survive a kill and resume where they left off.
cryptolab/subjects/motorola
Package motorola implements a cryptolab subject for a length-seeded, keyless, byte-oriented alias obfuscator: the output substitution table and the per-character decode equation are established, while the per-character state update is not.
Package motorola implements a cryptolab subject for a length-seeded, keyless, byte-oriented alias obfuscator: the output substitution table and the per-character decode equation are established, while the per-character state update is not.
cryptolab/subjects/nxdn
Package nxdn is a cryptolab subject: it descrambles NXDN's optional 15-bit scrambler and brute-forces the scrambling key.
Package nxdn is a cryptolab subject: it descrambles NXDN's optional 15-bit scrambler and brute-forces the scrambling key.
cryptolab/tools
Package tools registers the generic (cipher-agnostic) cryptolab tools — statistical triage, keyspace brute force, LFSR/keystream analysis, CRC parameter recovery, and analog voice descrambling — into the cryptolab registry.
Package tools registers the generic (cipher-agnostic) cryptolab tools — statistical triage, keyspace brute force, LFSR/keystream analysis, CRC parameter recovery, and analog voice descrambling — into the cryptolab registry.
cryptolab/webserver
Package webserver is the optional cryptolab web console backend: a self-contained HTTP server that stages uploaded files, runs a selected cryptolab tool/mode with form-supplied settings, streams progress, and returns the structured Result and any artifacts.
Package webserver is the optional cryptolab web console backend: a self-contained HTTP server that stages uploaded files, runs a selected cryptolab tool/mode with form-supplied settings, streams progress, and returns the structured Result and any artifacts.
diag
Package diag produces the diagnostic banner and verbose error traces that GopherTrunk prepends to every error surface (CLI, daemon log, HTTP/gRPC API, web UI).
Package diag produces the diagnostic banner and verbose error traces that GopherTrunk prepends to every error surface (CLI, daemon log, HTTP/gRPC API, web UI).
dsp
dsp/blind
Package blind estimates the symbol/baud rate and a coarse modulation class of an unknown carrier directly from its channelized IQ, with no protocol decoder.
Package blind estimates the symbol/baud rate and a coarse modulation class of an unknown carrier directly from its channelized IQ, with no protocol decoder.
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/iqpower
Package iqpower holds the small, reusable IQ signal-level helpers shared by the decode engines for operator-facing diagnostics: a window-averaged dBFS power measure plus the "looks dead" threshold.
Package iqpower holds the small, reusable IQ signal-level helpers shared by the decode engines for operator-facing diagnostics: a window-averaged dBFS power measure plus the "looks dead" threshold.
dsp/loudness
Package loudness implements ITU-R BS.1770-4 / EBU R128 integrated loudness measurement and the gain math used for per-call loudness normalization.
Package loudness implements ITU-R BS.1770-4 / EBU R128 integrated loudness measurement and the gain math used for per-call loudness normalization.
dsp/phase
Package phase holds the small phase-domain helpers the rotation analyses use — the native Go equivalents of numpy.unwrap and the per-symbol differential phase that makes a π/4-DQPSK constellation's rotation visible.
Package phase holds the small phase-domain helpers the rotation analyses use — the native Go equivalents of numpy.unwrap and the per-symbol differential phase that makes a π/4-DQPSK constellation's rotation visible.
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/stats
Package stats provides small, dependency-free numerical helpers — the descriptive statistics, histogram, mode, argmax, normalized cross-correlation and peak-finding that the signal-analysis paths reach for.
Package stats provides small, dependency-free numerical helpers — the descriptive statistics, histogram, mode, argmax, normalized cross-correlation and peak-finding that the signal-analysis paths reach for.
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.
hunt
Package hunt is GopherTrunk's site/system "hunting" layer: it turns the output of the signal-lab decoders into a DiscoveredSystem — a structured map of a trunked radio system observed off the air (or from a capture) — and exports that map to standardized files plus a RadioReference.com submission package.
Package hunt is GopherTrunk's site/system "hunting" layer: it turns the output of the signal-lab decoders into a DiscoveredSystem — a structured map of a trunked radio system observed off the air (or from a capture) — and exports that map to standardized files plus a RadioReference.com submission package.
huntrr
Package huntrr cross-references a discovered trunked system against RadioReference: duplicate-system hints plus a frequency/talkgroup diff (offsets and items not yet in RR).
Package huntrr cross-references a discovered trunked system against RadioReference: duplicate-system hints plus a frequency/talkgroup diff (offsets and items not yet in RR).
log
metrics
Package metrics exposes a Prometheus collector for GopherTrunk.
Package metrics exposes a Prometheus collector for GopherTrunk.
pathutil
Package pathutil holds filesystem-path helpers shared across the daemon without pulling in any other internal package, so packages like internal/config and internal/configbuilder can both depend on it without an import cycle.
Package pathutil holds filesystem-path helpers shared across the daemon without pulling in any other internal package, so packages like internal/config and internal/configbuilder can both depend on it without an import cycle.
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/lora
Package lora implements a pure-Go LoRa (Semtech CSS) physical-layer modem: chirp synthesis, dechirp/FFT demodulation, the symbol -> bit forward-error-correction chain (Gray, diagonal interleaver, Hamming, whitening, CRC), an explicit-header codec, and a matching modulator used to synthesise test IQ.
Package lora implements a pure-Go LoRa (Semtech CSS) physical-layer modem: chirp synthesis, dechirp/FFT demodulation, the symbol -> bit forward-error-correction chain (Gray, diagonal interleaver, Hamming, whitening, CRC), an explicit-header codec, and a matching modulator used to synthesise test IQ.
radio/lora/lorawan
Package lorawan parses the LoRaWAN MAC layer carried in a decoded LoRa PHY payload and, when the operator supplies the device session keys, verifies the message integrity code and decrypts the frame payload.
Package lorawan parses the LoRaWAN MAC layer carried in a decoded LoRa PHY payload and, when the operator supplies the device session keys, verifies the message integrity code and decrypts the frame payload.
radio/lora/receiver
Package receiver wires the LoRa PHY decoder onto a live wide-band IQ stream.
Package receiver wires the LoRa PHY decoder onto a live wide-band IQ stream.
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/motorola
Package motorola holds the Motorola proprietary talker-alias decode shared by the P25 Phase 1 (voice-channel / TDULC link control) and Phase 2 (FACCH-S MAC) paths.
Package motorola holds the Motorola proprietary talker-alias decode shared by the P25 Phase 1 (voice-channel / TDULC link control) and Phase 2 (FACCH-S MAC) paths.
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/metrics
Package metrics measures P25 Phase 1 demodulator quality.
Package metrics measures P25 Phase 1 demodulator quality.
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/phase1/refcompare
Package refcompare cross-checks GopherTrunk's P25 Phase 1 decode against an external reference decoder (OP25 / DSD-FME) run on the *same* IQ capture.
Package refcompare cross-checks GopherTrunk's P25 Phase 1 decode against an external reference decoder (OP25 / DSD-FME) run on the *same* IQ capture.
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.
radioreference
Package radioreference is a read-only client for RadioReference.com's SOAP web service, used by `gophertrunk hunt` to check whether a discovered trunked system already exists in RadioReference before an operator submits it.
Package radioreference is a read-only client for RadioReference.com's SOAP web service, used by `gophertrunk hunt` to check whether a discovered trunked system already exists in RadioReference before an operator submits it.
rfscope
Package rfscope is protocol-agnostic RF network analysis — "Wireshark for the RF physical layer".
Package rfscope is protocol-agnostic RF network analysis — "Wireshark for the RF physical layer".
rfscope/webserver
Package webserver is the optional rfscope web console backend: a self-contained HTTP server that stages an uploaded IQ capture, runs the rfscope segmentation + analyzers over it, and returns the structured Scene (plus a cryptolab `ks` frames file for any unknown payloads).
Package webserver is the optional rfscope web console backend: a self-contained HTTP server that stages an uploaded IQ capture, runs the rfscope segmentation + analyzers over it, and returns the structured Scene (plus a cryptolab `ks` frames file for any unknown payloads).
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/dmrlcn
Package dmrlcn implements DMR Tier III trunk autoconfiguration: it learns the LCN→downlink-frequency band plan of a trunked system from observed voice grants (which carry only a Logical Channel Number) and the RF carriers that key up in response, then hot-swaps the learned plan into the running control channel.
Package dmrlcn implements DMR Tier III trunk autoconfiguration: it learns the LCN→downlink-frequency band plan of a trunked system from observed voice grants (which carry only a Logical Channel Number) and the RF carriers that key up in response, then hot-swaps the learned plan into the running control channel.
scanner/symbolscope
Package symbolscope recovers a live stream of demodulated symbols (the pre-slicer soft waveform plus the sliced dibit decisions) from a wideband IQ feed, for the web console's "Symbol" scope — GopherTrunk's take on OP25's Symbol plot.
Package symbolscope recovers a live stream of demodulated symbols (the pre-slicer soft waveform plus the sliced dibit decisions) from a wideband IQ feed, for the web console's "Symbol" scope — GopherTrunk's take on OP25's Symbol plot.
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/ka9qradio
Package ka9qradio implements an sdr.Driver that consumes a channel from a remote ka9q-radio `radiod` instance over IP multicast, in pure Go with no CGO.
Package ka9qradio implements an sdr.Driver that consumes a channel from a remote ka9q-radio `radiod` instance over IP multicast, in pure Go with no CGO.
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/soapyremote
Package soapyremote implements an sdr.Driver that talks to a remote SoapySDRServer (from pothosware/SoapyRemote) in pure Go, with no CGO and no SoapySDR C libraries.
Package soapyremote implements an sdr.Driver that talks to a remote SoapySDRServer (from pothosware/SoapyRemote) in pure Go, with no CGO and no SoapySDR C libraries.
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.
sigfollow
Package sigfollow decodes the MAC signalling that rides a P25 Phase 2 traffic channel — talker alias, in-call source / encryption — off the channel's signalling stream, independent of whether a voice tuner is recording the call.
Package sigfollow decodes the MAC signalling that rides a P25 Phase 2 traffic channel — talker alias, in-call source / encryption — off the channel's signalling stream, independent of whether a voice tuner is recording the call.
siglab
Package siglab is the offline signal replay / testing / analysis core shared by the gophertrunk replay, analyze, gen, test and siglab-TUI subcommands.
Package siglab is the offline signal replay / testing / analysis core shared by the gophertrunk replay, analyze, gen, test and siglab-TUI subcommands.
siglab/sigref
Package sigref is SigLab's offline signal-identification reference database — a small, curated catalog (Artemis / sigidwiki in spirit) that names a carrier by its band, bandwidth, modulation, and symbol rate even when no decoder locks.
Package sigref is SigLab's offline signal-identification reference database — a small, curated catalog (Artemis / sigidwiki in spirit) that names a carrier by its band, bandwidth, modulation, and symbol rate even when no decoder locks.
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.
survey
Package survey turns a detected carrier into a classified signal.
Package survey turns a detected carrier into a classified signal.
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/cryptocap
Package cryptocap is the bridge from GopherTrunk's live decoders to the offline cryptolab toolkit.
Package cryptocap is the bridge from GopherTrunk's live decoders to the offline cryptolab toolkit.
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.
web
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.
configbuilder
Package configbuilderweb embeds the built standalone Config Builder SPA so the gophertrunk binary can serve the web config editor (via `gophertrunk config serve`, and from the daemon at /config/) without a sibling source tree.
Package configbuilderweb embeds the built standalone Config Builder SPA so the gophertrunk binary can serve the web config editor (via `gophertrunk config serve`, and from the daemon at /config/) without a sibling source tree.
cryptolab
Package cryptolabweb embeds the built standalone Crypto Lab SPA so the gophertrunk binary can serve the cryptolab web console (via `gophertrunk cryptolab serve`) without a sibling source tree.
Package cryptolabweb embeds the built standalone Crypto Lab SPA so the gophertrunk binary can serve the cryptolab web console (via `gophertrunk cryptolab serve`) without a sibling source tree.
rfscope
Package rfscopeweb embeds the built standalone RF Scope SPA so the gophertrunk binary can serve the offline RF-analysis console (via `gophertrunk rfscope serve`) without a sibling source tree.
Package rfscopeweb embeds the built standalone RF Scope SPA so the gophertrunk binary can serve the offline RF-analysis console (via `gophertrunk rfscope serve`) without a sibling source tree.
siglab
Package siglabweb embeds the built standalone Signal Lab SPA so the gophertrunk binary can serve the offline signal-analysis console (via `gophertrunk siglab serve`, and from the daemon) without a sibling source tree.
Package siglabweb embeds the built standalone Signal Lab SPA so the gophertrunk binary can serve the offline signal-analysis console (via `gophertrunk siglab serve`, and from the daemon) without a sibling source tree.

Jump to

Keyboard shortcuts

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