Skip to content
GopherTrunk
    • What is GopherTrunk?
    • Get started
    • Basics
    • Intermediate
    • Advanced
    • All learning paths
    • RF & SDR
    • Git & GitHub
    • Intro to Software Dev
    • Digital Trunking
    • Intro to Hardware
    • Field Guide overview
    • RF & SDR
    • RF & signal fundamentals
    • Modulation
    • SDR & DSP
    • Algorithms
    • Cryptography & cryptanalysis
    • Trunked radio
    • Protocols & standards
    • Voice coding
    • Hardware
    • People
    • Organizations
    • Software Development
    • Programming languages
    • Language internals & execution
    • Concurrency & execution models
    • Paradigms & design patterns
    • Principles & code quality
    • Testing, tooling & delivery
    • Hardware (computers & devices)
    • Hardware foundations
    • Servers & hosting
    • Personal computers
    • Mobile devices
    • Single-board computers
    • Microcontrollers
    • Networking & connectivity
    • Storage & memory
    • GPUs, FPGAs & accelerators
    • People
    • Organizations & makers
    • The Story of GopherTrunk
    • All posts
    • Announcements
    • Releases
    • Deep dives
    • Series: SDR Internals
    • Series: RF Front End
    • Tutorials
    • Solution Postmortem
    • Downloads
    • Hardware
    • Linux install
    • macOS install
    • Windows install
    • Launcher
    • Windows user guide
    • TUI
    • Web console
    • Live edits
    • Import (PDF / CSV)
    • Bookmarks
    • CC Activity
    • Radio IDs
    • Plots (signal scopes)
    • Constellation
    • Symbol scope
    • Eye diagram
    • Tuning (receiver meters)
    • Symbol histogram
    • Hunt (discover systems)
    • SigLab (offline workbench)
    • rigctld integration
    • Hardening
    • Architecture
    • Vocoders
    • Voice calibration
    • DMR encryption
    • POCSAG paging
    • APRS / AX.25
    • Opt-in features
    • Status
    • Roadmap
    • Cutting a release
    • Support
  1. Home
  2. Blog
  3. Blog: Deep dives
  • RF Front End, Part 12: The SDR Pool & USB Hotplug Watchdog

    June 29, 2026

    How GopherTrunk manages a fleet of opened dongles behind one pool — assigning control, voice, and wideband roles, running a USB watchdog that re-enumerates every 30 seconds to catch hotplug, and reacquiring a device after the kernel hands it a new bus address. Plus the re-open race that taught us to serialize retune behind stream teardown.

  • RF Front End, Part 11: HackRF One — Signed 8-Bit IQ End to End

    June 28, 2026

    The HackRF One driver end to end — the simplest IQ format of the three, signed 8-bit interleaved I,Q scaled to complex64; enumeration across One/Jawbreaker/Rad1o PIDs; and the open-time board-ID readback that fixed empty probe gains by establishing identity and the gain ladder before streaming.

  • RF Front End, Part 10: Airspy R2/Mini & HF+ — Real Samples to Complex Baseband

    June 27, 2026

    How GopherTrunk turns the Airspy R2/Mini's bare real ADC stream into complex baseband entirely on the host — a leaky DC blocker, a multiplier-free Fs/4 mix, and a stateful half-band Hilbert pair — then folds in the Airspy HF+, whose native int16 IQ needs none of it.

  • RF Front End, Part 9: RTL-SDR III — IQ Streaming & the GC-Churn Bug

    June 26, 2026

    Sustained IQ streaming from the RTL2832U in pure Go — 32 async USB buffers, a deep consumer channel, and a bit-identical U8-to-complex64 lookup table. Plus the headline bug: per-chunk allocations whose GC churn shed a quarter of the control channel's live IQ, and the zero-allocation reuse ring that fixed it.

  • RF Front End, Part 8: RTL-SDR II — The R82xx Tuner & the Blog V4 Deafness

    June 25, 2026

    GopherTrunk's pure-Go R820T/R828D tuner driver — PLL tuning, a shadow-register cache that makes read-modify-write free, and tuner auto-detection. Plus the headline bug: why the RTL-SDR Blog V4 came up deaf and mistuned by 1.8×, and how a manual override plus per-band input switching fixed it.

  • RF Front End, Part 7: RTL-SDR I — Bringing Up the RTL2832U

    June 24, 2026

    How GopherTrunk brings up the RTL2832U demodulator in pure Go — the order-sensitive init sequence captured verbatim from librtlsdr, the I2C bridge to the tuner, GPIO and bias-tee, and the USB register transport underneath it all.

  • RF Front End, Part 6: USB on macOS & Windows

    June 23, 2026

    How GopherTrunk reaches the same Transport contract through macOS IOKit (via purego, with OS-thread-pinned reader goroutines) and Windows WinUSB (with overlapped I/O), and why macOS forced us to own the calling thread.

  • RF Front End, Part 5: USB on Linux — USBDEVFS & Async URBs

    June 22, 2026

    How GopherTrunk's Linux USB backend hand-rolls USBDEVFS ioctl encoding, submits a ring of async URBs, and reaps them in a single goroutine for sustained IQ throughput — all in pure Go behind a safe Transport API.

  • RF Front End, Part 4: Talking to USB Without libusb

    June 21, 2026

    How GopherTrunk speaks to RTL-SDR hardware over raw kernel USB interfaces instead of linking libusb, and the single Transport contract that lets one driver run on three wildly different OS USB stacks.

  • Rebuilding GopherTrunk from Source: Update to the Latest Version with Git and GitHub

    June 21, 2026

    A copy-paste guide to rebuilding GopherTrunk from source with the Git CLI and GitHub — clone the repo, check out the latest version or a specific branch, build the pure-Go binary, verify it, and keep an existing clone up to date.

  • RF Front End, Part 3: The Driver Registry & Enumeration

    June 20, 2026

    How GopherTrunk's self-registering driver registry keeps the core hardware-agnostic — drivers register at init(), the binary's import set chooses the hardware, and EnumerateAll walks every backend to list attached dongles while staying resilient when one driver fails.

  • RF Front End, Part 2: The Device Contract

    June 19, 2026

    A method-by-method tour of GopherTrunk's Device interface — the one abstraction four very different radios hide behind — and the optional, type-asserted extension interfaces that expose RTL-SDR-only quirks without polluting the universal contract.

  • RF Front End, Part 1: Why Drive Radios in Pure Go?

    June 18, 2026

    The opening post of RF Front End, a 14-part deep dive into GopherTrunk's RF source layer — the pure-Go USB drivers that turn RTL-SDR, Airspy, and HackRF hardware into IQ samples without libusb, librtlsdr, or any C dependency.

  • SDR in Pure Go, Part 14: APIs, Testing & the Pure-Go Story

    June 16, 2026

    How GopherTrunk exposes the engine through gRPC, REST, WebSocket and a TUI, observes it with Prometheus and SQLite, and proves it works with synthesized-IQ integration tests — a ports-and-adapters finale.

  • SDR in Pure Go, Part 13: Recording, Composition & Streaming

    June 15, 2026

    How GopherTrunk records calls to WAV, drives a per-call demodulation chain with the composer, and streams audio to Broadcastify and RdioScanner — all from optional, config-driven subsystems.

  • SDR in Pure Go, Part 12: Voice Coding — IMBE, AMBE+2 & MBE

    June 14, 2026

    How GopherTrunk turns digital voice frames into audio with pure-Go IMBE and AMBE+2 vocoders sharing one MBE synthesis core, all behind a pluggable Vocoder registry.

  • SDR in Pure Go, Part 11: The Trunking Engine & Event Bus

    June 13, 2026

    How GopherTrunk's trunking engine turns channel grants into recorded calls, and how an in-process pub/sub event bus decouples the core from the API, storage, and streaming subsystems.

  • SDR in Pure Go, Part 10: Protocol Decoders as State Machines

    June 12, 2026

    How GopherTrunk decodes P25, DMR, NXDN, TETRA and a dozen more trunking protocols in pure Go — each a stateful receiver behind a uniform Grant contract, an adapter pattern that keeps the engine protocol-agnostic.

  • SDR in Pure Go, Part 9: Framing & Forward Error Correction

    June 11, 2026

    How GopherTrunk recovers clean data from noisy symbols using pure-Go forward error correction — Golay, BCH, Hamming, Reed-Solomon, BPTC, trellis, and Viterbi — built as deterministic, table-driven codecs.

  • SDR in Pure Go, Part 8: Equalization, Diversity & the FFT

    June 10, 2026

    How GopherTrunk fights simulcast distortion with adaptive equalizers, combines multiple receivers with diversity, and drives the live waterfall with a rate-limited FFT — all in pure Go.

  • SDR in Pure Go, Part 7: Symbol Timing & Sync Recovery

    June 9, 2026

    How GopherTrunk recovers the symbol clock from oversampled signals with a Mueller-Muller timing loop and finds frame boundaries with a sync correlator — feedback state machines implemented in pure Go.

  • SDR in Pure Go, Part 6: Demodulation — FM, C4FM, GFSK & More

    June 8, 2026

    How GopherTrunk turns baseband IQ into symbols with pure-Go demodulators for FM, C4FM, GFSK, FFSK, and π/4-DQPSK — each a focused, single-responsibility type composed from DSP primitives.

  • SDR in Pure Go, Part 5: Tuning & Channelization — DDC vs. Polyphase

    June 7, 2026

    How GopherTrunk extracts many narrowband channels from one wideband SDR capture using a digital down-converter or a polyphase channelizer, selected at runtime through a Go Strategy interface.

  • SDR in Pure Go, Part 4: DSP Foundations — Filters, NCO & AGC

    June 6, 2026

    The building blocks of GopherTrunk's signal chain in Go — FIR/CIC filters, a numerically-controlled oscillator, automatic gain control, and resamplers — and the zero-allocation streaming design behind them.

  • SDR in Pure Go, Part 3: The SDR Pool & Streaming Concurrency

    June 5, 2026

    How GopherTrunk streams IQ samples through Go channels and goroutines, manages a fleet of SDR dongles with a device pool, and fans one stream to many consumers without blocking the decode path.

  • SDR in Pure Go, Part 2: SDR Devices & the Driver Registry

    June 4, 2026

    How GopherTrunk talks to RTL-SDR, HackRF, and Airspy hardware in pure Go behind one Device interface, and how a self-registering driver registry keeps the core hardware-agnostic.

  • SDR in Pure Go, Part 1: What Is Software-Defined Radio?

    June 3, 2026

    A pure-Go tour of software-defined radio — what SDR is, the GopherTrunk signal pipeline from RF to audio, and the layered architecture behind a single static binary.

See all posts or subscribe via RSS.

Start scanning in minutes

GopherTrunk turns a cheap RTL-SDR dongle into a full digital-trunking scanner — P25, DMR, TETRA, NXDN and more, decoded by one pure-Go static binary with nothing else to install. Download the latest build and follow your first system tonight.

Download GopherTrunk v0.5.7 →

Help keep GopherTrunk growing

GopherTrunk is free, open source, and built in spare time. If it's earned a spot in your shack, a small tip funds the next protocol, feature, and guide — and keeps it all free for everyone.

Buy me a coffee GitHub Sponsors
Edit this page on GitHub →

Join the GopherTrunk community

Stuck on a system, IDing a mystery signal, or have a feature in mind? Swap notes with other operators on Discord and Reddit — questions get answered fast.

Join the Discord r/GopherTrunk

Project

  • README
  • License
  • Changelog
  • Security

Community

  • Discord
  • Reddit — r/GopherTrunk
  • GitHub Sponsors
  • Ko-fi
  • Issues
  • More ways to help

Built with

  • Jekyll + GitHub Pages
  • Custom layout, no theme
  • Apache 2.0 licensed
© 2026 GopherTrunk contributors. Site map · Page generated by GitHub Pages.