Modern APRS Digipeater with Graywolf and Raspberry Pi


The Hardware & Operating System

We don’t do things by halves and build on an absolutely solid foundation:

  • Hardware: Raspberry Pi 4
  • Interface: Mobilinkd TNC4 via USB (Permanently assigned to /dev/ttyACM99)
  • Operating System: Raspberry Pi OS Bookworm (64-bit) Lite

Pro-Tip: Since we manage Graywolf exclusively over the network, the “Lite” version without a graphical user interface is perfectly sufficient. This saves massive amounts of resources, lowers power consumption, and reduces potential sources of error.

Step 1: Nailing Down the TNC (Udev Rule)

Nothing is more annoying than a TNC randomly swapping its USB port (ttyACM0 today, ttyACM1 tomorrow) after a reboot, causing the digipeater to transmit into the void. We fix this interface permanently before the actual installation.

  1. Plug in your TNC and find out the exact serial number:
    ls -l /dev/serial/by-id

    (Copy the serial number that appears at the end of the string)

  2. Create a dedicated rule in the system:
    sudo nano /etc/udev/rules.d/99-tnc.rules
  3. Paste the following line (replace my serial number 2065316C4652 with your own):
    SUBSYSTEM=="tty", ATTRS{serial}=="2065316C4652", SYMLINK+="ttyACM99"
  4. Save (Ctrl+O, Enter), Exit (Ctrl+X) and apply the rule immediately:
    sudo udevadm control --reload-rules && sudo udevadm trigger

From now on, your TNC is rock-solid at /dev/ttyACM99—no matter what.

Step 2: Installing Graywolf on the Pi

Log into the Pi via SSH and download the current 64-bit package (in my case, version 0.13.11) directly from the developer’s GitHub repository:

wget https://github.com/chrissnell/graywolf/releases/download/v0.13.11/graywolf_0.13.11_linux_arm64.deb

Next, we start the installation. The setup does most of the heavy lifting for us and automatically sets the correct permissions for the serial interface and the sound card:

sudo apt update
sudo apt install ./graywolf_0.13.11_linux_arm64.deb

Step 3: Starting & Securing the Service

Graywolf is configured to run automatically on system boot. Let’s fire up the service manually once:

sudo systemctl start graywolf

Important: Before opening the web interface in the browser, you must set an admin password. Without this password, the door remains locked:

sudo graywolf auth set-password --user admin -config /var/lib/graywolf/graywolf.db

Step 4: Configuration in the Web Interface

Now switch to your tablet or computer and access the interface via your Raspberry Pi’s IP address: http://<YOUR-PI-IP>:8080.

The interface is extremely clean, but there are two classic pitfalls you should avoid:

Pro-Tip 1: The Chicken-and-Egg Problem with the Interface

Before you set up the KISS interface in Graywolf, you must first tell the system where it should transmit.

  1. First, go to Radio -> Radio Channels and create a new channel (e.g., “VHF 144.800”).
  2. After that, go to Interfaces -> KISS TNC and enter the TNC (Serial, /dev/ttyACM99, 9600 Baud).
  3. Select your freshly created channel at the bottom of the mask. Save, and you’re done!

Pro-Tip 2: Fixed Coordinates for Beacons (Decimal Degrees!)

Since a digipeater is usually stationary in the shack, we don’t need a GPS module. We enter the fixed position under APRS -> Beacons.

Attention: Graywolf strictly expects the coordinates for Latitude and Longitude in pure Decimal Degree format (e.g., Lat: 47.986959, Lon: 7.785684). Do not mix formats like “Degrees and Minutes” here, otherwise, your station will suddenly be transmitting from a neighboring country on the map!

Maintenance: How to Install Updates for Graywolf

Since Graywolf is not included in the standard Raspberry Pi OS repositories, a simple sudo apt upgrade won’t do the trick here. The update must be done manually, but it takes less than a minute. The most important thing upfront: Your settings, channels, and database remain completely untouched during the update!

Step 1: Download the New Version

Check Chris Snell’s GitHub Releases page for the latest .deb file. Make sure to choose the correct architecture (arm64 for the classic Pi 4, armv6 if you are running a 32-bit system) and download the package (replace the version number in the link with the latest one):

wget https://github.com/chrissnell/graywolf/releases/download/v0.13.13/graywolf_0.13.13_linux_arm64.deb

Step 2: Install Right Over It

You don’t need to painstakingly uninstall the old version first. Just run the new installer over the existing system. The package manager will automatically stop the service, swap the files under the hood, and start it right back up:

sudo apt install ./graywolf_0.13.13_linux_arm64.deb

Step 3: Function Check & Cleanup

Take a quick look at the instruments to make sure the engine is purring smoothly again:

sudo systemctl status graywolf

(Press the q key to exit the status screen).

If everything is running well (Status: active/running), you can simply delete the downloaded installation file to keep your SD card clean and tidy:

rm graywolf_*.deb

Disclaimer: This setup was developed in collaboration with Gemini AI. While we’ve worked hard to make this guide as “bulletproof” as possible, tech is always evolving—errors may occur, or specific functions might need a bit of extra tweaking.

The solution? Don’t hesitate to ask Gemini yourself if you get stuck. Good luck with your build!


Setup Graywolf Raspbery PI