Direwolf on Linux — Complete APRS iGate, Digipeater and Packet Radio Guide
Direwolf is a software AX.25 TNC that replaces dedicated hardware for APRS and packet radio on Linux. This complete guide covers installation on Ubuntu, Debian, and Raspberry Pi, setting up an APRS iGate, running a digipeater, packet radio BBS connection, running as a systemd service, and troubleshooting the most common problems.
- What is Direwolf and what can it do
- Installation on Ubuntu, Debian and Raspberry Pi
- Hardware requirements and radio wiring
- Basic configuration
- Setting up an APRS iGate
- Running as a digipeater
- Beaconing your own position
- Packet radio and AX.25
- Running as a systemd service
- Operating guide — monitoring and using APRS
- Integration with Xastir and other APRS clients
- Troubleshooting common problems
- Frequently asked questions
What is Direwolf and what can it do
Direwolf (Decoded Information from Radio Emissions for Windows or Linux Fans) is a software modem and AX.25 TNC written by WB2OSZ. It replaces the dedicated hardware TNC (Terminal Node Controller) that was traditionally required for APRS and packet radio — instead of a physical device between your radio and computer, Direwolf uses your computer's sound card to encode and decode the audio tones that represent AX.25 packet data.
A complete Direwolf APRS station consists of nothing more than a computer, a radio, and an audio cable between them. A Raspberry Pi Zero W with a cheap handheld radio and Direwolf becomes a full APRS iGate running 24/7 on less power than a phone charger.
What Direwolf can do
- APRS iGate — receive APRS packets over RF and forward them to the APRS-IS internet network, making local stations visible worldwide on aprs.fi
- APRS digipeater — receive and retransmit APRS packets to extend their RF range
- Two-way iGate — receive from APRS-IS and retransmit to RF for local stations
- Position beaconing — broadcast your own position, weather data, or telemetry
- Packet radio TNC — connect to packet BBS systems, provide AX.25 connectivity for other applications
- Satellite packet decoding — decode AX.25 telemetry from amateur satellites
- 1200 and 9600 baud — supports both standard APRS speed (1200 baud AFSK) and faster 9600 baud FSK
Installation on Ubuntu, Debian and Raspberry Pi
Ubuntu 22.04, 24.04 and Debian 11, 12
sudo apt update
sudo apt install direwolf
Build from source (recommended for latest features)
The repository version may be several releases behind the current version. Building from source gives you the latest features and bug fixes:
sudo apt install git build-essential cmake \
libasound2-dev libgps-dev libudev-dev \
libavcodec-dev libavformat-dev
git clone https://github.com/wb2osz/direwolf.git
cd direwolf
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install
Raspberry Pi OS
Direwolf runs excellently on all Raspberry Pi models. The same apt install or build-from-source method works on Raspberry Pi OS. A Raspberry Pi Zero 2W with a cheap UV-5R handheld and Direwolf makes an extremely low-cost, low-power APRS iGate — the entire setup including the Pi and radio costs under $50.
sudo apt update
sudo apt install direwolf
Verify the installation
direwolf --version
Hardware requirements and radio wiring
The hardware requirements for a Direwolf station are minimal — a computer with a sound card and a radio capable of FM operation on the APRS frequency.
Radio options
| Radio type | Cost | Suitability | Notes |
|---|---|---|---|
| Cheap UV-5R style handheld | $25–40 | Excellent for iGate | 3.5mm audio jacks for easy connection |
| Mobile VHF/UHF rig | $100–300 | Excellent | Better receiver, more reliable for digipeater |
| Base station VHF/UHF | $200+ | Best | Better filters, lower noise floor |
| RTL-SDR dongle | $25 | Receive only | Great for monitoring APRS — cannot transmit |
| HF radio (any) | Varies | Good for HF APRS | Use 30m (10.151 MHz) for HF APRS |
Audio wiring — radio to computer
Four connections are needed between radio and computer:
- Radio speaker/audio out → Computer line-in — received audio for Direwolf to decode
- Computer audio out → Radio microphone input — transmit audio from Direwolf
- PTT line → Radio PTT — keys the transmitter when sending
- Ground — common ground between radio and computer
Simple cable for handheld radios
Most cheap handhelds have a 2.5mm/3.5mm Kenwood-compatible connector for speaker-mic. You can build a simple cable connecting the radio's speaker output to your computer's line-in and the microphone input to the computer's audio output. PTT can be controlled via VOX or a serial port RTS line through a simple transistor circuit.
Commercial interfaces
| Interface | Price | Linux support | Notes |
|---|---|---|---|
| Digirig Mobile | ~$50 | Excellent | Modern, compact, includes PTT via serial |
| Signalink USB | ~$100 | Excellent | Optical isolation, VOX PTT |
| TNC-Pi (for Raspberry Pi) | ~$50 | Excellent | Hardware TNC on Pi GPIO — more reliable than audio |
| Generic CM108 dongle | ~$10 | Good | Budget option, no isolation |
PTT control options
| PTT method | Configuration | Pros | Cons |
|---|---|---|---|
| VOX | Set on radio | No extra cable needed | VOX tail delay wastes time |
| Serial RTS | PTT /dev/ttyUSB0 RTS | Fast, reliable | Needs a serial port and cable |
| Serial DTR | PTT /dev/ttyUSB0 DTR | Fast, reliable | Needs a serial port and cable |
| CM108 GPIO | PTT CM108 | No extra cable on CM108 devices | Only works with CM108-based audio adapters |
| Hamlib | PTT RIG 2 /dev/ttyUSB0 | Works with CAT-controlled radios | More complex setup |
Basic configuration
Direwolf is configured via a plain text file — typically ~/direwolf.conf. Generate a default config as a starting point:
direwolf -S > ~/direwolf.conf
Essential configuration settings
# Your callsign and SSID
# Common SSIDs: -1 through -15, -10 = iGate, -2 = mobile
MYCALL N0CALL-10
# Sound card device
# Use "arecord -l" to list available devices
# plughw:1,0 = card 1, device 0
ADEVICE plughw:1,0
# Channel 0 — 1200 baud AFSK (standard APRS on 144.390 MHz)
CHANNEL 0
MODEM 1200
# PTT via serial port RTS line
# Comment this out if using VOX
PTT /dev/ttyUSB0 RTS
Finding your sound card device
# List capture (input) devices
arecord -l
# List playback (output) devices
aplay -l
# Example output:
# card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio]
# Use this as: ADEVICE plughw:1,0
APRS frequencies by region
| Region | APRS frequency | Notes |
|---|---|---|
| North America | 144.390 MHz FM | Primary — most active |
| Europe | 144.800 MHz FM | Primary European frequency |
| Australia/NZ | 145.175 MHz FM | Primary |
| Japan | 144.640 MHz FM | Primary |
| HF APRS (worldwide) | 10.151.5 MHz USB | 30m band, 300 baud |
| ISS APRS | 145.825 MHz FM | Visible passes only |
Audio level calibration
Correct audio levels are essential for reliable packet decoding. Use Direwolf's built-in level indicator:
direwolf -c ~/direwolf.conf
Watch the audio level display in the terminal output. When an APRS packet arrives the level bar should reach 50–75% of full scale. If it is peaking at 100% the receive audio is too high — reduce the radio's volume. If it barely registers the audio is too low — increase it.
Setting up an APRS iGate
An iGate receives APRS packets over RF and forwards them to the APRS-IS internet network. This is one of the most valuable contributions you can make to the APRS community — iGates in rural areas or locations with good RF coverage extend the effective reach of the network significantly.
Get your APRS-IS passcode
You need a numeric passcode derived from your callsign to connect to APRS-IS. Generate it online at various websites (search "APRS-IS passcode generator") or calculate it yourself — XOR the ASCII values of your uppercase callsign characters in pairs.
Receive-only iGate configuration
A receive-only iGate listens on RF and forwards packets to APRS-IS but never transmits. This is the safest starting point — no transmit path needed, zero RF interference risk:
MYCALL N0CALL-10
ADEVICE plughw:1,0
CHANNEL 0
MODEM 1200
# No PTT line needed for receive-only iGate
# APRS-IS connection
IGSERVER rotate.aprs2.net
IGLOGIN N0CALL-10 12345
# Gate all received packets to APRS-IS
# Limit: max 6 packets in 10 seconds to prevent flooding
IGTXLIMIT 6 10
Two-way iGate configuration
A two-way iGate also pulls messages from APRS-IS and retransmits them on RF for local stations. This allows mobile stations in your area to receive APRS messages even when they cannot reach the internet directly:
# Add these to your receive-only config for two-way operation
PTT /dev/ttyUSB0 RTS
# Pull messages from APRS-IS for local stations
# Only retransmit if the station has been heard on RF recently
IGTXVIA 0 WIDE1-1
IGFILTER m/25 # Only download messages for stations within 25km
Verifying your iGate is working
- Start Direwolf and watch for "Connected to APRS-IS" in the terminal output
- Go to aprs.fi and search for your callsign — your station should appear with an iGate icon within a few minutes
- Click your callsign on aprs.fi and check the Statistics tab — packets gated in the last hour should be non-zero
- Check aprs.fi for nearby mobile stations — if they are updating their positions you are gating their packets successfully
Running as a digipeater
A digipeater receives APRS packets and retransmits them to extend their RF range. Digipeaters are the backbone of the APRS RF network — without them, mobile stations in areas without iGate coverage would be invisible to the network.
When to run a digipeater
Before setting up a digipeater, check the APRS coverage in your area at aprs.fi. Switch to the RF Stations view and check if your area has coverage gaps. Digipeaters are most valuable in rural areas, on hilltops with wide RF coverage, and in areas where existing digipeater coverage is weak. Running a digipeater in an urban area that already has good coverage adds unnecessary traffic to the network.
Basic digipeater configuration
MYCALL N0CALL-2
ADEVICE plughw:1,0
CHANNEL 0
MODEM 1200
PTT /dev/ttyUSB0 RTS
# Digipeater — handle WIDE1-1 and WIDE2-1 paths
# This is the standard WIDEn-N digipeating algorithm
DIGIPEAT 0 0 ^WIDE[3-7]-[1-7]$ ^WIDE[12]-[12]$
# Optional: also respond to your callsign alias
# DIGIPEAT 0 0 ^WIDE[3-7]-[1-7]$ ^WIDE[12]-[12]$ WIDE
Understanding WIDEn-N paths
APRS packets include a path that specifies how many times they should be digipeated:
- WIDE1-1 — request one digipeater hop, intended for fill-in digipeaters
- WIDE2-1 — second hop in a WIDE2-2 path
- WIDE2-2 — request two full-coverage digipeater hops
The Direwolf DIGIPEAT configuration above handles standard WIDEn-N paths correctly — it reduces the hop count by one and retransmits, following the standard APRS digipeating algorithm.
Combined iGate and digipeater
Many stations run both iGate and digipeater functions simultaneously — this is perfectly valid and common:
MYCALL N0CALL-10
ADEVICE plughw:1,0
CHANNEL 0
MODEM 1200
PTT /dev/ttyUSB0 RTS
# iGate
IGSERVER rotate.aprs2.net
IGLOGIN N0CALL-10 12345
IGTXLIMIT 6 10
# Digipeater
DIGIPEAT 0 0 ^WIDE[3-7]-[1-7]$ ^WIDE[12]-[12]$
Beaconing your own position
Direwolf can transmit your position, weather data, or any other APRS information at regular intervals using PBEACON and OBEACON directives.
Position beacon
# Beacon position every 30 minutes
# delay=1 means wait 1 minute before first beacon
PBEACON delay=1 every=30 overlay=S symbol="digi" \
lat=51^30.00N long=000^07.00W \
comment="HamRadioBase iGate Linux/Direwolf"
# Common symbols:
# "house" = fixed station
# "digi" = digipeater
# "igate" = iGate
# /- = generic dot
Using GPS for mobile position beaconing
For mobile operation Direwolf can read position from a GPS receiver via GPSD:
sudo apt install gpsd gpsd-clients
sudo gpsd /dev/ttyUSB0 -F /var/run/gpsd.sock
# Use GPS for position — updates based on speed/distance
TBEACON via=WIDE1-1,WIDE2-1 symbol="/>" \
comment="Mobile HamRadioBase"
GPSD localhost:2947
Weather beaconing
If you have a weather station connected to your computer, Direwolf can transmit weather data in APRS WX format. Configure OBEACON with WX data from your weather station software output.
Packet radio and AX.25
Beyond APRS, Direwolf provides full AX.25 packet radio capability — the protocol underlying traditional packet BBS networks, message systems, and file transfer over radio.
AGW and KISS interfaces
Direwolf exposes two interfaces for other applications to use its TNC capability:
# AGW interface — for applications like Xastir, APRSIS32
AGWPORT 8000
# KISS interface — for Linux AX.25 stack
KISSPORT 8001
Connecting to the Linux AX.25 stack
sudo apt install ax25-tools ax25-apps
With the KISS port enabled and AX.25 tools installed, you can connect Direwolf to the Linux AX.25 stack and use traditional packet applications including axcall for connecting to packet BBS systems.
Connecting to a packet BBS
# First attach the KISS TNC to a network interface
kissattach /dev/pts/X ax0
# Then connect to a local BBS station
axcall ax0 VK2RBV
Running as a systemd service
For an always-on iGate or digipeater, run Direwolf as a systemd service so it starts automatically on boot and restarts if it crashes.
Create the service file
[Unit]
Description=Direwolf APRS TNC
After=network.target sound.target
Wants=network-online.target
[Service]
User=hamradiobase
ExecStart=/usr/local/bin/direwolf -c /home/hamradiobase/direwolf.conf -t 0
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Enable and start the service
sudo systemctl daemon-reload
sudo systemctl enable direwolf
sudo systemctl start direwolf
# Check status
sudo systemctl status direwolf
# View logs
sudo journalctl -u direwolf -f
Audio device in systemd
When running as a systemd service Direwolf may not have access to PulseAudio. Use the ALSA hardware device directly in your config rather than the PulseAudio device:
# Use ALSA directly — works in systemd without PulseAudio
ADEVICE plughw:1,0
# If using PulseAudio as your user (not in systemd)
# ADEVICE pulse
sudo usermod -a -G audio hamradiobase
Operating guide — monitoring and using APRS
Reading Direwolf terminal output
When Direwolf decodes an APRS packet it prints a summary to the terminal. Understanding the output helps you verify your setup is working and diagnose problems:
Digipeater WIDE1 (generic)
[0] VK2TOM-9>APRS,WIDE1-1,WIDE2-1:!3340.00S/15100.00E>/A=000050 Mobile
Position, OVERLAY CHAR >, VK2TOM-9
N 33 40.0000, E 151 0.0000, 50 ft
Mobile Station
Each decoded packet shows: channel, callsign, path, raw packet, decoded information including position, altitude, and comment.
Checking iGate statistics on aprs.fi
- Go to aprs.fi and search for your callsign
- Click your station icon on the map
- Click the Info tab — shows packets gated in the last 24 hours
- Click Raw packets — shows the actual packets you have gated, useful for debugging
- Check Heard stations — shows which stations you have received RF packets from
Monitoring decode quality
Direwolf shows audio level bars in the terminal. Aim for peaks at about 50% of full scale during normal packet activity. Watch the error statistics — a healthy setup on a busy APRS frequency should decode dozens of packets per hour in an urban area. If you see many "FCS error" messages your audio level is too high or there is interference.
Sending APRS messages
To send APRS messages to other stations use an APRS client connected to Direwolf's AGW port. Xastir, APRSIS32 (via Wine), and APRSdroid (Android) can all connect to Direwolf via the network interface and provide message sending capability. Direwolf itself only decodes and encodes packets — the message composition interface comes from the APRS client application.
Tracking the ISS on APRS
The International Space Station runs an APRS digipeater on 145.825 MHz. During a pass overhead, stations can be heard being digipeated via the ISS. To monitor ISS APRS:
- Look up the next ISS pass time using Predict or Heavens-Above
- Tune your radio to 145.825 MHz FM a minute before the pass
- Watch Direwolf's terminal output during the pass — packets appear as the ISS rises above the horizon
- You may also be able to have your own packets digipeated via the ISS — use a path of ARISS in your beacon
Integration with Xastir and other APRS clients
Xastir
Xastir is the most full-featured open-source APRS client for Linux. It connects to Direwolf via the AGW interface and provides a graphical map display of APRS stations, message sending, and full station management.
sudo apt install xastir
In Xastir: Interface → Interface Control → Add, select AGWpe, set host to localhost and port to 8000. Enable the interface and Xastir connects to Direwolf automatically.
YAAC (Yet Another APRS Client)
YAAC is a Java-based cross-platform APRS client that connects to Direwolf. It provides a cleaner modern interface than Xastir with OpenStreetMap integration. Download from Sourceforge.
APRSdroid on Android
APRSdroid can connect to a Direwolf instance on your local network via the AGW interface. This lets you use your Android device as an APRS display and messaging client while Direwolf handles the RF interface on your Linux station.
Pat — Winlink on Linux with Direwolf
Pat is a Winlink client for Linux that can use Direwolf as a TNC for Winlink over RF (using the Winmor or VARA equivalent protocols via packet). This enables HF and VHF email via the Winlink network without internet connectivity.
Troubleshooting common problems
Direwolf starts but decodes nothing
- Check audio device selection — run
arecord -land compare to your ADEVICE setting - Verify audio level — turn up the radio volume until the Direwolf level bar reaches 50%
- Check the radio is on the correct frequency — 144.390 MHz in North America, 144.800 MHz in Europe
- Verify the radio is in FM mode — APRS uses FM, not SSB
- Check that no other application is using the audio device — close any other audio programs
- Try a different ADEVICE value — some systems use different device numbering
Cannot connect to APRS-IS
- Check internet connectivity from the machine
- Verify IGLOGIN passcode is correct for your callsign
- Try a different APRS-IS server —
rotate.aprs2.netshould work globally - Check firewall rules — APRS-IS uses port 14580 (filtered) or 10152 (full feed)
- Watch Direwolf terminal output for connection error messages
PTT not working — Direwolf transmits but radio doesn't key
- Check dialout group:
groups | grep dialout— add yourself if missing:sudo usermod -a -G dialout - Verify the serial port exists:
ls /dev/ttyUSB* - Try DTR instead of RTS or vice versa in the PTT config line
- Check radio PTT wiring — use a multimeter to verify the PTT line goes to ground when Direwolf transmits
- Try VOX as a test — if the radio keys on audio but not on RTS/DTR the serial port config is wrong
Transmitted packets not appearing on aprs.fi
- Verify the packet is being transmitted — watch Direwolf terminal for [0] Xmit messages
- Check that another local station or iGate is hearing your RF packets — if not, RF is the problem
- Verify your callsign is correctly configured in MYCALL
- Check your transmit audio level — too low and other stations won't decode your packets
- Make sure your path includes WIDE1-1 or WIDE2-2 for the packet to be digipeated to an iGate
FCS errors appearing frequently
FCS (Frame Check Sequence) errors mean packets are being received but the data does not pass error checking. Common causes:
- Receive audio level too high — clipping causes data corruption
- Interference on the frequency — check for nearby transmitters
- Audio cable problems — try a different cable or connection
- Radio squelch set too tight — open squelch fully when using Direwolf
Direwolf service crashes repeatedly
- Check the journal for error messages:
sudo journalctl -u direwolf -n 50 - Verify audio device permissions for the service user
- Check disk space — Direwolf log files can fill a small SD card
- Try running Direwolf manually as the service user to reproduce the error
Frequently asked questions
What is the difference between an iGate and a digipeater?
A digipeater receives APRS packets over RF and retransmits them on RF — it extends the range of the RF APRS network. An iGate receives APRS packets over RF and forwards them to the APRS-IS internet network — it connects the RF network to the internet, making stations visible worldwide on aprs.fi. Many stations run both functions simultaneously. A receive-only iGate gates RF traffic to the internet but does not transmit. A two-way iGate also pulls messages from APRS-IS and retransmits them on RF for local stations.
Can Direwolf run on a Raspberry Pi Zero?
Yes — Direwolf runs on Raspberry Pi Zero W and Zero 2W. The Zero W has enough processing power for a receive-only iGate running 1200 baud APRS. The Zero 2W handles more demanding configurations including simultaneous iGate and digipeater operation. Use a USB audio adapter for the radio interface since the Pi Zero has no built-in audio output suitable for transmit.
Do I need a license to run an APRS iGate?
Yes — an amateur radio license is required in most countries. In the US you need at minimum a Technician class license, which gives full privileges on 144 MHz (the primary APRS frequency). A receive-only iGate that only listens and forwards to the internet is debated — some argue it falls under receiving-only operation — but transmitting a position beacon or running a two-way iGate or digipeater definitively requires a license. Check your national regulations.
What radio should I use for a Direwolf APRS iGate?
Almost any FM radio that covers 144 MHz works. The cheapest practical option is a Baofeng UV-5R or similar handheld ($25–35) — they decode APRS perfectly well for receive-only iGate use. For a transmitting iGate or digipeater a mobile rig like the Yaesu FTM-300 or Kenwood TM-V71 is more reliable and has better receiver characteristics. For a high-reliability installation on a hilltop or tower a proper base station VHF/UHF radio is worth the investment.
How do I get my APRS-IS passcode?
The passcode is algorithmically derived from your callsign — it is the same for everyone with the same callsign. Search online for "APRS-IS passcode generator" and enter your callsign. The result is a 5-digit number used in the IGLOGIN line of your Direwolf configuration. The passcode proves you are a licensed operator since only the callsign holder should know it.
Can Direwolf decode packets from the International Space Station?
Yes — the ISS runs an APRS digipeater on 145.825 MHz FM. Tune your radio to 145.825 MHz FM and Direwolf will decode any packets the ISS digipeats during a pass overhead. You can also transmit your own APRS packet using a path of ARISS and have it digipeated through the ISS, potentially being received by stations across a wide area of the globe. Pass times are available from Heavens-Above or the Predict tool on this site.
What is the difference between 1200 baud and 9600 baud APRS?
Standard APRS on 144 MHz uses 1200 baud AFSK (Audio Frequency Shift Keying) — audio tones that go through the radio's normal voice audio path. This works with any FM radio's microphone and speaker connections. 9600 baud FSK (Frequency Shift Keying) is faster but requires direct connection to the radio's discriminator output and modulator input, bypassing the audio processing. Most consumer radios do not support 9600 baud without modification. Direwolf supports both but 1200 baud is correct for standard APRS operation.