MCPcopy Index your code
hub / github.com/chrissnell/graywolf

github.com/chrissnell/graywolf @v0.14.10

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.14.10 ↗ · + Follow
8,269 symbols 32,558 edges 1,083 files 3,608 documented · 44%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Graywolf

Graywolf is a modern APRS station with a software modem, digipeater, iGate, and web UI. It bundles everything you need to put an APRS station on the air — from raw audio demodulation to APRS-IS gating — and makes it easy with a browser-based configuration interface.

Download the Latest Release — prebuilt for Linux (Debian/Ubuntu and Fedora/RHEL), macOS, and Windows.

Read the Handbook — installation, configuration, operation guide, and REST API reference.

Known-Working Configurations — community-tested hardware setups with exact settings. Check here for your device, and submit a PR if yours isn't listed.

Graywolf APRS Discord — community chat for help, discussion, and development.

Graywolf is used all around the world! See a map of currently active stations

Written by Chris Snell, NW5W.

The modem is written in Rust and includes a port of the AFSK demodulator from Dire Wolf by WB2OSZ. The decision-feedback AGC and hard-limiter correlator techniques are credited to Ion Todirel (W7ION), from his libmodem.

The AX.25 decoding, APRS operatations (beacons, digipeater, and iGate), and the web API is handled by a service written in the Go programming language.

The web frontend was built in Svelte.

Performance

Graywolf's AFSK demodulator beats Direwolf's best mode (-P AD+) on every track of the WA8LMF TNC test CD, at about 5% of a Raspberry Pi 5.

WA8LMF Track Direwolf Graywolf
01 — 40-min traffic 1020 1026
02 — DE-emphasized Mic-E 1000 1000
03 — flat Mic-E (100 reps) 100 100
04 — drive test 107 108

Reproduce with ./bench.sh.

Features

Graywolf dashboard

  • Modern Web UI - GW is managed via the browser, with a responsive interface that works well on desktops and smartphones.

  • Software Modem - High performance DSP written in Rust that's slightly more effective than Direwolf and much better than most hardware TNCs. Efficeint: uses about 19% of a single CPU core on a Raspberry Pi 5.

  • Live Map - Like having a private aprs.fi for your station. Real-time APRS map with trails, digipeater paths, weather overlays, and beautiful animated NEXRAD weather radar, all rendered on our private vector basemap. You can download maps for your state/province/country for offline use!

  • Messages - SMS-style APRS messaging with delivery status and unread badges

  • Direct messages with auto-ACK and retry

  • Tactical callsigns (e.g. GRAYWOLF, AMIGOS) for group nets
  • RF-first delivery with APRS-IS fallback
  • Long messages up to 200 characters

  • Actions - Trigger scripts remotely with specially-crafted APRS messages

  • Can trigger via shell script, Powershell script, or webhook
  • Can be secured with one-time passwords a la Google Authenticator or 1Password

  • AX.25 Terminal - Built-in connected-mode terminal client in the web UI

  • Connect to BBSes, nodes, and other stations over AX.25

  • Macros and configurable presets for quick connects
  • Live channel monitor

  • Push-to-Talk - Multiple PTT methods for any setup

  • Serial RTS/DTR (Digirig, USB-serial adapters)

  • CM108 USB HID GPIO (AIOC, homebrew sound card adapters)
  • Linux GPIO (Raspberry Pi, BeagleBone)
  • Hamlib rigctld (CAT control)
  • VOX (voice-operated keying, no PTT wiring required)
  • Digirig Lite Tone PTT (keys on a right-channel tone, no PTT wiring required)

  • Digipeater - Full-featured APRS digipeater

  • WIDEn-N path handling

  • Preset-driven configuration (fill-in, wide-area, etc.)
  • Duplicate suppression
  • Per-path filtering

  • iGate - Bidirectional APRS-IS gateway

  • RF → APRS-IS and APRS-IS → RF gating

  • Configurable filters
  • Packet origin tracking in logs

  • TNC Interfaces - Speak the protocols other packet software expects

  • KISS TNC with native serial and network (TCP) support

  • AGWPE TCP interface

  • Beacons and GPS - Position reporting made easy

  • Static and GPS-driven position beacons

  • Status and telemetry beacons
  • Configurable beacon intervals and paths

  • Observability

  • Prometheus metrics

  • Packet logging to SQLite database, with search ability
  • Live packet stream in the web UI

  • Simple installation - single binary, SQLite config database

  • systemd service unit

  • Debian/Ubuntu (APT), Red Hat (RPM), and Arch (AUR) packages
  • Windows installer
  • macOS binaries
  • Runs on x86-64 and ARM (Raspberry Pi)

