A terminal-first SDR monitoring and analysis toolkit for Python. SDRmon provides a full-featured Textual-based UI for exploring RF spectrum directly from your terminal.
- Native SDR Backends: Connect directly to RTL-SDR without needing Python
ctypesoverhead. (Only RTL-SDR is supported natively so far) - Real-Time DSP: Built-in channel manager for FM demodulation and resampling.
- Spectrum & Waterfall Displays: Fast terminal graphics rendering.
- Audio Output: Demodulate and listen to signals via PortAudio.
- Scanner: Automatically scan a frequency range and halt on active signals.
- Capture & Replay: Record full IQ bandwidth to disk and replay later precisely as received.
- Cross-Platform: Works on Windows, macOS, and Linux terminals.
You can install SDRmon directly using uv (recommended) or pip:
uv tool install sdrmonTo include optional dependencies for TUI, DSP, and Audio:
uv tool install sdrmon[all]SDRmon uses a native C++ extension to talk to RTL-SDR hardware. You need the standard RTL-SDR DLL installed correctly:
- Download the latest
rtlsdr.dllandlibusb-1.0.dllfrom the RTL-SDR official releases. - Place them in your system PATH or in the same directory you run SDRmon.
- Make sure to use Zadig to replace the default USB driver with WinUSB.
Launch the interactive GUI:
sdrmonThis will open the startup screen where you can select an available SDR device, use a FakeSDR for testing, or replay a capture.
Check device and environment health:
sdrmon doctorList available SDR devices:
sdrmon devicesCapture 5 seconds of raw IQ data (10M samples at 2MS/s):
sdrmon capture --out signal.iq --samples 10000000Replay a capture:
sdrmon replay signal.iqOnce inside the monitor screen:
- Frequency/Gain/Rate: Use the sidebar to tune frequency, change gain, and set sample rate.
- Demodulation: The Audio control panel allows setting Mode (WFM/NFM/AM), Squelch, and Volume.
- Zoom/Scale: Adjust FFT zooming and DB scaling interactively.
- Actions:
SCAN: Enter Scanner mode.CAPTURE: Open the capture dialogue.REPLAY: Browse available.iqfiles for replay.QUIT: Exit SDRmon.
You can use the SDRmon components directly in your own scripts. See the examples/ directory for demonstrations of device usage, spectrum analysis, channel DSP, and PortAudio playback.
from sdrmon.backends import initialize_backends
from sdrmon.native.manager import NativeSDRManager
from sdrmon.core.settings import StreamConfig
initialize_backends()
mgr = NativeSDRManager()
dev = mgr.open("rtlsdr:0")
with dev.stream(StreamConfig(frequency=100_000_000, sample_rate=2_000_000)) as stream:
for block in stream:
print(f"Received {len(block.samples)} complex samples!")MIT