Amateur radio ยท APRS-IS

aprsr

An APRS-IS server written in Rust. It speaks the protocol amateur radio operators have been running for decades โ€” the login handshake, the q construct algorithm, server-side filters, duplicate suppression โ€” with a memory-safe implementation and a status page you can actually read.

Early days โ€” the protocol core is implemented and tested, uplinks and TLS are next. See the roadmap for exactly what works today.

What it does

Speaks APRS-IS properly

TNC2 framing with the 512-byte limit enforced, the full login handshake, and the q construct algorithm including its loop-rejection rules. Every behaviour is implemented from the published specification and cites it in the source.

Server-side filters

Range, area, prefix, budlist, object, type, symbol, digipeater, entry station, group message, unproto, q construct, and the position-relative m/ and f/ โ€” additive, negatable, and parsed once per client rather than per packet.

A dashboard worth opening

Live traffic counters, connected clients with their filters, and per-port statistics. Server-rendered and kept current with HTMX, so it stays readable with JavaScript disabled and costs almost nothing to serve.

Migrates from aprsc

Point aprsr convert-config at an existing aprsc.conf and it emits the equivalent TOML, reporting anything that did not survive the move rather than dropping it silently.

Try it

git clone https://github.com/cloudcontraptions/aprsr
cd aprsr
cp aprsr.example.toml aprsr.toml
# set server.id to your own callsign, then:
cargo run -p aprsr -- run --config aprsr.toml

# in another terminal โ€” connect as a client
printf 'user N0CALL pass -1 vers demo 0.1 filter r/60/25/100\r\n' | nc localhost 14580

# and the dashboard
open http://localhost:14501/

You need a Rust toolchain; nothing else. The dashboard assets are committed, so there is no Node build to run before the server looks right.

Standing on the shoulders of aprsc

aprsr would not exist without aprsc, the APRS-IS server in C by Heikki Hannikainen (OH7LZB) and Matti Aarnio (OH2MQK). aprsc has carried the core of the APRS-IS network for well over a decade, and its module decomposition โ€” separating packet parsing, q construct handling, duplicate detection, filtering, the client registry, and the incoming and outgoing packet paths into distinct, individually testable units โ€” is a genuinely good design. aprsr's crate layout deliberately follows it. Our thanks to the authors for publishing that design openly.

aprsr contains no aprsc source code. It is an independent implementation written from the public APRS-IS specifications at aprs-is.net, with aprsc consulted as an architectural reference only. aprsc is BSD-3-Clause; aprsr is MIT OR Apache-2.0, and that separation is maintained deliberately.

APRSยฎ was created by the late Bob Bruninga, WB4APR (1948โ€“2022). The APRS-IS network and its protocol documentation are maintained by Pete Loveall, AE5PL, and the wider APRS-IS community โ€” thank you for keeping the specifications public and precise enough to implement against.