Build an APRS iGate and Digipeater with Raspberry Pi and RTL-SDR
APRS (Automatic Packet Reporting System) is the ham radio world's real-time position and messaging network — the same technology that lets you watch weather balloons, storm chasers, and hikers' GPS trackers move across a live map at aprs.fi. Every position report on that map got there because some station heard the packet over the air and forwarded it onto the internet. That forwarding station is called an iGate, and running one is one of the most useful low-effort contributions a licensed ham can make to their local network — it directly extends APRS coverage for everyone else nearby. A Raspberry Pi with a $25 RTL-SDR dongle is more than enough hardware to run one, plus a digipeater to extend RF range for other stations, 24/7, for a few watts of power draw.
A License Is Required — Read This First
APRS operates on amateur radio frequencies (144.390 MHz in North America, other regionally-assigned frequencies elsewhere) and transmitting on them requires a valid amateur radio license in your country. Receiving and gatewaying APRS traffic to the internet (a receive-only iGate) does not require a license in most jurisdictions since you're not transmitting — but a digipeater, which retransmits packets over RF to extend range for other stations, does require you to hold a license and configure the station with your own callsign. Do not configure a digipeater or any transmit-capable APRS station without a valid callsign; use receive-only iGate mode if you aren't licensed, which is both fully legal and still a genuinely useful contribution to the network.
How the Pieces Fit Together
- RTL-SDR dongle — a cheap software-defined radio receiver, tuned to the local APRS frequency, that captures the raw AFSK (audio frequency-shift keying) audio.
- Direwolf — a software TNC (terminal node controller) that decodes that AFSK audio into APRS packets, the same job a dedicated hardware TNC used to do. Direwolf also handles KISS/AGWPE protocol output and, if you're licensed and configured for transmit, encoding outgoing packets back to audio for a digipeater.
- APRS-IS — the internet-side APRS network that aggregates every iGate's received packets into one global feed, which is what powers sites like aprs.fi.
Building the Receive-Only iGate
- Flash Raspberry Pi OS Lite and get SSH access working (see this site's headless Pi setup guide if you haven't done this before).
- Install prerequisites: sudo apt update && sudo apt install -y git build-essential cmake libasound2-dev rtl-sdr.
- Blacklist the kernel's DVB drivers so they don't grab the RTL-SDR dongle before you can use it: create /etc/modprobe.d/blacklist-rtl.conf with blacklist dvb_usb_rtl28xxu, then reboot.
- Verify the dongle is detected with rtl_test — you should see tuner info (typically an R820T2) without a "usb_claim_interface error".
- Install rtl_fm (part of the rtl-sdr package) to demodulate the FM audio from the APRS frequency, piping its output to a virtual audio device that Direwolf can read — the common approach uses a small utility like direwolf's built-in rtl_fm integration or a piped sox resample stage feeding a null ALSA loopback device (snd-aloop kernel module).
- Build Direwolf from source: git clone https://github.com/wb2osz/direwolf.git, then the standard mkdir build && cd build && cmake .. && make -j4 && sudo make install.
- Write a minimal direwolf.conf: set MYCALL to your callsign with an SSID (e.g. N0CALL-10, the conventional SSID for a receive-only iGate), set the audio input device to the loopback you created, and add an IGSERVER line pointing to a regional APRS-IS tier-2 server (e.g. noam.aprs2.net) along with your APRS-IS passcode.
- Your APRS-IS passcode is derived from your callsign via a known (published) algorithm — look it up through any APRS passcode generator using your own callsign; it's not a secret credential, just a lightweight abuse-prevention check.
- Start Direwolf pointed at your config and watch the console output — decoded packets print in real time, and a [ig] tag confirms they're being forwarded to APRS-IS. Check aprs.fi for your own gateway's callsign to confirm it's showing up as an active iGate.
Antenna Matters More Than the Radio
Unlike most of the SDR projects on this site, APRS iGate performance is almost entirely antenna-limited, not receiver-limited — the $25 RTL-SDR dongle's noise floor is perfectly adequate for 2m FM. A dedicated 2m vertical antenna (even a simple ground-plane or J-pole build) mounted as high as practical, fed with low-loss coax (LMR-400 for any run over 25 feet), will out-perform a better radio on a worse antenna every time. If you're serious about coverage, this is where to spend the budget.
Adding Digipeater Function (Licensed Operators Only)
A digipeater retransmits packets it hears to extend range for other stations — useful in hilly or heavily wooded terrain where direct-to-iGate range is limited. This requires a transmit-capable radio path: either a genuine hardware TNC connected to a 2m transceiver, or a sound-card-based setup using a USB audio interface wired to a radio's data port (never key a transmitter through a computer's speaker/mic jacks directly — use a proper interface with isolation to protect both the radio and the Pi). Configure Direwolf's DIGIPEAT directive with the standard WIDE1-1/WIDE2-1 paths, and set a reasonable transmit duty cycle limit in software — digipeaters that key up too aggressively on a busy frequency are a known community annoyance, not a technical requirement.
Troubleshooting Reference
SymptomLikely Fix rtl_test reports "usb_claim_interface error -6"DVB kernel driver grabbed the dongle first — confirm the blacklist file took effect and reboot Direwolf runs but decodes zero packetsWrong frequency (confirm 144.390 MHz for North America, or your region's assigned frequency), bad antenna connection, or audio gain too hot/cold — Direwolf logs an audio level indicator, aim for the recommended range in its startup output Packets decode locally but never appear on aprs.fiWrong or missing APRS-IS passcode, or outbound port 14580 blocked by a firewall/ISP Station shows as gated but stops updating after a few hoursDirewolf process crashed or the Pi lost network — run it under systemd with automatic restart rather than a manual terminal sessionRunning It Unattended
Once the config is solid, wrap Direwolf in a systemd service (Restart=on-failure) so it survives reboots and crashes without manual intervention, same as the site's other always-on Pi services like Pi-hole or a WireGuard server. A Pi Zero 2 W is plenty of hardware for a receive-only iGate — reserve a full Pi 4/5 for a combined iGate/digipeater running alongside other services.
This is a nice complement to the SDR and ham radio digital modes content already on this site — it turns a passive "listen to the airwaves" SDR project into something that actively contributes location and messaging infrastructure back to the amateur radio community, for the cost of a Pi, a cheap dongle, and (ideally) a decent antenna.
Related Guides
- Ham Radio Digital Modes on Raspberry Pi: WSJT-X, FT8, and FLDIGI Setup
- RF and Antenna Fundamentals for Makers: Dipoles, Ground Planes, SWR, and Feedline Loss
- Receiving SSTV Images on Ham Radio: ATS Mini V4, RTL-SDR, and Decoding Software
- Build an ADS-B Flight Tracker with Raspberry Pi and RTL-SDR
- How to Install Klipper on Any 3D Printer: Complete Setup Guide
- How to Set Up OpenCV Machine Vision on a Raspberry Pi
- Raspberry Pi: Complete Headless Setup Guide (No Monitor Needed)
- Raspberry Pi: Headless OS Setup