Remote SDR streaming

How to stream your SDR over the network with Airspy Server

Tools
spyserver, SDR++ or SDR#, Raspberry Pi OS bookworm
Skill / setup
intermediate · 2–3 hours · ~$130–$155 (RTL-SDR Blog v4 ~$40 + Raspberry Pi 4 4GB ~$55 + 32GB SD ~$10 + outdoor antenna ~$35–$45; client machine assumed)
See how it compares to Squelch Deck

The best place for your antenna is rarely the best place for your laptop. Airspy Server (spyserver) bridges that gap — it runs on a small Linux box (Raspberry Pi, NUC, attic server) sitting next to the antenna, and streams I/Q data over TCP to a client like SDR++ or SDR# running anywhere on your LAN. This guide sets up a headless Pi-based spyserver with a single RTL-SDR, then connects to it from a laptop in another room.

What you'll have at the end

A Raspberry Pi (or any small Linux host) running spyserver as a systemd service, exposing your RTL-SDR over TCP on port 5555. On your everyday laptop — same LAN — SDR++ connects to that server's IP, and the experience is indistinguishable from running the SDR locally: full waterfall, AM/FM/SSB demodulation, scanner, recorder. The Pi lives in the attic with a 25-foot coax run to an outdoor discone; the laptop lives wherever you happen to be that day. Same RF, no carrying the dongle around, no compromises on antenna placement because of where your desk happens to sit.

Two clients can connect simultaneously — useful if you and a partner both want to listen on different frequencies from the same SDR. The server multiplexes; the SDR itself stays tuned to whatever the first client sets, but each client gets independent demodulation downstream.

What you need

Hardware (server side). A Raspberry Pi 4 or Pi 5 (4GB is plenty). An RTL-SDR Blog v4 (~$40) is the most common dongle; Airspy R2 or HF+ Discovery also work and are what spyserver was originally built for. A short USB extension cable to keep the dongle off the Pi's housing (cleaner RF). An outdoor or attic antenna with a 10–30 ft coax run to wherever the Pi lives — a discone for broadband VHF/UHF or a band-specific antenna if you have a target. Wired Ethernet to the Pi: critical. Wi-Fi works but adds latency and packet loss that breaks decoding under load.

Hardware (client side). Any Windows / macOS / Linux machine on the same network (or accessible via VPN). No SDR plugged in on the client; it just consumes the stream.

Software. On the server: Raspberry Pi OS bookworm 64-bit, the spyserver binary from airspy.com, rtl-sdr package. On the client: SDR++ (cross-platform, recommended) or SDR# / Airspy SDR Sharp (Windows only, also good — both have built-in spyserver source modules).

Time. See the frontmatter at the top of this page. Skill level. Comfortable with SSH, editing config files, running systemd units, and basic LAN networking.

Step-by-step setup

1. Prep the server hardware

Flash Raspberry Pi OS bookworm 64-bit to an SD card. Set up SSH and Wi-Fi credentials via the Raspberry Pi Imager's advanced options so the Pi comes up headless. Boot the Pi, find its IP from your router's DHCP table, SSH in.

Update first:

sudo apt update && sudo apt upgrade -y

Plug the RTL-SDR into the Pi via a powered USB hub if you can; the Pi 4 / 5 USB ports are usually enough but a hub gives headroom for adding a second dongle later.

2. Verify the RTL-SDR is seen

Install rtl-sdr tools and confirm the dongle enumerates:

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

You should see device info and a 5-second sample rate test. If you get "lost samples" warnings, fix USB power before continuing — spyserver is unforgiving about USB underruns.

Blacklist the kernel DVB driver (it grabs the dongle and prevents userspace access):

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

3. Download spyserver

Grab the latest ARM64 build from airspy.com (the official airspy.com/download page has builds for Linux x86_64, Linux ARM32, Linux ARM64, and Windows). For a Pi 4/5 running 64-bit Pi OS, you want the ARM64 build.

cd ~
wget https://airspy.com/?ddownload=5795 -O spyserver-arm64.tgz
tar xzf spyserver-arm64.tgz
cd spyserver-arm64

The package contains spyserver, spyserver.config, and a README. No make installspyserver runs from wherever you extracted it.

4. Configure spyserver

Open spyserver.config in your editor:

nano ~/spyserver-arm64/spyserver.config

Key fields to set:

  • device_typeRTL-SDR for an RTL-SDR dongle; AirSpy for an Airspy R2; AirSpyHF+ for the Discovery.
  • device_sample_rate — 2400000 (2.4 MS/s) for RTL-SDR v4; 2048000 for older v2 sticks.
  • bind_host0.0.0.0 to accept connections from any LAN IP. 127.0.0.1 if you only want to use it locally on the same Pi.
  • bind_port5555 is the default; pick something else if 5555 is taken.
  • maximum_clients2 is reasonable for a household; bump to 4 if you want more concurrent connections (more clients means more upstream bandwidth, but each one is only ~10 Mbps for full-rate RTL-SDR).
  • device_serial — leave at 0 for the first/only RTL-SDR. Set to a specific serial if you have multiple dongles and want to pin this server to one.

Save and exit.

5. First run (foreground)

