Version 0.1.1 · free and open source

A trunked radio recorder
in a single program.

Plug in an RTL-SDR dongle and Trunk Recorder Pro records every call on the P25, SmartNet, DMR and conventional radio systems around you. Each call is saved with its talkgroup and who was talking, ready to play back, search or share. It's one small download for macOS, Windows and Linux, or you can run it in your browser.

  • One file, nothing else to install
  • macOS · Windows · Linux
  • Free and open source
The recorder's dashboard: control channel decode rate, recorders in use, CPU use, and a live waterfall for each of two RTL-SDR dongles with the active calls marked.
The live view: what each dongle hears, with calls in progress marked, so you can see what is being recorded at a glance.

What it records

Trunked systems and single channels, side by side.

Record a county P25 system, a transit SmartNet system and a few business channels at once, from the same dongles.

P25 Phase 1

Clear audio even from simulcast sites, the hardest kind to decode. C4FM and CQPSK, with several receivers per channel keeping the best signal.

P25 Phase 2

Both voice slots of newer TDMA systems. There are no keys or settings to look up, because the recorder learns what it needs from the air.

SmartNet / SmartZone

Motorola systems, including VHF/UHF ones with custom band plans, which the recorder can work out for you. Digital and analog calls are both recorded.

DMR

Business and utility systems: Capacity Plus, Capacity Max, Connect Plus and Tier III, plus single repeaters and radio-to-radio talk.

Conventional

Single frequencies such as fire dispatch or a local repeater, analog or digital. On a shared frequency, record just the agency you want by its tone or code.

Talker aliases

See who is talking at a glance. Many radios send a name like “Engine 12” with each call, and it's shown in place of the unit number.

Find my system

Start without knowing the frequencies.

Press Scan and the recorder searches the bands for systems near you, then sets them up for you. You don't need a frequency list to get started.

  • Finds P25, SmartNet and DMR systems, with their control channels, voice channels and neighbouring sites
  • Calibrates your dongle's tuning error and gain, so reception works on the first try
  • Works out custom SmartNet band plans by listening, so you don't have to hunt for them online
The Find my system panel: a radio picker, an option to find the best gain, and checkboxes for the bands to scan, from VHF to 900 MHz.
The Systems tab in Setup: a SmartNet system with its control channels, talkgroup CSV, band plan fields and site group, and the list of recent calls beside it.

Several systems and sites

One recorder, many systems.

Follow several systems, or several sites of a large network, with the same dongles. Each one's calls are filed separately, and the dongles are shared between them automatically.

  • Site lock keeps each system on the right tower, even where neighbouring sites overlap
  • A call heard on several sites is saved once, from the clearest copy. You get fewer duplicates, and no gaps when one site fades
  • Choose a preferred site for a talkgroup when it matters which one you keep
  • Add neighbouring sites with one click

Conventional channels

Watch hundreds of channels for almost nothing.

An idle channel uses almost no CPU, so one dongle can watch every frequency in its range. Recording starts a moment before a transmission is detected, so the first words aren't cut off.

  • Squelch behaves the same on any dongle and gain, so it rarely needs adjusting
  • Split a shared frequency by CTCSS/DCS tone, NAC or colour code, and file each user separately
  • See which tones and codes a frequency carries, and add each one with a click
  • Keep your channel list in a spreadsheet. Trunk Recorder channel files work as they are
The Conventional tab: import and export CSV, a linked channel file, squelch in dB above noise, and a box for adding frequencies as analog FM, P25 or DMR.
The Radios tab: two RTL-SDR sources with center frequency, sample rate, gain and ppm, each with a bar showing which configured channels fall inside it.

Radios

Plug in a dongle and go. Bigger radios when you need them.

RTL-SDR dongles work without installing any drivers. Add more dongles to cover more spectrum. Each one shows which channels it covers, so any gaps are easy to spot.

  • USRP, Airspy and SoapySDR radios cover a wider slice of spectrum with one device
  • Replay recorded IQ files to test settings or track down a problem
  • Leave a dongle on Auto and it tunes itself to cover what the others miss

How it works

One FFT per radio. Every channel is cut from it.

Each radio's signal is processed once and shared by every channel. That keeps CPU use low and lets one dongle record many calls at once. The engine is written from scratch in Rust, without GNU Radio or OP25, and the same engine runs on the desktop and in the browser.

Signal chain: IQ samples from each radio go into one shared FFT channelizer with one second of pre-roll. It feeds three paths: control channels to the trunking logic, voice channels to the vocoders, and conventional channels detected by energy. All three produce WAV and JSON files and the live interface. Radios IQ samples Channelizer one shared FFT 1 s pre-roll history Control channels receivers → framer → Viterbi Voice channels soft FEC → IMBE / AMBE+2 Conventional energy → FM / P25 / DMR Call manager grants, sites, dedupe Calls WAV + Trunk Recorder JSON live interface · plugins opens voice channels
98–99%

of P25 control messages decoded on a difficult simulcast site (OP25: 62 %). That means fewer missed calls and fewer late starts.

4–6×

less CPU than Trunk Recorder on a Raspberry Pi 5: 5 % of one core while recording a call, against 20 %. Each extra call adds under 1 %.

90–99%

of SmartNet control messages, where Trunk Recorder gets 40–60 %. You catch more calls from the same antenna.

~6dB

less signal needed for clear P25 voice after receiver improvements (8 dB on DMR). Distant sites and indoor antennas give more usable audio.

CPU stays flat as calls pile up

Both recorders running live, one at a time, on a Raspberry Pi 5 with one RTL-SDR dongle on a P25 site. Each call costs Trunk Recorder about 8 % of a core and Trunk Recorder Pro under 1 %.

CPU load against recorders in use: Trunk Recorder and Trunk Recorder Pro DCFD · P25 · 1 RTL-SDR, 2.4 MSPS · Raspberry Pi 5, Trunk Recorder: 21.4% of a core on average; DCFD · P25 · 1 RTL-SDR, 2.4 MSPS · Raspberry Pi 5, Trunk Recorder Pro: 5.0% of a core on average. Trunk Recorder Trunk Recorder Pro dots: 5 s each · large: median DCFD · P25 · 1 RTL-SDR, 2.4 MSPS · Raspberry Pi 5 0% 10% 20% 30% 40% 50% 60% 0 1 2 3 4 Recorders in use Trunk Recorder, 0 recorders: 10.4% of a core (median of 93 samples) Trunk Recorder, 1 recorder: 20.3% of a core (median of 145 samples) Trunk Recorder, 2 recorders: 27.5% of a core (median of 91 samples) Trunk Recorder, 3 recorders: 35.6% of a core (median of 24 samples) Trunk Recorder, 4 recorders: 44.4% of a core (median of 7 samples) 44% Trunk Recorder Pro, 0 recorders: 4.2% of a core (median of 106 samples) Trunk Recorder Pro, 1 recorder: 5.0% of a core (median of 156 samples) Trunk Recorder Pro, 2 recorders: 5.6% of a core (median of 90 samples) Trunk Recorder Pro, 3 recorders: 6.2% of a core (median of 8 samples) 6% CPU load, % of one Pi core (fixed 2.4 GHz)

Measured on captures and live systems in the Washington, DC area using RTL-SDR and USRP B200 receivers, on a Raspberry Pi 5 and an Apple-silicon Mac. Your results will depend on your site, antenna and hardware. The methods and raw results are in the repository.

Trunk Recorder compatible

Fits into your existing setup.

Recordings use Trunk Recorder's file layout and metadata, so the tools and sites you already use can read them. You can bring your existing configuration across in one step.

  • Import a Trunk Recorder config, talkgroup lists and channel files as they are
  • Plugins share calls with OpenMHz, Broadcastify Calls and Rdio Scanner, stream live audio, or run your own script. You can install them from inside the app
~/TrunkRecorderPro
dcfd/2026/10/1/
  1201-1790865823_857237500.wav
  1201-1790865823_857237500.json
  1307-1790865861_770106250.1.wav   # Phase 2, slot 1
capmax/2026/10/1/
  201-1790865902_452275000.0.wav   # DMR, slot 0
conv/2026/10/1/
  154430-1790865940_154430000.wav # talkgroup = kHz

Install

Download one file and run it.

Each download is a single program with the interface built in. When it runs, it opens its interface in your browser at http://localhost:8080. The current version is 0.1.1, released October 3, 2026 (release notes). Check downloads against SHA256SUMS.

macOS 11 or later · Apple silicon and Intel (one universal app)

  1. Download trunk-pro-0.1.1-macos.dmg

    Open it and drag Trunk Recorder Pro to Applications.

  2. Allow the first launch

    Releases aren't signed with an Apple Developer ID yet, so macOS blocks the first launch. Open the app once, then go to System Settings → Privacy & Security → Open Anyway.

  3. Plug in a dongle and set up a system

    The app has no Dock icon. It opens its interface in your browser. To get back to the interface, open the app again. To stop it, use Quit in the interface.

Command-line version

trunk-pro-0.1.1-macos-universal.tar.gz contains the same program without the app bundle:

curl -L -o trunk-pro-0.1.1-macos-universal.tar.gz https://trunkrecorder.pro/download/macos-cli
tar xzf trunk-pro-0.1.1-macos-universal.tar.gz
./trunk-pro

Optional: USRP and Airspy drivers

RTL-SDRs need nothing extra. For other radios, install the maker's driver. The recorder finds it at startup and offers it as a source type. trunk-pro devices shows which drivers it found.

macOSDebian / Ubuntu / Pi OSWindows
USRPbrew install uhdsudo apt install libuhd-dev uhd-hostEttus's UHD installer
Airspybrew install airspysudo apt install libairspy0airspy.dll next to trunk-pro.exe

Web App

Try it without installing anything.

The Web App runs the same engine in your browser. Plug in a dongle and you can be listening in a minute. It's a quick way to check reception or try a system before setting up the desktop app.

For several dongles or round-the-clock recording, use the desktop app, since a browser tab can be closed or put to sleep.

Open the Web App

Open in Chrome or Edge to use the Web App

Status

What's tested and what isn't.

This is the first release of a new engine. Here's the current state.

Verified

  • Live recording on macOS with one or several RTL-SDRs. A public SmartNet feed now runs on it
  • P25 Phase 1 and Phase 2, SmartNet and DMR decoding on real-air captures. P25 and SmartNet were compared with Trunk Recorder on the same air
  • USRP B200, live at 8 MSPS with no dropped samples
  • The browser build on captures, giving the same calls as the native build

Not yet tested on hardware

  • Linux and Windows builds with live dongles (the builds are made, but haven't been run with hardware yet)
  • Airspy streaming
  • Live WebUSB in the browser version
  • Conventional channels on live air (verified on synthetic signals)

Not built yet

  • Signed and notarized macOS builds
  • Login for the web interface. Keep it on localhost or a network you trust

Found a problem or have a system it doesn't handle? Open an issue on GitHub.