Skip to content
musithangPublic

About

Terminal monitor for SDR hardware - written in Rust. Early development.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

324 stars

Watchers

1 watching

Forks

sdrtop logo

sdrtop

A bench instrument for software defined radios, living in your terminal.
Spectrum, waterfall, and the measurements a plot cannot give you.

Rust 1.88+ GPL-3.0-or-later Linux macOS, unofficial Early development

Terminal Trove Tool of The Week

This project is supported by
Airspy  ·  SDRplay

Tested on real hardware
HackRF One RTL-SDR Airspy R2 Airspy HF+ Discovery SDRplay RSP1B PortaPack H4M tinySA Ultra

Via SoapySDR Beta
SoapySDR 0.8 | 0.9 Airspy Mini SDRplay RSP PlutoSDR LimeSDR bladeRF USRP
Grey means written from the API, not from owning one. It should work. Nobody has told me either way yet, which is exactly as reassuring as it sounds. The honest version.

Install · Hardware · Full guide · Changelog

Hey there! This is my take on a terminal monitor for SDR hardware. Raw, real-time diagnostics from your radio, with a spectrum, a waterfall and a set of bench instruments, in a tmux pane, an SSH session, or the postage-stamp screen of a cyberdeck. I set out to print a few numbers. There is now a Friis noise figure model in here. I'm not entirely sure how that happened.

It's a hobby project, and honestly, I made it for you ❤️. Beat on it, open issues, send ideas and pull requests. This is an open table, not my private garage.

demo.mp4

It's a terminal app, so brace yourself for the visual spectacle of monospace text in color. The only special effects are honest dBFS numbers.

Important

Early development. New features keep coming, each one measured against the specification and then polished until it reads at a glance. Known issues: plenty 😄 If something looks broken, it's either a bug or an undocumented feature. Flip a coin, then open an issue.

Piconet follow · classic Bluetooth
One piconet, found by the access code at the start of every packet and read packet by packet. How it works

piconet_follow.mp4

RDS demodulation · FM broadcast
Station name, programme type and RadioText, read off the 57 kHz subcarrier. No audio, on purpose. How it works

lab_rds_demod.mp4

What it does

  • Spectrum and waterfall, plus the Command Rail cockpit: frequency, S-meter, SNR, noise figure and saturation on live traces.
  • Four lab benches for what a plot can't answer: quadrature, front-end staging, timing, and what is that signal. Details
  • A demodulator that reads radios instead of playing them: FM deviation, pilot, stereo, CTCSS, AM depth, RDS. No audio, on purpose. Details
  • NET: the 2.4 GHz band, measured. Bluetooth (BLE, LE Coded, classic) and Wi-Fi, decoded and held against the specification. Never transmits, never joins. Details
  • IQ correction, band sweeps, SigMF recording, observer mode for a radio another app holds, and every lab panel marked [STALE] the moment its data stops being live.

Because the only thing worse than no data is confidently wrong data.

Everything else, every key and every config field, is in the full user guide.


Install

curl -fsSL https://raw.githubusercontent.com/musithang/sdrtop/main/packaging/install.sh | sh

The installer takes the prebuilt binary, or compiles from source when that can't run on your machine. Add your radio's runtime with sh -s -- --hackrf, --rtlsdr, --airspy, --airspyhf or --soapy; --sdrplay checks SDRplay's API and service. Piping a script into sh means running code you haven't read, so read it first: packaging/install.sh. I'd want to.

On Arch, from the AUR:

yay -S sdrtop-bin    # or sdrtop, or sdrtop-git

With cargo, anywhere with Rust 1.88+ and a C compiler:

cargo install sdrtop --locked

No SDR library is needed to build; each radio's library is loaded at runtime, and a missing one disables only its own backend. Every flag, every distribution and the tarball by hand: Getting started.

First run: sdrtop opens on its menu. Enter takes a layout, Space starts receiving, Esc brings the menu back, q quits and saves. Every key: Keyboard shortcuts.


Supported hardware

Device Status
HackRF One, PortaPack H4M ✅ Tested
RTL-SDR ✅ Tested
Airspy R2 ✅ Tested
Airspy HF+ Discovery ✅ Tested
SDRplay RSP1B ✅ Tested
tinySA / Ultra / Ultra+ ✅ Spectrum (ZS405 tested)
Anything with a SoapySDR driver 🧪 Beta, written from the API

Native support lands only after testing on a real radio. The RSP1B came from SDRplay, the R2 and the HF+ Discovery from Airspy. Thank you both. How the radios differ: Supported hardware.


📡 (pst… you scrolled this far, might as well)
                .
               /=\
          (    |#|    )
         ((    |#|    ))
        (((    |#|    )))
         ((    |#|    ))
          (    |#|    )
               |#|
              /|#|\
             / |#| \
            /  |#|  \
           /___|#|___\
          /    |#|    \
         '''''''''''''''

Yep, it's a radio tower. I'm a simple man, I see free time, I make ASCII art.

73 de sdrtop: ham-speak for "catch you later." 📻


Credits · Contributing · License: GPL-3.0-or-later

About

Terminal monitor for SDR hardware - written in Rust. Early development.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

324 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages