[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80486":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":14,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":24,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":38,"readmeContent":39,"aiSummary":40,"trendingCount":16,"starSnapshotCount":16,"syncStatus":14,"lastSyncTime":41,"discoverSource":42},80486,"GopherTrunk","MattCheramie\u002FGopherTrunk","MattCheramie","Pure-Go, cross-platform RTL-SDR scanner and audio processing toolkit.","",null,"Go",76,11,2,15,0,1,9,3,47.14,"Apache License 2.0",false,"main",true,[26,27,28,29,30,31,32,33,34,35,36,37],"d-star","dmr","edacs","golang","ltr","nxdn","open-source","p25","rf","rtl-sdr","sdr","tetra","2026-06-12 04:01:28","\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fassets\u002Fgophertrunk-logo.png\" alt=\"GopherTrunk logo\" width=\"220\">\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">GopherTrunk\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  \u003Cstrong>Pure-Go digital-trunking radio scanner engine for RTL-SDR · HackRF · Airspy · Airspy HF+.\u003C\u002Fstrong>\u003Cbr>\n  P25 · DMR · TETRA · NXDN · Motorola Type II · EDACS · LTR · MPT 1327 · dPMR · D-STAR · YSF.\u003Cbr>\n  Zero CGO, single static binary, headless daemon + Bubbletea TUI cockpit + browser web console.\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FMattCheramie\u002FGopherTrunk\u002Factions\u002Fworkflows\u002Fci.yml\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FMattCheramie\u002FGopherTrunk\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg\" alt=\"CI\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FMattCheramie\u002FGopherTrunk\u002Freleases\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002FMattCheramie\u002FGopherTrunk?include_prereleases&sort=semver&color=155799\" alt=\"Release\">\u003C\u002Fa>\n  \u003Ca href=\"LICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002FMattCheramie\u002FGopherTrunk?color=155799\" alt=\"License\">\u003C\u002Fa>\n  \u003Ca href=\"go.mod\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fgo-mod\u002Fgo-version\u002FMattCheramie\u002FGopherTrunk?color=155799\" alt=\"Go version\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgoreportcard.com\u002Freport\u002Fgithub.com\u002FMattCheramie\u002FGopherTrunk\">\u003Cimg src=\"https:\u002F\u002Fgoreportcard.com\u002Fbadge\u002Fgithub.com\u002FMattCheramie\u002FGopherTrunk\" alt=\"Go Report Card\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgophertrunk.org\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdocs-gophertrunk.org-155799\" alt=\"Docs\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n---\n\n## What is this?\n\nGopherTrunk is a software-defined-radio scanner that follows digital\ntrunked-radio voice calls and decodes them to audio. It runs on a\npool of RTL-SDR (every osmocom tuner), HackRF (One \u002F Jawbreaker \u002F\nRad1o), Airspy R2 \u002F Mini, and Airspy HF+ dongles, has no C\ndependencies at build or runtime (no `librtlsdr` \u002F `libhackrf` \u002F\n`libairspy` \u002F `libairspyhf` \u002F `libusb` \u002F `libasound2` \u002F\n`libmp3lame`), and ships as a single ~10 MB static binary for Linux,\nmacOS, and Windows.\n\nCompleted calls stream to Broadcastify Calls, RdioScanner, OpenMHz,\nand live Icecast \u002F ShoutCast mountpoints out of the box. Why does\nthis exist? Read **[The Story of GopherTrunk](https:\u002F\u002Fgophertrunk.org\u002Fstory.html)**.\n\n## Quick start\n\n```sh\n# Linux x86_64 — see https:\u002F\u002Fgophertrunk.org\u002Fdownloads.html for macOS, Windows, ARM64.\nVERSION=v0.2.6\ncurl -L -o gophertrunk.tar.gz \\\n  https:\u002F\u002Fgithub.com\u002FMattCheramie\u002FGopherTrunk\u002Freleases\u002Fdownload\u002F${VERSION}\u002Fgophertrunk-${VERSION}-linux-amd64.tar.gz\ntar xzf gophertrunk.tar.gz && cd gophertrunk-${VERSION}-linux-amd64\ncp config.example.yaml config.yaml\n.\u002Fgophertrunk version\n# Plain `.\u002Fgophertrunk` (no subcommand, on a TTY) drops into the\n# interactive launcher: pick [1] TUI, [2] Web, or [3] Headless.\n# Skip the prompt with -tui \u002F -web \u002F -headless.\n.\u002Fgophertrunk -config config.yaml\n```\n\nWindows users get a one-click installer that bundles Zadig for\nWinUSB driver setup; macOS users get notarised tarballs for Apple\nSilicon and Intel. Full per-OS recipes at\n**[gophertrunk.org\u002Fdownloads.html](https:\u002F\u002Fgophertrunk.org\u002Fdownloads.html)**.\n\n## Features\n\n- **Trunked control-channel decoders** — P25 Phase 1 + Phase 2 (full\n  TIA-102 chain), DMR Tier II + Tier III (vendor-aware: Capacity\n  Plus \u002F Capacity Max grants and rest-channel tracking), NXDN,\n  Motorola Type II \u002F SmartZone, EDACS \u002F GE-Marc, LTR, MPT 1327,\n  dPMR Mode 3, TETRA TMO. Amateur-radio: D-STAR and Yaesu System\n  Fusion.\n- **POCSAG paging** — protocol layer for the dominant wireline\n  FSK pager protocol (CCIR 584): BCH(31,21) FEC, batch carve-up,\n  numeric (5 BCD\u002Fcodeword) + alphanumeric (7-bit packed ASCII)\n  decoders. Foundation for fire \u002F EMS dispatch text alongside\n  the trunked-voice pipeline; DSP wiring follows in the next PR.\n  See [docs\u002Fpocsag.md](docs\u002Fpocsag.md).\n- **APRS \u002F AX.25 packet** — end-to-end pipeline for the\n  amateur-radio APRS metadata bus (position beacons, messages,\n  bulletins, status, Mic-E mobile-tracker compressed format).\n  Bell-202 AFSK DSP frontend (FM demod → FFSK tone discriminator\n  → symbol-time recovery → NRZI → HDLC framer), AX.25 frame\n  parser with CRC-16-CCITT, APRS info-field decoders including\n  full Mic-E (lat\u002Flon, speed, course, altitude, message code),\n  plus `events.KindAPRSPacket` bus event, SQLite `aprs_log`,\n  `GET \u002Fapi\u002Fv1\u002Faprs\u002Fpackets`, and `\u002Faprs` web panel.\n  See [docs\u002Faprs.md](docs\u002Faprs.md).\n- **AIS marine** — end-to-end pipeline for the Automatic\n  Identification System every commercial vessel broadcasts on\n  marine VHF 87B \u002F 88B (161.975 \u002F 162.025 MHz). 9600 Bd GMSK DSP\n  frontend (FM demod → GFSK matched filter at BT = 0.4 →\n  symbol-time recovery → NRZI → HDLC framer → CRC-CCITT\n  validation), ITU-R M.1371-5 message-type dispatch (Class A\n  position reports 1\u002F2\u002F3, Class B 18 + 19 extended, base-station\n  4, static + voyage 5, Class B static 24 A + B), signed-integer\n  lat\u002Flon decoder (1\u002F600000 minute resolution), 6-bit ASCII text\n  fields (vessel name, call-sign, destination), spec\n  \"not-available\" sentinels. Plus `events.KindAISMessage` bus\n  event, SQLite `vessel_log`, `GET \u002Fapi\u002Fv1\u002Fais\u002Fvessels`, and\n  `\u002Fais` web panel. See [docs\u002Fais.md](docs\u002Fais.md).\n- **MDC1200 signaling** — end-to-end pipeline for Motorola's\n  analog FFSK data burst keyed at the head \u002F tail of a\n  transmission on conventional VHF \u002F UHF voice channels. 1200-baud\n  CCIR FFSK DSP frontend (FM demod → FFSK discriminator at\n  1200 \u002F 1800 Hz → Mueller-Müller timing → NRZ slicer), 40-bit\n  sync framer with polarity tolerance, 16×7 de-interleave, op \u002F\n  arg \u002F unit-ID decode with CRC-16-CCITT check, and an op\u002Farg\n  table (PTT ANI, emergency, status, radio check, call alert,\n  selective call). Plus `events.KindMDC1200Message` bus event,\n  SQLite `mdc1200_log`, `GET \u002Fapi\u002Fv1\u002Fmdc1200\u002Fmessages`, and\n  `\u002Fmdc1200` web panel. See [docs\u002Fmdc1200.md](docs\u002Fmdc1200.md).\n- **DSC marine distress** — protocol layer for the GMDSS Digital\n  Selective Calling system that fires every marine VHF channel-\n  70 distress alert. ITU-R M.493-15 format dispatch (Distress,\n  All-Ships, Individual, Group, Geographic, Auto-Individual),\n  BCH(10,7) syndrome check, position decoder with quadrant\n  hemisphere flip, nature-of-distress table. Plus\n  `events.KindDSCMessage` bus event, SQLite `dsc_log`,\n  `GET \u002Fapi\u002Fv1\u002Fdsc\u002Fmessages`, and `\u002Fdsc` web panel (rows tint\n  by category — distress=red, urgency=orange, safety=blue).\n  **DSP frontend** decodes straight off the air: FM demod →\n  FFSK discriminator (1200 Bd, 1300\u002F2100 Hz tones) →\n  symbol-timing recovery → direct-FSK slicer → BCH(10,7)\n  character sync → ITU-R M.493 parser. Pin an SDR via\n  `dsc.channels`. See [docs\u002Fdsc.md](docs\u002Fdsc.md).\n- **ADS-B aviation** — end-to-end pipeline for the 1090 MHz\n  Mode-S transponder broadcasts every commercial flight emits.\n  ICAO Annex 10 Vol IV \u002F DO-260B parser (CRC-24 + DF dispatch +\n  type-code dispatch for identification, airborne \u002F surface\n  position with 12-bit Q-bit altitude, airborne velocity);\n  globally-unambiguous CPR position decoder + per-ICAO\n  even+odd pair tracker. **BEAST upstream** consumes Mode-S\n  frames from any dump1090 \u002F readsb \u002F BeastSplitter via TCP —\n  most 1090 MHz receive chains already run one, GopherTrunk\n  decodes its output. **Native PPM DSP frontend** is the\n  alternative: pin an SDR (>= 2 Msps) to 1090 MHz via\n  `adsb.channels` and GopherTrunk demodulates Mode-S itself —\n  magnitude envelope → 8 µs preamble correlation → PPM bit\n  slice → CRC\u002FDF dispatch — feeding the same decode\u002Ftrack path\n  the BEAST upstream uses. Plus `events.KindAircraftReport` bus\n  event, SQLite `aircraft_log`, `GET \u002Fapi\u002Fv1\u002Fadsb\u002Faircraft`,\n  and `\u002Fadsb` web panel. See [docs\u002Fadsb.md](docs\u002Fadsb.md).\n- **Live map** — Shared Leaflet map at the top of each\n  position-bearing panel (APRS \u002F AIS \u002F DSC \u002F ADS-B) renders\n  decoded positions over OpenStreetMap tiles, colour-coded per\n  protocol (blue \u002F cyan \u002F red-distress \u002F purple), with marker\n  tooltips and camera auto-fit. Same `\u003CPositionMap>` component\n  drives all four panels.\n- **Pure-Go voice path** — IMBE (P25 Phase 1) and AMBE+2 (P25\n  Phase 2 \u002F DMR) vocoders in Go, no DVSI \u002F mbelib dependency.\n  Per-call WAV + raw-frame sidecars; live PCM playback via direct\n  ALSA \u002F WASAPI \u002F CoreAudio.\n- **Pure-Go SDR drivers** — RTL-SDR, HackRF, Airspy R2 \u002F Mini,\n  Airspy HF+ family. USB transport on Linux (USBDEVFS), Windows\n  (WinUSB), macOS (IOKit). USB-disconnect self-healing recovers\n  dongles that drop off the bus and re-enumerate without\n  restarting the daemon. See\n  [docs\u002Fhardware.md](docs\u002Fhardware.md).\n- **Remote rtl_tcp SDRs** — Mount any number of `rtl_tcp`\n  endpoints as virtual tuners alongside local USB dongles. The\n  SDR can live on a Raspberry Pi at the antenna while the daemon\n  runs on a beefier host; one entry per remote in `sdr.rtl_tcp`.\n- **Live spectrum \u002F waterfall** — In-browser FFT waterfall served\n  off the same IQ stream the trunking decoder consumes. New\n  `internal\u002Fsdr\u002Fiqtap` multi-consumer fan-out lets future\n  trunking-adjacent decoders (paging, AIS, ADS-B, ...) tap the\n  same source without disturbing CC decode. `GET \u002Fapi\u002Fv1\u002Fspectrum\u002Fdevices`\n  + `WS \u002Fapi\u002Fv1\u002Fspectrum\u002Fstream`; web panel under `\u002Fspectrum`.\n- **CC Activity panel** — focused web view of the trunked control-\n  channel chatter (grants, affiliations, registrations, patches,\n  talker aliases, CC lock \u002F loss). Pure filter over the events\n  stream with per-row payload rendering; web panel at `\u002Fcc`. RIDs\n  in the feed are clickable chips that pivot into the per-radio\n  detail view.\n- **Radio IDs panel** — per-radio (subscriber-unit) entity browser\n  with the same shape as Talkgroups. Merges the operator-configured\n  alias catalogue (per-system `rid_alias_file` CSV or JSON: alias,\n  owner, tag, group, priority, lockout, watch) with the live\n  affiliation tracker (last talkgroup, last seen, call count,\n  decoded talker alias). Detail modal pulls the last 50 calls for\n  the RID from the persisted call log. Web panel at `\u002Frids`; REST\n  at `\u002Fapi\u002Fv1\u002Frids`; gRPC `RIDService`. Talker-alias decoders\n  cover the Motorola vendor TSBK form (control channel) and the\n  Motorola voice-channel LCs (P25 Phase 1 LDU1 LCO 0x15 header\n  + N × LCO 0x17 data blocks, run through Motorola's\n  reverse-engineered alias cipher).\n- **Constellation viewer** — live IQ scatter visualization that\n  taps the same broker the trunking decoder reads. Useful for\n  identifying signal shape (PSK \u002F QPSK \u002F FSK \u002F C4FM \u002F AM \u002F\n  noise), spotting frequency offset, and checking demod \u002F\n  equalizer health. Decimated to 2 ksps for the wire; canvas\n  scatter with energy banner. Web panel at `\u002Fconstellation`.\n- **Bookmarks \u002F frequency manager** — UI-managed conventional\n  channel list (marine VHF, NOAA weather, FRS\u002FGMRS, repeater\n  outputs, public-safety fall-back channels) stored in the\n  daemon's SQLite database. Edit \u002F create \u002F delete from the web\n  panel under `\u002Fbookmarks`; REST at `\u002Fapi\u002Fv1\u002Fbookmarks`.\n- **One dongle, many carriers** — `role: wideband` pins a single\n  SDR to a centre frequency and runs an internal channelizer so\n  one dongle decodes every DMR Tier II conventional repeater, DMR\n  Tier III control channel, P25 Phase 1 control channel, AND P25\n  Phase 2 control channel that fit inside its IQ bandwidth (e.g.\n  several 12.5 kHz carriers inside a 2.4 MHz IQ window). Mix\n  protocols on the same dongle.\n- **One dongle, control + voice** — with `voice_taps: N` on a\n  wideband entry, the daemon allocates per-grant DDC tuners from\n  the dongle's IQ stream so trunked voice grants (DMR T3, P25\n  Phase 1, P25 Phase 2) decode inline on the same SDR that's\n  already hosting the control channel — no separate `role: voice`\n  dongle needed for grants inside the wideband window. Out-of-\n  window grants spill over to a physical voice SDR when present.\n  See [docs\u002Fhardware.md](docs\u002Fhardware.md) and\n  [samples\u002Fdmr-tier2-multichannel\u002F](samples\u002Fdmr-tier2-multichannel\u002F).\n- **DSP** — Polyphase channelizer, Kaiser \u002F RRC \u002F Gaussian FIRs,\n  FM \u002F C4FM \u002F GFSK \u002F FFSK \u002F DQPSK \u002F π\u002F4-DQPSK \u002F π\u002F8-H-DQPSK\n  demods, Mueller-Müller + Gardner clock recovery, LMS + CMA\n  equalizers, diversity combining.\n- **APIs** — gRPC + HTTP\u002FSSE + WebSocket; optional TLS +\n  bearer-token auth on mutations; Prometheus `\u002Fmetrics`; pure-Go\n  SQLite call log; in-process pub\u002Fsub event bus.\n- **Hamlib `rigctld` integration** — optional TCP server speaking\n  the standard Hamlib wire protocol so loggers, satellite\n  trackers, and amateur-radio tooling (Cloudlog, GridTracker,\n  PSTRotator, `rigctl(1)`) can read and set the control SDR's\n  frequency. RX-only backend; see\n  [docs\u002Frigctld.md](docs\u002Frigctld.md).\n- **Outbound call streaming** — Broadcastify Calls, RdioScanner,\n  OpenMHz, live Icecast \u002F ShoutCast with pre-encoded silence keep-alive.\n  Pure-Go MP3 encoder. See `internal\u002Fbroadcast`.\n- **Baseband recording + offline replay** — Two-channel 16-bit WAV\n  capture and a replay driver that mounts captures back into the\n  SDR pool as virtual tuners. Looping replay simulates a\n  continuous source.\n- **Operator surfaces** — Bubbletea TUI cockpit with 12 panels,\n  pure-browser React SPA web console, runtime config editing via\n  `PATCH \u002Fapi\u002Fv1\u002Fsettings`, RadioReference PDF \u002F CSV importer with\n  a config-builder wizard.\n- **Location + affiliation** — NMEA-0183 GGA \u002F RMC over the air\n  decoded into a SQLite `location_log`; protocol-agnostic\n  affiliation tracker fed from grants \u002F registrations \u002F affiliation\n  events.\n\nFor the full per-protocol FEC chain reference, receiver internals,\nframe layouts, and API routes, see\n[docs\u002Farchitecture.md](docs\u002Farchitecture.md) and\n[docs\u002Fopt-in-features.md](docs\u002Fopt-in-features.md).\n\n## Status snapshot\n\nOnce a `grant` event lands on the bus, the engine + recorder pipeline\nruns end-to-end: voice device is allocated, the composer pulls IQ →\nPCM, the recorder writes a WAV, the call is logged to SQLite, and\nthe API + TUI surfaces all light up. Every trunked control\nmodulation in the Features list has an end-to-end IQ → CC chain\nshipping. SDRtrunk-parity subsystems (outbound streaming, baseband\nrecording, GPS \u002F location, affiliation tracking, decoded-message\nlog, per-talkgroup policy) all ship.\n\n**Remaining gaps:**\n\n- **Digital-voice composer chains.** FM, DMR, P25 Phase 1 \u002F 2 decode\n  to audio. NXDN, dPMR, TETRA, YSF, D-STAR voice (plus EDACS\n  ProVoice) are followed and logged but not yet turned into PCM.\n- **Additional SDR validation.** HackRF \u002F Airspy \u002F HF+ drivers\n  exercise the documented USB vendor protocols under unit tests\n  against a mock transport; on-air validation against attached\n  hardware is the documented follow-up.\n- **FEC inner-layer real-air validation.** NXDN per-protocol\n  interleaver and TETRA on-air recovery margins need live captures\n  to characterise.\n- **Vocoder level calibration** awaits reference WAVs in\n  `internal\u002Fvoice\u002F{imbe,ambe2}\u002Ftestdata\u002F`.\n\nThe long-form status, per-protocol detail, and shipping-vs-pending\nchecklist live in **[docs\u002Fstatus.md](docs\u002Fstatus.md)**. Near-term\nplans live in **[docs\u002Froadmap.md](docs\u002Froadmap.md)**. Released work\nlives in **[CHANGELOG.md](CHANGELOG.md)**.\n\n## Build from source\n\n```sh\nmake dist     # SPA + daemon — single binary that serves the web console at \u002F\nmake build    # Go-only — fast iteration; daemon shows a helpful 404 at \u002F until bundled\nmake test     # go test -race .\u002F...\nmake vet      # go vet .\u002F...\nmake integration  # daemon end-to-end test (no SDR required)\n```\n\nThe per-protocol \"lights up\" integration tests\n(`make integration-cc-\u003Cproto>`) and the DVSI hardware-backend tests\n(`make test-dvsi`) are documented in\n[`CONTRIBUTING.md`](CONTRIBUTING.md).\n\nA bare `go build .\u002Fcmd\u002Fgophertrunk` works too — the binary\nauto-stamps its version line from Go's built-in VCS info. Useful\nwhen attaching a log to an issue and you want the commit hash in\nthe build-info line.\n\n### Docker\n\n```sh\ndocker compose up -d\ncurl -s http:\u002F\u002Flocalhost:8080\u002Fapi\u002Fv1\u002Fhealth\ncurl -s http:\u002F\u002Flocalhost:8080\u002Fmetrics | grep gophertrunk_build_info\n```\n\nUSB pass-through recipe and the operator hardening playbook (TLS,\nbearer-token auth, Prometheus catalogue, smoke tests) live in\n[docs\u002Fhardening.md](docs\u002Fhardening.md).\n\n## Documentation\n\nOperator-facing docs live at **[gophertrunk.org](https:\u002F\u002Fgophertrunk.org)**\n(rendered from this `docs\u002F` tree):\n\n- **Install** — [Downloads](https:\u002F\u002Fgophertrunk.org\u002Fdownloads.html) ·\n  [Hardware](docs\u002Fhardware.md) ·\n  [Linux](docs\u002Finstall-linux.md) ·\n  [macOS](docs\u002Finstall-macos.md) ·\n  [Windows](docs\u002Finstall-windows.md)\n- **Operate** — [Launcher](docs\u002Flauncher.md) ·\n  [Windows user guide](docs\u002Fuser-guide-windows.md) ·\n  [TUI](docs\u002Ftui.md) ·\n  [Web console](docs\u002Fweb.md) ·\n  [Live config editing](docs\u002Flive-edits.md) ·\n  [Import (PDF \u002F CSV)](docs\u002Fimport.md) ·\n  [Hardening](docs\u002Fhardening.md)\n- **Reference** — [Architecture](docs\u002Farchitecture.md) ·\n  [Vocoders](docs\u002Fvocoders.md) ·\n  [Voice calibration](docs\u002Fvoice-calibration.md) ·\n  [DMR encryption](docs\u002Fdmr-encryption.md) ·\n  [Opt-in features](docs\u002Fopt-in-features.md) ·\n  [Status](docs\u002Fstatus.md) ·\n  [Roadmap](docs\u002Froadmap.md) ·\n  [Cutting a release](docs\u002Frelease.md)\n- **Project metadata** — [CHANGELOG](CHANGELOG.md) ·\n  [CONTRIBUTING](CONTRIBUTING.md) ·\n  [SECURITY](SECURITY.md) ·\n  [THIRD_PARTY_LICENSES](THIRD_PARTY_LICENSES.md)\n\n## Support the project\n\nGopherTrunk is developed in the open and powered entirely by\ncommunity support. If it's useful to you, please consider chipping\nin:\n\n- [Sponsor on GitHub](https:\u002F\u002Fgithub.com\u002Fsponsors\u002FMattCheramie)\n- [Tip on Ko-fi](https:\u002F\u002Fbuymeacoffee.com\u002FMrcheramie)\n\nMore ways to help: [docs\u002Fsupport.md](docs\u002Fsupport.md).\n\n## License\n\nSee [LICENSE](LICENSE).\n","GopherTrunk 是一个纯 Go 语言编写的跨平台数字集群无线电扫描和音频处理工具包，支持多种数字通信标准如 P25、DMR 和 TETRA 等。该项目的核心功能包括无 C 依赖的构建与运行环境，生成单一静态二进制文件（约10MB大小），适用于Linux、macOS及Windows系统；同时提供无头守护进程模式、Bubbletea TUI界面以及浏览器Web控制台三种操作方式。GopherTrunk特别适合于需要监听并解码数字集群无线电通信的专业场景或个人爱好项目中使用。","2026-06-11 04:00:56","CREATED_QUERY"]