NovaSDR is a WebSDR server that streams waterfall/spectrum and demodulated audio to a browser UI.
- Backend: Rust (SoapySDR + OpenCL clFFT in the recommended build; CPU-only builds are supported)
- Codecs: waterfall
zstd, audioflac - Transport: WebSockets for real-time streams + HTTP for static UI
👉 Join the forum: https://forum.sdr-list.xyz/
crates/novasdr-server/: server, WebSocket endpoints, DSP runnercrates/novasdr-core/: configuration, DSP primitives, codecs, protocol typesfrontend/: React UI (shadcn/ui), built as static files and served by the serverdocs/: maintained documentation (start atdocs/index.md)
Installer URL:
curl -fsSL https://novasdr.com/install.sh | shThe installer supports:
- Building NovaSDR from source
- Building and installing SoapySDR from source (always; recommended for direct hardware access)
- Installing OpenCL headers/runtime (optional)
- Installing Vulkan/glslang/SPIRV-Tools (optional; needed for
--features vkfftbuilds) - Building a SoapySDR device module from source (RTL-SDR, HackRF, Airspy, etc. where supported)
See docs/INSTALL.md for details.
NovaSDR runs either with:
- SoapySDR (recommended; direct hardware access), or
- stdin (pipe raw samples from an external capture tool as stdin), or
- fifo (pipe raw samples from an external capture tool as a file).
The sections below are copy/paste one-liners for a full source build (Rust + frontend + SoapySDR + OpenCL + clFFT).
Debian/Ubuntu (apt)
sudo apt-get update && sudo apt-get install -y --no-install-recommends \
ca-certificates curl git tar \
build-essential cmake pkg-config \
clang libclang-dev \
swig python3 python3-dev python3-numpy \
nodejs npm \
ocl-icd-opencl-dev ocl-icd-libopencl1 \
libclfft-dev \
libusb-1.0-0-dev \
libopus-devFedora (dnf)
sudo dnf install -y \
ca-certificates curl git tar \
gcc gcc-c++ make cmake pkgconf-pkg-config \
clang llvm-devel libclang-devel \
swig python3 python3-devel python3-numpy \
nodejs npm \
ocl-icd ocl-icd-devel \
libusb1-devel \
opus-develArch (pacman)
sudo pacman -Sy --noconfirm --needed \
ca-certificates curl git tar \
base-devel cmake pkgconf \
clang llvm libclang \
swig python python-numpy \
nodejs npm \
ocl-icd opencl-headers \
libusb \
opusopenSUSE (zypper)
sudo zypper --non-interactive refresh && sudo zypper --non-interactive install -y \
ca-certificates curl git tar \
gcc-c++ make cmake pkg-config \
clang llvm llvm-devel libclang-devel \
swig python3 python3-devel python3-numpy \
nodejs npm \
OpenCL-Headers ocl-icd-devel \
libusb-1_0-devel \
libopus-develmacOS (Homebrew)
brew update && brew install \
git cmake pkg-config \
llvm \
swig python \
node \
libusb \
opusNote
If you see a bindgen error like Unable to find libclang, set LIBCLANG_PATH (for example on macOS: export LIBCLANG_PATH="$(brew --prefix llvm)/lib"), then rebuild.
cargo build -p novasdr-server --release --features "soapysdr,clfft"
cd frontend && npm ci && npm run build && cd ..If you want stdin-only mode, omit soapysdr. If you want a CPU-only build, omit clfft.
Recommended: run the interactive wizard:
./target/release/novasdr-server setup -c config/config.json -r config/receivers.jsonTo edit an existing configuration with the same wizard:
./target/release/novasdr-server configure -c config/config.json -r config/receivers.jsonOr edit config/config.json and config/receivers.json manually:
config/config.json: server/websdr/limits +active_receiver_idconfig/receivers.json: receiver + input settings (sample rate, FFT size, sample format, signal type)
./target/release/novasdr-server -c config/config.json -r config/receivers.jsonOpen: http://localhost:9002
With --features soapysdr, NovaSDR can open SDR devices directly from config/receivers.json (receivers[].input.driver.kind = "soapysdr"), or you can run novasdr-server setup to scan devices and generate receivers. In the recommended build we enable both soapysdr and clfft.
SoapySDR itself is a system library. For maximum compatibility, build SoapySDR from source:
git clone https://github.com/pothosware/SoapySDR.git
cd SoapySDR
mkdir build && cd build
cmake ..
make -j"$(nproc)"
sudo make install
sudo ldconfig # Debian/Ubuntu
SoapySDRUtil --infoThe simplest workflow is:
- Build with
--features "soapysdr,clfft" - Run
novasdr-server setupand select a device (first launch will prompt automatically when config files are missing) - Run
novasdr-server
If you prefer to write config/receivers.json manually, an RTL-SDR example looks like:
{
"kind": "soapysdr",
"device": "driver=rtlsdr",
"channel": 0,
"format": "cs16",
"agc": false,
"gain": 35.0,
"gains": { "LNA": 30.0 },
"settings": { "biastee": "true" }
}Make sure input.driver.format and input.signal match what the capture tool outputs.
rtl_sdr -g 48 -f 100900000 -s 2048000 - | ./target/release/novasdr-server -c config/config.json -r config/receivers.jsonhackrf_transfer -r - -f 100900000 -s 8000000 | ./target/release/novasdr-server -c config/config.json -r config/receivers.jsonairspy_rx -r - -f 648000 -s 912000 | ./target/release/novasdr-server -c config/config.json -r config/receivers.jsonrx888_stream -s 6000000 | ./target/release/novasdr-server -c config/config.json -r config/receivers.jsonStart here: docs/index.md
Key docs:
docs/BUILDING.mddocs/CONFIG.mdanddocs/CONFIG_REFERENCE.mddocs/PROTOCOL.mddocs/ARCHITECTURE.mddocs/DSP.md,docs/AUDIO.md,docs/WATERFALL.mddocs/OPERATIONS.mdanddocs/TROUBLESHOOTING.mddocs/LICENSING.mdanddocs/THIRD_PARTY.md
The GitHub wiki is published from docs/ (see tools/publish_wiki.sh).
On Windows, use tools/publish_wiki.ps1.
NovaSDR is licensed under GPLv3.
LICENSENOTICE
NovaSDR is a continuation of PhantomSDR-plus (maintained by magicint1337) and includes contributions from NovaSDR contributors.
Copyright (c) 2025-2026, magicint1337.
Copyright (c) 2025-2026, NovaSDR contributors.
See NOTICE and docs/LICENSING.md for details and upstream attribution.
