Newspicel/sdrminusminus

modular, client–server software-defined radio

3

stars

469

commits

Rust

primary language

Sep 14, 2026

updated

newspicel.github.io/sdrminusminus/
dsp
hackrf
ham-radio
rtl-sdr
rust
sdr
software-defined-radio

README

sdr-- logo

sdr--

sdr-- is a software-defined radio application with a visual signal path. Connect devices, decoders, displays, and recorders on a canvas, then pin the controls you use to a rack.

A Rust server handles the radio and signal processing. The React interface runs in a desktop window or browser. You can run both on one computer, or leave the server beside the antenna and connect over the network. A built-in signal generator lets you try it without an SDR.

A device connected to three channels, a speaker, an audio recorder, and a network IQ output

Status

sdr-- is under active development. Most decoders have been tested with generated IQ fixtures; only some have been verified on air. The channel catalog lists the evidence for each mode and its limitations. Experimental modes may provide acquisition or measurements without decoded audio or video.

What you can do

  • Listen to AM, NFM, broadcast FM with stereo and RDS, SSB, and supported digital voice modes.
  • Decode aircraft, ship, amateur, pager, sensor, and other radio traffic. See the full channel list.
  • View spectrum, waterfalls, decoded messages, position maps, and received images.
  • Scan frequencies and save workspaces, presets, and bookmarks.
  • Record device IQ, channel baseband, or audio; replay IQ through the same decoders.
  • Use coherent receivers for direction finding, antenna combining, beamforming, and passive radar.
  • Export IQ over UDP or TCP and forward decoded events to webhooks, Matrix, or MQTT.
  • Control the running receiver through REST, WebSocket, or MCP.

Install

Download a desktop installer or portable server from GitHub Releases. Installation instructions cover each package, Homebrew, Nix, and containers.

On macOS, install the desktop app with Homebrew:

brew tap newspicel/tap
brew install --cask sdrminusminus

For the headless server, use brew install sdrmm.

To run the server with Docker Compose on Linux:

git clone https://github.com/Newspicel/sdrminusminus.git
cd sdrminusminus
docker compose up -d

Open http://localhost:8080. The server has no authentication by default; see configuration and security when setting up network access.

Try a receiver

  1. On the starter Device node, choose Signal Generator (virtual). The connected Scope shows the generated signals.
  2. Choose + Node and add an NFM channel.
  3. Connect Device IQ to NFM IQ, then NFM audio to Speaker audio.
  4. Set the channel to 300 kHz above the radio's centre and start audio on the Speaker. You should hear a 1 kHz tone.

Your first receiver walks through the controls and switching to hardware.

Standard builds include native RTL-SDR, HackRF, SDRplay, and CR-8 drivers. SDRplay and CR-8 also require their vendor libraries. Desktop installers and containers bundle SoapySDR modules for Airspy/AirspyHF, bladeRF, LimeSDR, PlutoSDR, and SoapyRemote. See the hardware guide for requirements.

Screenshots

These captures use the built-in signal generator or repository IQ fixtures. Regenerate them with cargo xtask screenshots.

Spectrum and waterfallRack view
Spectrum with the tuned channel markedThree receivers in the rack
FT8 decodingSignal identification
Decoded messages from a recorded 20 m FT8 slotSignal measurements and candidate protocols
Aircraft positionsShip positions
ADS-B aircraft and decoder logAIS position in Hamburg harbour
Slow-scan televisionAmateur television
Robot 36 SSTV picture625-line ATV test image
Pager messagesBroadcast FM
POCSAG messages with webhook outputRDS station name, text, and alternate frequencies

Build from source

You need the repository's pinned Rust toolchain, a C/C++ compiler, CMake, Node 26, pnpm 11, and SoapySDR 0.8 development files. The build guide lists platform prerequisites.

git clone https://github.com/Newspicel/sdrminusminus.git
cd sdrminusminus
pnpm --dir web install --frozen-lockfile
pnpm --dir web build
cargo run -p sdrmm

Open http://localhost:8080. For development, cargo xtask dev starts the server and a frontend with hot reload at http://localhost:5173. Add --watch to restart the backend when its files change.

To build with only virtual sources and network receivers:

cargo run -p sdrmm --no-default-features --features net-client

Development

PathPurpose
apps/sdrmmHeadless server binary
apps/desktopTauri desktop shell
crates/dsp, crates/modemSignal-processing primitives and reusable modem algorithms
crates/engineDevice and signal-processing orchestration
crates/channelsDemodulators and protocol decoders
crates/device-*Native, SoapySDR, network, virtual, and array backends
crates/wireShared API, WebSocket, and settings types
crates/serverHTTP, WebSocket, MCP, persistence, and embedded frontend
webReact application
docsmdBook documentation
CommandPurpose
cargo xtask checkFormat, lint, type-check, build, and check generated-code drift
cargo xtask testRun Rust and frontend tests without hardware
cargo xtask smokeRun the browser test against the server
cargo xtask codegenRegenerate OpenAPI and TypeScript API types
cargo xtask auditCheck dependencies with cargo-deny

See Contributing and the development guide for testing, generated files, and releases.

Documentation and API

License

Copyright (C) 2026 sdr-- contributors.

sdr-- is licensed under the GNU General Public License, version 3 or later. THIRD_PARTY_NOTICES.md lists distributed dependencies and bundled hardware components. Their license texts are also available in the app's About panel.

Contributors

Newspicel

463 commits

Newspicel/sdrminusminus

