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
| Item | Notes |
|---|---|
| Raspberry Pi 3B+, 4 or 5 | A Pi 4 or 5 is best for streaming at 2 MS/s around the clock. |
| Official Pi power supply | An RTL-SDR draws around 300 mA, more with the bias tee on. |
| microSD card, 16 GB or more | |
| RTL-SDR Blog V4 | Also works with a V3 or a V4L. See step 2. |
| Ethernet cable | The I/Q stream is continuous UDP. Wi-Fi with power saving causes gaps. |
| An antenna | A long wire for HF, a vertical or discone for VHF/UHF. |
| A Mac with the SDR-SLC client 1.2 | From the Mac App Store. |
Step 1: Raspberry Pi OS
- On your Mac, install Raspberry Pi Imager from raspberrypi.com/software.
- Choose your Pi model, then Raspberry Pi OS (other) → Raspberry Pi OS Lite (64-bit). This guide used the Debian 13 “trixie” release.
- In the customisation step, set:
- a hostname, e.g.
slc-rtl; - your username and password;
- your time zone;
- Enable SSH.
- a hostname, e.g.
- 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-XXYYZZ | SLC_ARGS=-v --name SLC-shack-rtl |
| Power an LNA from the dongle | SLC_ARGS=-v --bias-tee (the client can also switch the bias tee) |
| Frequency correction for your dongle | SLC_ARGS=-v --ppm 1 (the V4 has a TCXO and rarely needs it) |
| HF on an RTL-SDR V3 | SLC_ARGS=-v --direct-q |
| A password for the receiver | see 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
- In the SDR-SLC client on your Mac, click Discover. Your receiver appears as
SLC-XXYYZZ, or under the name you gave it. - Select it. The client reads its frequency range, sample rates and gain settings from the receiver itself.
- 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
| Symptom | Cause and fix |
|---|---|
| The log says Failed to open RTL-SDR device 0, repeating | No 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 -3 | Your user isn’t in plugdev, or you haven’t logged out and in since being added. |
rtl_test: Kernel driver is active | The TV driver still claims the dongle. Check /etc/modprobe.d/blacklist-rtl-sdr.conf and reboot. |
| The receiver doesn’t appear under Discover | The 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 spectrum | Some dongles centre slightly differently. Measure and set --u8-zero-point; see the comment in rtld.conf. |
| Audio stutters, or gaps appear in the waterfall | Use 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 psk | The 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