The Hunt is a 14-part deep dive into the part of GopherTrunk that finds systems you didn’t know were there. Where the Trunking Engine series started from a known control channel and turned its grants into calls, this series starts one step earlier — from a blank band — and works forward: sweep the spectrum, pull carriers out of the noise, classify what each one is, lock a control channel, reconstruct a system’s channel map and its sites, harvest the aliases riding on its traffic, and export the whole find so someone else can tune it in seconds.
It is the detective arc. Where Signal Lab taught you to name the unknown from a single capture on a workbench, The Hunt does it live and at band scale — the same measurements, driving a search. One thread runs the length of the series: a stray carrier that shows up in a routine survey, and everything it takes to turn it into a named, mapped, exportable system.
Every post reads three ways: a TL;DR + cheat-sheet for skimmers, bold headers, tables, and diagrams for the medium read, and full prose with real code for the deep read.
New here? Start with the Digital Trunking module for how a trunked system is laid out, then come back for how GopherTrunk finds one.<ol class="post-list series-list"><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 1: What Discovery Means — From a Blank Band to a Known System</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk turns an empty stretch of spectrum into a named, mapped trunked system — the sweep, identify, and map pipeline behind the hunt engine, and the one discovery contract that the CLI, the daemon, and the web cockpit all drive.</p></li><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 2: The Wideband Sweep Engine</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk steps a wide SDR receiver across megahertz of spectrum, estimates a power spectrum from short IQ grabs, and stitches overlapping tiles into one occupancy picture without dropping a carrier at a step boundary.</p></li><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 3: Peaks & Occupancy — Finding Carriers in the Noise</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk estimates a robust noise floor, picks true carrier peaks without triple-counting one emitter, snaps them onto the land-mobile channel raster, and separates narrow carriers from wide OFDM plateaus in one spectrum frame.</p></li><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 4: Classifying a Signal — Analog, Digital, Encrypted</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk cheaply classifies a bare carrier into analog, digital, paging, or encrypted using envelope, discriminator, and cyclostationary features before spending an expensive protocol identify, and how the encryption triage tells structured traffic from random.</p></li><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 5: Autogain & Autotune — Settling the Front End</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk sweeps front-end gain to minimize the decode error rate before committing to a control channel, and how a running-average autotune corrects each dongle’s crystal offset so a decoder’s carrier loop starts already near lock.</p></li><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 6: Control-Channel Hunting — The Supervisor</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk’s cchunt supervisor multiplexes per-system control-channel hunts over one shared SDR, dwelling on candidates, parking on locks, backing off failures exponentially, and publishing HuntProgress so the cockpit can watch every system at once.</p></li><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 7: Locking a P25 System — Candidate to Confirmed</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk turns a locked P25 control channel into a confirmed DiscoveredSystem — folding WACN and System ID into an identity, recovering the IDEN_UP band plan, resolving neighbour frequencies, and honestly reporting when the NSB that carries the WACN never decoded.</p></li><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 8: DMR LCN Correlation — Rebuilding a Channel Map</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk learns a DMR Tier III band plan that is never broadcast — correlating granted logical channel numbers to the RF carriers that key up in response, confirming each pairing by decoding a DMR sync, and fitting a base-plus-spacing grid it hot-swaps into the live control channel.</p></li><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 9: Wideband Multi-Site P25 — Watching Many Channels at Once</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk pins one wideband SDR to a band centre, splits its IQ into a narrowband stream per control channel with a tuner bank, and runs a per-channel P25 (or DMR) state machine on each — so a whole multi-site system’s control channels are watched simultaneously off a single dongle.</p></li><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 10: Offline vs Live Surveys — Hunting a Recording</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk replays a recorded IQ capture through the exact same sweep, classify, identify, and accumulate pipeline it runs on the air — offline carrier detection with signed offsets, a shared per-candidate routing body, and why a find reproduces from a .cfile byte-for-byte.</p></li><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 11: Naming the Unknown</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk turns a blind discovery’s bare numbers into names — a synthesized system handle from the protocol and identity, a Name/Service/Purpose triple from the frequency allocation and reference catalog, and the honest line between what a decoder can name and what only an operator can.</p></li><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 12: Alias Harvesting — Following Traffic for Talker Aliases</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk harvests P25 Phase 2 talker aliases off a traffic channel’s signalling stream without recording voice — a signalling-only DDC tap per in-window grant, the shared MAC dispatcher the voice composer also uses, RS-parity gating, and harvesting the Motorola alias ciphertext for cryptanalysis.</p></li><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 13: Exporting Your Finds — RadioReference, TrunkRecorder, SigMF</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk exports a discovered system in every format that matters — a round-tripping CSV import bundle, a TrunkRecorder JSON stanza, a RadioReference submission package with a live cross-reference diff, and a SigMF-tagged capture bundle — one DiscoveredSystem, one Write call, many destinations.</p></li><li class="post-card"> <h2 class="post-card__title">The Hunt, Part 14: The Hunt Cockpit & Testing Discovery Without Radios</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">The finale — how the interactive hunt cockpit drives the whole sweep-identify-map-export pipeline live over REST from a browser or terminal, and how the entire discovery path is tested end to end with synthesized IQ and canned sources so a find is proven reproducible with no radio attached.</p></li></ol><p class="blog-feed-link"> See all deep dives or subscribe via RSS. </p>