modular, client–server software-defined radio

3

stars

469

commits

Rust

primary language

Sep 14, 2026

updated

newspicel.github.io/sdrminusminus/
dsp
hackrf
ham-radio
rtl-sdr
rust
sdr
software-defined-radio

README

sdr-- logo

sdr--

sdr-- is a software-defined radio application with a visual signal path. Connect devices, decoders, displays, and recorders on a canvas, then pin the controls you use to a rack.

A Rust server handles the radio and signal processing. The React interface runs in a desktop window or browser. You can run both on one computer, or leave the server beside the antenna and connect over the network. A built-in signal generator lets you try it without an SDR.

A device connected to three channels, a speaker, an audio recorder, and a network IQ output

Status

sdr-- is under active development. Most decoders have been tested with generated IQ fixtures; only some have been verified on air. The channel catalog lists the evidence for each mode and its limitations. Experimental modes may provide acquisition or measurements without decoded audio or video.

What you can do

  • Listen to AM, NFM, broadcast FM with stereo and RDS, SSB, and supported digital voice modes.
  • Decode aircraft, ship, amateur, pager, sensor, and other radio traffic. See the full channel list.
  • View spectrum, waterfalls, decoded messages, position maps, and received images.
  • Scan frequencies and save workspaces, presets, and bookmarks.
  • Record device IQ, channel baseband, or audio; replay IQ through the same decoders.
  • Use coherent receivers for direction finding, antenna combining, beamforming, and passive radar.
  • Export IQ over UDP or TCP and forward decoded events to webhooks, Matrix, or MQTT.
  • Control the running receiver through REST, WebSocket, or MCP.

Install

Download a desktop installer or portable server from GitHub Releases. Installation instructions cover each package, Homebrew, Nix, and containers.

On macOS, install the desktop app with Homebrew:

brew tap newspicel/tap
brew install --cask sdrminusminus

For the headless server, use brew install sdrmm.

To run the server with Docker Compose on Linux:

git clone https://github.com/Newspicel/sdrminusminus.git
cd sdrminusminus
docker compose up -d

Open http://localhost:8080. The server has no authentication by default; see configuration and security when setting up network access.

Try a receiver

  1. On the starter Device node, choose Signal Generator (virtual). The connected Scope shows the generated signals.
  2. Choose + Node and add an NFM channel.
  3. Connect Device IQ to NFM IQ, then NFM audio to Speaker audio.
  4. Set the channel to 300 kHz above the radio's centre and start audio on the Speaker. You should hear a 1 kHz tone.

Your first receiver walks through the controls and switching to hardware.

Standard builds include native RTL-SDR, HackRF, SDRplay, and CR-8 drivers. SDRplay and CR-8 also require their vendor libraries. Desktop installers and containers bundle SoapySDR modules for Airspy/AirspyHF, bladeRF, LimeSDR, PlutoSDR, and SoapyRemote. See the hardware guide for requirements.

Screenshots

These captures use the built-in signal generator or repository IQ fixtures. Regenerate them with cargo xtask screenshots.

Spectrum and waterfallRack view
Spectrum with the tuned channel markedThree receivers in the rack
FT8 decodingSignal identification
Decoded messages from a recorded 20 m FT8 slotSignal measurements and candidate protocols
Aircraft positionsShip positions
ADS-B aircraft and decoder logAIS position in Hamburg harbour
Slow-scan televisionAmateur television
Robot 36 SSTV picture625-line ATV test image
Pager messagesBroadcast FM
POCSAG messages with webhook outputRDS station name, text, and alternate frequencies

Build from source

You need the repository's pinned Rust toolchain, a C/C++ compiler, CMake, Node 26, pnpm 11, and SoapySDR 0.8 development files. The build guide lists platform prerequisites.

git clone https://github.com/Newspicel/sdrminusminus.git
cd sdrminusminus
pnpm --dir web install --frozen-lockfile
pnpm --dir web build
cargo run -p sdrmm

Open http://localhost:8080. For development, cargo xtask dev starts the server and a frontend with hot reload at http://localhost:5173. Add --watch to restart the backend when its files change.

To build with only virtual sources and network receivers:

cargo run -p sdrmm --no-default-features --features net-client

Development

PathPurpose
apps/sdrmmHeadless server binary
apps/desktopTauri desktop shell
crates/dsp, crates/modemSignal-processing primitives and reusable modem algorithms
crates/engineDevice and signal-processing orchestration
crates/channelsDemodulators and protocol decoders
crates/device-*Native, SoapySDR, network, virtual, and array backends
crates/wireShared API, WebSocket, and settings types
crates/serverHTTP, WebSocket, MCP, persistence, and embedded frontend
webReact application
docsmdBook documentation
CommandPurpose
cargo xtask checkFormat, lint, type-check, build, and check generated-code drift
cargo xtask testRun Rust and frontend tests without hardware
cargo xtask smokeRun the browser test against the server
cargo xtask codegenRegenerate OpenAPI and TypeScript API types
cargo xtask auditCheck dependencies with cargo-deny

See Contributing and the development guide for testing, generated files, and releases.

Documentation and API

License

Copyright (C) 2026 sdr-- contributors.

sdr-- is licensed under the GNU General Public License, version 3 or later. THIRD_PARTY_NOTICES.md lists distributed dependencies and bundled hardware components. Their license texts are also available in the app's About panel.

Contributors

Newspicel

463 commits

Languages

Rust

79.2%

TypeScript

20.2%