-
Notifications
You must be signed in to change notification settings - Fork 0
APRS
Crow can bridge APRS text messages through one or more configurable APRS backends, allowing AREDN nodes to send and receive messages with APRS stations. The default backend is APRS-IS, but Crow also supports Dire Wolf KISS-over-TCP and Xastir/YAAC-style TCP text streams.
Crow supports multi-backend configurations — you can run multiple APRS connections simultaneously (e.g. an APRS-IS feed and a local Dire Wolf TNC) and bind different channels to different backends.
⚠️ Important: APRS is public amateur-radio traffic. Keep transmit (tx_enabled) disabled until the station callsign, APRS-IS login/passcode or local TNC path, and operator control requirements are fully understood.
Add an aprs block to your crow.conf and include an APRS channel in the channels array.
{
"callsign": "N0CALL-10",
"aprs": {
"enabled": true,
"callsign": "N0CALL-10",
"channel": "APRS og==",
"default_group": "APRSgroup1",
"inline_max_members": 10,
"backend": {
"type": "aprsis",
"host": "rotate.aprs2.net",
"port": 14580,
"passcode": "-1",
"tx_enabled": false
},
"groups": [
{
"name": "APRSgroup1",
"members": ["N0CALL-4", "N0CALL-7"],
"repeat_member_messages": false,
"rate_limit_seconds": 20,
"max_members": 10
}
]
},
"channels": [
{ "namekey": "AREDN og==", "telemetry": false },
{ "namekey": "APRS og==", "telemetry": false }
]
}When a single backend key is used, Crow wraps it as backends.default internally.
Use the backends (plural) key to define multiple named backends:
{
"callsign": "N0CALL-10",
"aprs": {
"enabled": true,
"callsign": "N0CALL-10",
"channel": "APRS og==",
"default_group": "APRSgroup1",
"backends": {
"internet": {
"type": "aprsis",
"host": "rotate.aprs2.net",
"port": 14580,
"passcode": "12345",
"filter": "b/N0CALL-4/N0CALL-7",
"tx_enabled": true
},
"rf": {
"type": "kiss_tcp",
"host": "127.0.0.1",
"port": 8001,
"kiss_port": 0,
"path": ["WIDE1-1"],
"tx_enabled": true
}
},
"groups": []
},
"channels": [
{ "namekey": "AREDN og==", "telemetry": false },
{ "namekey": "APRS og==", "telemetry": false },
{ "namekey": "APRS-RF og==", "telemetry": false, "backend": "rf" }
]
}| Field | Description |
|---|---|
callsign |
Your station callsign with SSID |
channel |
The Crow channel name that carries APRS traffic |
default_group |
The group used when no group is specified |
inline_max_members |
Maximum stations allowed in an inline address list |
backend |
Single backend connection details (see below) — backward-compatible |
backends |
Named multi-backend map (see Multi-Backend above) |
groups |
Pre-configured station groups for group messaging |
Crow supports three APRS backend types. Choose the one that matches your station setup. Use /backends in chat to list active backends and their connection status.
Connect to the internet APRS gateway. This is the only backend that requires a passcode — see APRS-IS Passcode below.
For receive only, no passcode is needed (Crow defaults to -1, which gives read-only access). To transmit, set a valid APRS-IS passcode and enable tx_enabled.
Single-backend form:
"backend": {
"type": "aprsis",
"host": "rotate.aprs2.net",
"port": 14580,
"passcode": "12345",
"filter": "b/N0CALL-4/N0CALL-7",
"tx_enabled": true
}Multi-backend form (aprs.backends.<name>.passcode):
"backends": {
"internet": {
"type": "aprsis",
"host": "rotate.aprs2.net",
"port": 14580,
"passcode": "12345",
"filter": "b/N0CALL-4/N0CALL-7",
"tx_enabled": true
}
}| Field | Default | Description |
|---|---|---|
host |
rotate.aprs2.net |
APRS-IS server hostname |
port |
14580 |
APRS-IS server port |
passcode |
-1 (read-only) |
APRS-IS passcode for your callsign (required for TX) |
filter |
(none) | Optional server-side filter (e.g. b/N0CALL-4/N0CALL-7) |
tx_enabled |
false |
Enable transmitting messages to APRS-IS |
Connect to a local Dire Wolf TNC via KISS-over-TCP. No passcode is needed — authentication is handled by the TNC/radio path.
"backend": {
"type": "kiss_tcp",
"host": "127.0.0.1",
"port": 8001,
"kiss_port": 0,
"path": [],
"tx_enabled": true
}| Field | Default | Description |
|---|---|---|
host |
127.0.0.1 |
Dire Wolf host |
port |
8001 |
KISS TCP port |
kiss_port |
0 |
KISS port number (0–15) |
path |
[] |
Digipeater path (e.g. ["WIDE1-1", "WIDE2-1"]) |
tx_enabled |
false |
Enable transmitting |
Connect to an APRS application that exposes a TNC2-style TCP text interface. No passcode is needed — the connected application handles its own authentication to APRS-IS or RF.
"backend": {
"type": "tcp_text",
"host": "127.0.0.1",
"port": 14580,
"tx_enabled": true
}| Field | Default | Description |
|---|---|---|
host |
127.0.0.1 |
Application host |
port |
14580 |
TCP text port |
tx_enabled |
false |
Enable transmitting |
The APRS-IS passcode is a numeric hash derived from your callsign (without SSID). It is used only by the APRS-IS backend to authenticate for transmit access. The other backends (KISS TCP, TCP Text) do not use or need a passcode.
When Crow connects to an APRS-IS server, it sends a login line:
user N0CALL-10 pass 12345 vers Crow 0.1
- If the passcode is omitted or set to
-1, the server grants read-only access — you can receive APRS messages but cannot transmit. - If a valid passcode is provided and
tx_enabledistrue, the server grants read-write access.
The APRS-IS passcode is a simple hash of your base callsign (without SSID). Many tools can generate it:
- Online: Search for "APRS-IS passcode generator" (e.g. aprs-passcode)
- Command line: Various scripts exist — the algorithm is a public, well-known hash
Note: The passcode is not a security secret — it is a simple validation that you are using your own callsign. Anyone can compute the passcode for any callsign. APRS-IS transmissions are public amateur radio traffic and all standard FCC Part 97 rules apply.
| Backend | Passcode needed? | Why |
|---|---|---|
aprsis — receive only |
❌ No | Default passcode -1 gives read-only access |
aprsis — transmit enabled |
✅ Yes | APRS-IS server requires valid passcode for write access |
kiss_tcp (Dire Wolf) |
❌ No | Direct TNC connection, no APRS-IS login |
tcp_text (Xastir/YAAC) |
❌ No | The application handles its own APRS-IS auth |
All APRS messaging happens on the configured APRS channel (e.g. APRS og==).
@N0CALL-4 message text
#APRSgroup1 message text
#APRSgroup1 N0CALL-4, N0CALL-7 message text
join #APRSgroup1 N0CALL-4, N0CALL-7 message text
The join command creates the group if it does not exist, replaces its member list with the listed stations, and sends the message to all of them.
join #APRSgroup1 backend=rf N0CALL-4, N0CALL-7 message text
The backend=NAME option binds the group to a named backend. Without it, the group uses the channel's backend or the default.
In a multi-backend setup, each channel can be bound to a specific backend using the backend field in the channels array:
"channels": [
{ "namekey": "APRS og==", "telemetry": false },
{ "namekey": "APRS-RF og==", "telemetry": false, "backend": "rf" }
]Messages sent on APRS-RF og== will be routed through the rf backend. The main APRS channel is automatically bound to the first (default) backend.
APRS channels using the og== key (the AREDN open key) are AREDN-only unencrypted channels. This is the correct and expected configuration for APRS traffic because:
- APRS messages are public amateur radio traffic governed by FCC Part 97
- Part 97 prohibits encryption of amateur radio communications
- The
og==key ensures messages are transmitted in the clear over AREDN mesh
All APRS channels should use og== unless you have a specific reason to use a different key.
Each group can optionally repeat a received APRS message from one member back out to the other members of the group. Enable this with repeat_member_messages:
{
"name": "APRSgroup1",
"members": ["N0CALL-4", "N0CALL-7"],
"repeat_member_messages": true,
"rate_limit_seconds": 20,
"max_members": 10
}When enabled, a message received from one group member is forwarded to the other members — not echoed back to the sender. Crow applies duplicate suppression and rate limiting to prevent loops.
- Home
- Change Log
- Configuration
- Configuring Channels
- Backend Selection and Test Deployment
- Command Reference
- APRS Bridge
- LoRa Gateway Tags
- Meshtastic API Backend
- Memory Use
- Strict Gatekeeper
- Winlink
- USB Storage
APRS.mdBackend-Selection-and-Deployment.mdChange-Log.mdCommand-Reference.mdConfiguration.mdConfiguring-Channels.mdHome.mdLoRa-Gateway-Tags.mdMeshtastic-API.mdMemory-Use.mdStrict-Gatekeeper.mdUSB-Storage.mdWinlink.md_Sidebar.md
- Keep every
.mdwiki page linked here. - Keep
Home.mdand_Sidebar.mdin sync. - When a wiki page is removed, remove it from both the Home page inventory and this sidebar.