Set up a receiver: Raspberry Pi + RTL-SDR with sdr-slc-rtld

This guide turns an RTL-SDR dongle on a Raspberry Pi into a full SDR-SLC receiver. Switch the Pi on, click Discover in the SDR-SLC client, and the receiver is there, already configured, with no addresses to type in.

It runs sdr-slc-rtld, the open-source SDR-SLC daemon for RTL-SDR. The client talks to it the same way it talks to every SDR-SLC radio, bladeRF and HF transceiver included.

What you get: a receiver from HF to about 1.7 GHz, found automatically by the client, with spectrum, waterfall and multiple slices. AM, FM, SSB and CW, and with the optional codec server also DMR, YSF and D-STAR.

Time: about half an hour, including a short compile.

Coming from the rtl_tcp guide? Your Pi, dongle and driver are already set up. Stop rtl_tcp, because only one program can use the dongle at a time, then continue at step 3:

sudo systemctl disable --now rtl-tcp

What you need

ItemNotes
Raspberry Pi 3B+, 4 or 5A Pi 4 or 5 is best for streaming at 2 MS/s around the clock.
Official Pi power supplyAn RTL-SDR draws around 300 mA, more with the bias tee on.
microSD card, 16 GB or more
RTL-SDR Blog V4Also works with a V3 or a V4L. See step 2.
Ethernet cableThe I/Q stream is continuous UDP. Wi-Fi with power saving causes gaps.
An antennaA long wire for HF, a vertical or discone for VHF/UHF.
A Mac with the SDR-SLC client 1.2From the Mac App Store.

Step 1: Raspberry Pi OS

  1. On your Mac, install Raspberry Pi Imager from raspberrypi.com/software.
  2. Choose your Pi model, then Raspberry Pi OS (other) → Raspberry Pi OS Lite (64-bit). This guide used the Debian 13 “trixie” release.
  3. In the customisation step, set:
    • a hostname, e.g. slc-rtl;
    • your username and password;
    • your time zone;
    • Enable SSH.
  4. Write the card, start the Pi with Ethernet connected, and log in from Terminal on your Mac:
ssh <user>@slc-rtl.local
sudo apt update && sudo apt full-upgrade -y
sudo reboot

Tip: if every login prints setlocale: LC_CTYPE: cannot change locale (UTF-8), that’s macOS Terminal sending a locale name Linux doesn’t know. Stop the Pi from accepting it:

sudo sed -i 's/^AcceptEnv LANG LC_\*/#&/' /etc/ssh/sshd_config
sudo systemctl restart ssh

Step 2: the RTL-SDR driver

Install

Debian ships the driver, including support for the RTL-SDR Blog V4 and its bias tee. librtlsdr-dev is needed to build the daemon:

sudo apt install -y rtl-sdr librtlsdr-dev

Keep the TV driver away from the dongle

Linux sees an RTL-SDR as a DVB-T television stick and loads a TV driver that blocks every SDR program. Block it, then reboot:

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

Plug in and test

Plug the dongle in after the reboot, then run this as your normal user, without sudo:

rtl_test -t

A V4 answers with RTL-SDR Blog V4 Detected.

If you get usb_open error -3: your user isn’t in the plugdev group, which Debian’s rule gives access to the dongle. Add yourself, then log out and back in:

sudo usermod -aG plugdev $USER

If you get Kernel driver is active: the TV-driver block didn’t take effect. Check the file from the previous step and reboot again.

Only for the RTL-SDR Blog V4L

The V4 went out of production in May 2026. Its successor, the V4L, needs driver version 2.0.3, which is newer than the one Debian ships. Build that version instead, and don’t install the two Debian packages above:

sudo apt remove -y rtl-sdr librtlsdr-dev librtlsdr2
sudo apt install -y git cmake build-essential pkg-config libusb-1.0-0-dev
git clone --branch v2.0.3 https://github.com/osmocom/rtl-sdr ~/rtl-sdr
cd ~/rtl-sdr && mkdir build && cd build
cmake .. -DINSTALL_UDEV_RULES=ON -DDETACH_KERNEL_DRIVER=ON
make -j4 && sudo make install && sudo ldconfig

rtl_test -t then reports RTL-SDR Blog V4 Lite Detected. The daemon in step 3 builds against this driver automatically.

Step 3: the receiver service, sdr-slc-rtld

Source code: github.com/pa2ix/sdr-slc-rtld.

Build and test

sudo apt install -y git build-essential python3
mkdir -p ~/src && cd ~/src
git clone https://github.com/pa2ix/sdr-slc-rtld
cd sdr-slc-rtld
make
make check 2>&1 | grep -E 'passed|FAIL'

make check runs the conformance tests against a simulated dongle. Every line should say passed.

Install as a service

The service runs as its own user, slc, which needs access to the dongle. The first line skips creating it if it already exists, for example because this Pi also runs the bladeRF daemon:

id slc >/dev/null 2>&1 || sudo useradd --system --no-create-home --shell /usr/sbin/nologin slc
sudo make install
sudo systemctl daemon-reload
sudo systemctl enable --now sdr-slc-rtld
journalctl -u sdr-slc-rtld -n 20 --no-pager

Look for:

  • the line sdr-slc-rtld 1.0 starting;
  • your receiver’s name, e.g. instance name SLC-4A21C8 from eth0;
  • the dongle being opened, without errors.

SLC-4A21C8 is how the receiver appears in the client. The last six characters come from the Pi’s network address, so yours will differ.

Settings

The service’s settings live in /etc/sdr-slc/rtld.conf, on the line starting with SLC_ARGS=. After a change, apply it with:

sudo systemctl restart sdr-slc-rtld
Want this?Set
A recognisable name instead of SLC-XXYYZZSLC_ARGS=-v --name SLC-shack-rtl
Power an LNA from the dongleSLC_ARGS=-v --bias-tee (the client can also switch the bias tee)
Frequency correction for your dongleSLC_ARGS=-v --ppm 1 (the V4 has a TCXO and rarely needs it)
HF on an RTL-SDR V3SLC_ARGS=-v --direct-q
A password for the receiversee Security below

HF on a V4: leave the settings as they are. The V4 has an HF upconverter built in, and the driver switches it in by itself whenever you tune below about 28.8 MHz. --direct-q is only for the V3, which has no upconverter.

Step 4: connect the client

  1. In the SDR-SLC client on your Mac, click Discover. Your receiver appears as SLC-XXYYZZ, or under the name you gave it.
  2. Select it. The client reads its frequency range, sample rates and gain settings from the receiver itself.
  3. Click Connect, and tune to a signal you know is there, such as a broadcast FM station or your local repeater’s output.

The receiver serves one stream at a time. A second client can connect, but can’t stream until the first one stops.

Optional: the codec server for digital voice

For DMR, YSF and D-STAR, add the vocoder service. It can run on this same Pi:

sudo apt install -y cmake pkg-config libjson-c-dev libavahi-client-dev avahi-daemon
cd ~/src
git clone --recursive https://github.com/pa2ix/sdr-slc-vocoderd
cd sdr-slc-vocoderd
make mbelib && make && make test 2>&1 | tail -1
sudo make install
sudo systemctl daemon-reload
sudo systemctl enable --now sdr-slc-vocoderd

It also shows up under Discover, next to your receiver. A DVSI AMBE-3000 stick (DVstick30, ThumbDV) is optional. Without one, the open-source mbelib-neo decoder does the work, and you can plug a stick in later without restarting anything.

Security

By default the receiver accepts any client on your network. For a receiver that’s usually fine, but you can require a key:

sudo sdr-slc-rtld keygen --key-id macbook
sudo chown root:slc /etc/sdr-slc/rtld.keys
sudo chmod 640 /etc/sdr-slc/rtld.keys
sudo sed -i 's/^SLC_ARGS=-v$/SLC_ARGS=-v --rx-auth psk/' /etc/sdr-slc/rtld.conf
sudo systemctl restart sdr-slc-rtld

keygen shows the secret only once, so put it in your password manager, then enter the key ID and the secret in the client. The chown and chmod lines let the service read its key file. Without them it refuses to start.

The connection isn’t encrypted, so the key keeps out other users but not eavesdroppers. Never forward ports 4620 and 4621 from the Internet.

Keeping it up to date

cd ~/src/sdr-slc-rtld && git pull && make && sudo make install && sudo systemctl restart sdr-slc-rtld

make install keeps your existing /etc/sdr-slc/rtld.conf, so your settings survive updates.

Troubleshooting

SymptomCause and fix
The log says Failed to open RTL-SDR device 0, repeatingNo dongle, or another program has it. Check lsusb, and that rtl_tcp is stopped (systemctl status rtl-tcp). The service retries every 2 seconds.
rtl_test: usb_open error -3Your user isn’t in plugdev, or you haven’t logged out and in since being added.
rtl_test: Kernel driver is activeThe TV driver still claims the dongle. Check /etc/modprobe.d/blacklist-rtl-sdr.conf and reboot.
The receiver doesn’t appear under DiscoverThe Mac and the Pi must be on the same network segment, because discovery doesn’t cross routers or VLANs. Check that the service is running with systemctl status sdr-slc-rtld.
A spike in the middle of the spectrumSome dongles centre slightly differently. Measure and set --u8-zero-point; see the comment in rtld.conf.
Audio stutters, or gaps appear in the waterfallUse Ethernet instead of Wi-Fi, and keep the sample rate at 2.4 MS/s or lower.
The service won’t start after enabling --rx-auth pskThe key file permissions: run the chown and chmod lines from Security.

Where next?

Want to transmit as well? The Raspberry Pi + bladeRF setup turns the same idea into a 2 m and 70 cm transceiver, and the client works with it exactly the same way. See all options on the Station setups page.

73, Ivo PA2IX