cd ~/spyserver-arm64
./spyserver spyserver.config

You should see startup banners showing the device type, sample rate, and "Listening on 0.0.0.0:5555". Leave it running.

From the Pi, run ip addr show in another terminal and note the Pi's LAN IP (e.g., 192.168.1.42). That's what your client connects to.

6. Connect from SDR++ on your laptop

On your laptop, open SDR++. In the Source module, change the source to SpyServer (it's in the dropdown; if you don't see it, your SDR++ is older — update to a recent release). In the source's config fields, enter:

  • Host: the Pi's IP (e.g., 192.168.1.42)
  • Port: 5555 (or whatever you set in step 4)
  • Username/password: leave blank unless you set them in the config

Hit the play button. The FFT and waterfall should come alive, identical to a local RTL-SDR. Tune to a known active frequency (your local airband ATIS, an FM broadcast station, whatever) and confirm audio works.

If the connection fails, the most common cause is a firewall on the Pi blocking inbound 5555. Run on the Pi:

sudo ufw allow 5555/tcp

(If ufw isn't installed, the Pi probably has no firewall and the issue is elsewhere — check bind_host is set to 0.0.0.0 and that the laptop and Pi are on the same subnet.)

7. Daemonize with systemd

Once foreground operation is solid, set spyserver to run as a service. Create /etc/systemd/system/spyserver.service:

[Unit]
Description=Airspy SpyServer
After=network-online.target

[Service]
Type=simple
User=spy
WorkingDirectory=/home/spy/spyserver-arm64
ExecStart=/home/spy/spyserver-arm64/spyserver /home/spy/spyserver-arm64/spyserver.config
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

Adjust the User= and paths to match where you extracted the package. Then:

sudo systemctl daemon-reload
sudo systemctl enable spyserver
sudo systemctl start spyserver
journalctl -u spyserver -f

The journalctl tail mirrors what the foreground run showed.

8. (Optional) Run multiple SDRs from the same Pi

If you've got a second RTL-SDR (e.g., one for VHF airband, one for UHF public-safety), spawn a second spyserver instance with its own config file pointing to a different bind_port and device_serial. Create a second systemd unit (spyserver-uhf.service) following the same pattern. Each instance is independent — clients connect to whichever port maps to the band they want.

The Pi 5 handles two simultaneous 2.4 MS/s streams comfortably; a Pi 4 starts to get warm under that load. If you go beyond two streams, switch to an NUC or any x86 mini-PC.

Common gotchas

Wi-Fi instead of Ethernet on the server. A full-rate RTL-SDR stream is about 10 Mbps. Wi-Fi nominally handles that easily, but jitter and packet loss are the problem — even a 50 ms hiccup creates audible glitches in decoded audio and breaks Trunk Recorder's control-channel lock. Wire the server. If you really can't, drop device_sample_rate to 1024000 (1 MS/s) which cuts bandwidth in half and gives the Wi-Fi some headroom.

"Listening on 0.0.0.0:5555" but client can't connect. Three possible causes, in order: (1) ufw or iptables blocking port 5555 on the server — run sudo ufw allow 5555/tcp and sudo ss -tlnp | grep 5555 to confirm spyserver is actually bound. (2) The laptop and Pi are on different subnets — check both IPs are in the same /24 block. (3) bind_host set to 127.0.0.1 instead of 0.0.0.0 — that limits the server to localhost only.

Client connects but waterfall is dead silent. Spyserver started before the RTL-SDR was plugged in. Restart the service: sudo systemctl restart spyserver. Verify with rtl_test that the dongle still enumerates.

RTL-SDR works for one client but the second client gets garbled audio. You exceeded maximum_clients in the config or you're running both clients on the same Wi-Fi link, doubling the bandwidth needs. Bump maximum_clients; switch one client to wired Ethernet if possible.

Spyserver consumes the whole Pi CPU. On a Pi 4 running at 2.4 MS/s, expect one core to sit near 100% during active streaming. That's normal. On a Pi 5, it's noticeably lighter (~50% of one core). If the Pi runs other workloads (Trunk Recorder, dump1090, etc.), consider a dedicated host or move to a Pi 5.

What to do next

The remote streaming setup is the foundation for several other workflows: feed your spyserver into Trunk Recorder running on the same Pi to follow trunked systems (point Trunk Recorder's source to the local spyserver instead of the USB device directly), or run DSD+ on Windows consuming the same stream remotely. The Airspy SpyServer documentation is the canonical reference for advanced settings: bandwidth limits, FFT compression, authentication for WAN access. For exposing your spyserver beyond the LAN (so you can listen from outside your home network), set up a VPN (Tailscale and WireGuard are both painless options) rather than port-forwarding raw 5555 to the internet — spyserver has minimal auth and exposing it directly to WAN is asking for abuse.

Local DIY vs. Squelch Deck

DimensionLocal DIYSquelch Deck
Setup time2–3 hours~1 minute (tap the app)
Hardware cost~$130–$155One 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, systemd, basic LAN networkingTouchscreen
Best forOperators who want the antenna in one place and the laptop elsewherePeople who want it to work on a dedicated box
Join the list

Sources we drew from