Which download do I use?

Grab the build that matches your hardware from the latest release. On Linux, pick the .deb (Debian/Ubuntu), .rpm (Fedora/RHEL), or .tar.gz (anything else) with the matching architecture suffix.

Your hardware Build to download
PC, server, or mini-PC (Intel/AMD 64-bit) x86_64 (amd64)
Raspberry Pi 3 / 4 / 5, Pi Zero 2 W, or any ARM board running a 64-bit OS arm64 (aarch64)
32-bit OS on a NEON-capable ARMv7 board — Pi 2 / 3 / 4, Rockchip RV1106, BeagleBone, most modern SBCs armv7l
Oldest Pis — Pi 1, Pi Zero / Zero W (ARMv6) armv6l
macOS, Apple Silicon (M1–M4) macOS arm64
macOS, Intel macOS x86_64
Windows Windows_x86_64 installer

Not sure? On Linux, run uname -m — its output is exactly the suffix to look for: x86_64, aarch64 (use the arm64 build), armv7l, or armv6l.

armv6l vs. armv7l: both are 32-bit ARM hard-float. The armv7l build enables NEON, so the Rust modem's demodulator runs vectorized and noticeably faster — use it whenever your board is Cortex-A7 or newer. The armv6l build is the universal fallback that runs on every 32-bit Pi (including the ARMv6-only Pi 1 / Zero) but stays scalar; it will also run on ARMv7 boards, just slower. Don't use armv7l on an ARMv6-only Pi — it will fail with an illegal-instruction error.

Running a 64-bit OS on a Pi 3/4/5? Prefer the arm64 build over either 32-bit one.

Extension points exported contracts — how you extend this code

Executor (Interface)
Executor runs one Action invocation. Implementations are stateless from the runner's perspective; per-call state lives i [7 …
pkg/actions/executor.go
ChannelModeLookup (Interface)
ChannelModeLookup is the small read-only surface the TX-gating subsystems (beacon, digipeater, igate, messages, ax25conn [7 …
pkg/configstore/channel_mode_lookup.go
TxSink (Interface)
TxSink is implemented by anything that accepts AX.25 frames for transmit scheduling. The canonical implementation is *Go [25 …
pkg/txgovernor/sink.go
Validator (Interface)
Validator is implemented by request DTOs that can validate themselves. The generic handler helpers require it so bad inp [26 …
pkg/webapi/dto/dto.go
IGateLineSender (Interface)
IGateLineSender is the narrow interface the router uses to mirror auto-ACKs back to APRS-IS when the triggering inbound [8 …
pkg/messages/router.go
ISSink (Interface)
ISSink is an optional destination for sending beacons to APRS-IS. When non-nil and a beacon's SendPath includes APRS-IS [8 …
pkg/beacon/types.go
Stopper (Interface)
Stopper cancels a pending AfterFunc callback. The Stop() return is the same as time.Timer.Stop(): true if the callback h [10 …
pkg/ax25conn/timers.go
Runner (Interface)
Runner is the seam between collectors and the actual exec call. Production code uses defaultRunner, which delegates to R [12 …
pkg/diagcollect/audio.go

Core symbols most depended-on inside this repo

String
called by 522
pkg/aprs/phg.go
Add
called by 381
pkg/messages/local_tx_ring.go
Now
called by 364
pkg/ax25conn/timers.go
Contains
called by 303
pkg/igate/gating.go
RegisterRoutes
called by 248
pkg/webapi/server.go
cancel
called by 233
web/src/lib/maps/downloads-store.svelte.js
Run
called by 218
pkg/diagcollect/audio.go
badRequest
called by 198
pkg/webapi/errors.go

Shape

Function 4,386
Method 2,819
Struct 769
Class 152
Interface 79
TypeAlias 38
Enum 20
FuncType 5
Route 1

Languages

Go76%
Rust11%
TypeScript8%
Kotlin4%
Python1%

Modules by API surface

pkg/platformproto/platform.pb.go395 symbols
pkg/ipcproto/graywolf.pb.go327 symbols
graywolf-modem/src/tx/ptt.rs90 symbols
graywolf-modem/src/audio/soundcard.rs88 symbols
pkg/configstore/store.go85 symbols
pkg/webapi/messages_test.go71 symbols
graywolf-modem/src/modem/mod.rs65 symbols
pkg/messages/router_test.go54 symbols
pkg/webapi/server.go52 symbols
pkg/app/wiring.go52 symbols
pkg/actions/classifier_test.go51 symbols
pkg/configstore/iface.go49 symbols

For agents

$ claude mcp add graywolf \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact