Web-based SDR receiver

How to run a web-based SDR with OpenWebRX+

Tools
OpenWebRX+, RTL-SDR / Airspy / SDRplay, Raspberry Pi OS bookworm
Skill / setup
intermediate · 2–3 hours · ~$130–$145 (RTL-SDR Blog v4 ~$40 + Raspberry Pi 4 4GB ~$55 + 32GB SD ~$10 + antenna ~$25–$35)
See how it compares to Squelch Deck

OpenWebRX+ turns a Linux box and an SDR into a full receiver accessible from any web browser on your network — waterfall, demodulators (AM/FM/SSB), digital decoders (FT8, FT4, JS8, WSPR, DMR, M17, D-STAR, YSF, POCSAG, and more), bookmarks, and multi-user listening all in the browser, no client install needed. It's the same idea you've seen on websdr.org or kiwisdr.com/public/ — except this one is yours, on your hardware, on your antenna. This guide gets OpenWebRX+ running on a Raspberry Pi, tuned to a useful band, and accessible from any device on your LAN.

What you'll have at the end

A browser at http://your-pi.local:8073/ showing the OpenWebRX+ interface — a live FFT and waterfall of whatever your SDR is tuned to, a band/frequency picker, demodulator selector (USB/LSB/AM/NFM/WFM), and a sidebar where digital decoders post their output in real time. Multiple people on the same network can connect simultaneously; each gets their own demodulator anchored on the waterfall while the SDR itself stays tuned wherever the band-profile says.

The killer feature is the digital decoder integration: park the receiver on the 14.074 MHz FT8 watering hole and the right-side panel fills up with decoded FT8 spots within seconds — no WSJT-X install, no client to configure. Same story for the M17 reflector frequencies, the DMR Brandmeister talkgroups, and the POCSAG pager channels. The receiver doubles as a teaching tool and as a useful day-to-day listening platform.

What you need

Hardware. A Raspberry Pi 4 or Pi 5 (4GB minimum; 8GB if you plan to run multiple decoders simultaneously). Pi 5 is significantly snappier — the digital decoders are CPU-bound and the Pi 5's Cortex-A76 cores make a real difference. An SDR: OpenWebRX+ supports RTL-SDR, Airspy R2 / HF+ / Mini, SDRplay (all models), HackRF, PlutoSDR, LimeSDR, and several others. RTL-SDR Blog v4 (~$40) is the most common and works well for HF (with the Direct Sampling Q-branch trick), VHF, and UHF up to about 1.7 GHz. An appropriate antenna for whatever band you want to monitor. Wired Ethernet to the Pi — the web UI streams waterfall data and decoded audio to clients, so the LAN side of things matters.

Software. Raspberry Pi OS bookworm 64-bit (or any modern Debian/Ubuntu — Docker also works on macOS / Windows if you don't have a Pi). OpenWebRX+ ships as a Debian package from jketterl's repo and via Docker Hub. We'll use the apt path because it's cleaner for headless deployments.

Time. See the frontmatter at the top of this page. Skill level. Comfortable with SSH, apt, editing a JSON config file, and basic firewall configuration. The "+" in OpenWebRX+ means the actively-maintained fork by Jakob Ketterl that includes the expanded digital-mode set; everything below assumes you're installing that fork.

Step-by-step setup

1. Prep the Pi

Flash Raspberry Pi OS bookworm 64-bit, set SSH + Wi-Fi + hostname via Raspberry Pi Imager, boot, find the IP, SSH in.

sudo apt update && sudo apt upgrade -y

Plug the SDR into a powered USB hub or directly into the Pi's USB 3 port. Confirm the dongle enumerates:

sudo apt install -y rtl-sdr
rtl_test -s 2400000

If rtl_test errors with "usb_open error -3", blacklist the kernel DVB driver and unload it:

echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/blacklist-rtl.conf
sudo modprobe -r dvb_usb_rtl28xxu

Re-run rtl_test; you should see device info and a clean 5-second sample test.

2. Add the OpenWebRX+ apt repository

Jakob Ketterl maintains a Debian repo with prebuilt packages. Add it:

sudo apt install -y curl gnupg
sudo mkdir -p /usr/share/keyrings
curl -fsSL https://repo.openwebrx.de/openwebrx.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/openwebrx.gpg
echo "deb [signed-by=/usr/share/keyrings/openwebrx.gpg] https://repo.openwebrx.de/debian/ bookworm main" | sudo tee /etc/apt/sources.list.d/openwebrx.list
sudo apt update

If you're on Ubuntu, replace bookworm with the matching Debian-release codename (Ubuntu 22.04 → bullseye, Ubuntu 24.04 → bookworm). For non-Debian distros, fall back to the Docker install path documented at github.com/jketterl/openwebrx.

3. Install OpenWebRX+

sudo apt install -y openwebrx

The package pulls in a large dependency tree (Python, all the digital decoders' native libraries, the JS frontend assets) — give it a minute or two. When it finishes, OpenWebRX+ is registered as a systemd service:

sudo systemctl enable openwebrx
sudo systemctl start openwebrx
sudo systemctl status openwebrx

status should show active (running). The default port is 8073.

4. Set up your admin account

OpenWebRX+ ships with no default user — you create one on first launch. From the Pi, run:

sudo openwebrx admin adduser admin

It prompts twice for a password. (Use a real password — by default the receiver binds to all interfaces, and the admin panel can change SDR config and band settings.)

Browse to http://your-pi-ip:8073/ from a laptop on the same network. You should see the default landing page with the receiver waterfall (likely a default profile on the FM broadcast band, depending on which SDR profiles got auto-populated). Log in via the gear icon → admin login.

5. Configure your SDR profile

The most important config file is /etc/openwebrx/sdrs.json. It defines which SDR(s) the receiver knows about, what center frequency / sample rate to use, what gain, and what "band profiles" are exposed in the UI (e.g., "20m amateur band", "VHF airband", "2m repeater band"). Open it:

sudo nano /etc/openwebrx/sdrs.json

The shipped file has examples for RTL-SDR, Airspy, SDRplay. Find your device's stanza and adjust:

  • name — display name shown in the UI dropdown.
  • type — driver type (rtl_sdr, airspy, sdrplay, etc.).
  • device — usually empty for a single dongle; set to a specific serial number if you have multiple.
  • samp_rate — sample rate in Hz (2400000 is good for RTL-SDR Blog v4).
  • rf_gain — usually a numeric dB value like "40"; some dongles accept "auto".
  • profiles — a dictionary of named band profiles. Each profile pins a center frequency and starting demodulator.

Example: a profile for 20m ham band SSB:

"20m": {
  "name": "20m amateur band",
  "center_freq": 14150000,
  "rf_gain": 40,
  "samp_rate": 2400000,
  "start_freq": 14074000,
  "start_mod": "usb"
}

Add as many profiles as you want — each appears in the receiver's "Profile" dropdown. After editing, restart the service:

sudo systemctl restart openwebrx

Refresh the browser; your new profile should appear in the dropdown.

6. Enable digital decoders

The digital decoders (FT8, FT4, JS8, WSPR, DMR, M17, POCSAG, etc.) are activated per-profile. In sdrs.json, add a services key to a profile to start them on profile activation:

"20m": {
  ...
  "services": ["ft8", "ft4", "js8", "wspr"]
}

Some decoders (DMR, M17, D-STAR, YSF) need extra system packages — apt install openwebrx-codecserver-fdmdv for DMR/M17/D-STAR voice, apt install openwebrx-additional-decoders for the full digital-mode set. Check the OpenWebRX+ Discord pinned messages or the GitHub README for current package names; they shift between releases.

Once enabled, the right-side panel of the web UI fills with decoded messages whenever the profile is active and there's traffic on the band.

7. (Optional) Receiver registry — listing your station publicly

OpenWebRX+ can publish a public listing at receiverbook.de so other enthusiasts can find your receiver. This is opt-in. Edit /etc/openwebrx/openwebrx.conf:

[receiverbook]
api_key = your-key-from-receiverbook.de
publish = True

After restart, your station shows up on the receiverbook map. Don't enable this if your antenna is in a location where you'd rather not draw public attention.

8. (Optional) Expose to the internet — VPN, not port-forward

Internal LAN access is fine; exposing port 8073 directly to the internet is asking for trouble. Use Tailscale, WireGuard, or another VPN to give yourself remote access:

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

Then connect to http://<tailscale-ip>:8073/ from any device on your tailnet. The receiver-book listing already provides a public path if you want one — that route includes connection limits and a properly-handled auth layer.

Common gotchas

apt install openwebrx fails on Ubuntu with "package not found". The repo URL hardcodes the Debian codename. On Ubuntu, you have to match the underlying Debian release (24.04 → bookworm; 22.04 → bullseye; etc.). If you're on something else entirely, switch to the Docker install.

The web UI loads but the waterfall is blank. Almost always means the SDR isn't producing samples. Check journalctl -u openwebrx -f and look for "could not open device" or "samp_rate not supported". If it's a USB issue, switch to a powered hub. If the sample rate isn't supported, drop to a known-good value (e.g., 1024000 or 2048000 for older RTL-SDR sticks).

Audio cuts out for clients beyond the first. OpenWebRX+'s default install limits concurrent clients. Edit /etc/openwebrx/openwebrx.conf and bump max_clients to whatever your CPU + uplink can handle. Each client at full waterfall is ~150 kbps; per-decoder costs are negligible.

Decoders are listed in the UI but report no output. Two common causes: (1) the band profile isn't where the digital traffic actually is — e.g., FT8 lives at 14.074 MHz USB on 20m, not the band center; double-check start_freq and start_mod. (2) The profile's bandwidth doesn't cover where the decoder expects to find signals — FT8 needs at least a few kHz of audio bandwidth above the dial frequency; SSB profile with a 3 kHz filter is what you want.

Admin password reset. You forgot your password and you need to log into the admin panel. From the Pi:

sudo openwebrx admin removeuser admin
sudo openwebrx admin adduser admin

That deletes the user and re-creates it with a new password. Profiles, bookmarks, and config are untouched.

Pi 4 overheats and the receiver gets choppy. Active decoders are CPU-heavy. If you're running FT8 + FT4 + JS8 + WSPR simultaneously and the Pi 4 thermal-throttles, fit a heatsink + fan or move to a Pi 5. vcgencmd measure_temp shows current die temp — anything over 75°C is throttling territory.

What to do next

For a more focused single-protocol setup, pair this guide with DSD+ for P25/DMR voice (OpenWebRX+ does some of this in-browser, but DSD+ is more capable for trunked digital voice) or with the Airspy Server guide (if you want the SDR streaming over the network for use in other clients like SDR# / SDR++, that's a complementary protocol — you can run both on the same Pi if it has the CPU headroom). The OpenWebRX+ project's GitHub README and Discord are the best places to track config-key changes between releases — the project moves fast, especially around digital-mode support. For ham-radio adjacent listening, the hamradiosignals.com WebSDR list is a good map of public receivers worldwide that you can compare your station against.

Local DIY vs. Squelch Deck

DimensionLocal DIYSquelch Deck
Setup time2–3 hours~1 minute (tap the app)
Hardware cost~$130–$145One device
Ongoing maintenanceOS updates, dependency drift, debugging when it breaksApp updates roll through the Squelch Deck catalog
Customization ceilingTotal — you own the stackBounded by what apps support; you can build new apps
Skill requiredSSH, JSON editing, basic ham/SDR band knowledgeTouchscreen
Best forPeople who want a public-facing or family-shared receiver with a browser UIPeople who want it to work on a dedicated box
Join the list

Sources we drew from