Skip to content
mathisono edited this page Jun 11, 2026 · 8 revisions

APRS Bridge

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.


Configuration

Add an aprs block to your crow.conf and include an APRS channel in the channels array.

Single Backend (backward-compatible)

{
  "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.

Multi-Backend

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

Backends

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.

APRS-IS

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

Dire Wolf KISS TCP

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

TCP Text Stream (Xastir / YAAC)

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

APRS-IS Passcode

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.

How it works

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_enabled is true, the server grants read-write access.

Generating your passcode

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.

When do you need a passcode?

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

Sending Messages

All APRS messaging happens on the configured APRS channel (e.g. APRS og==).

Direct message to a station

@N0CALL-4 message text

Send to a configured group

#APRSgroup1 message text

Send to an inline list (without changing the group)

#APRSgroup1 N0CALL-4, N0CALL-7 message text

Create or update a group and send

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.

Bind a group to a specific backend

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.


Per-Channel Backend Binding

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.


AREDN-Only Channels and Part 97

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.


Group Message Repeating

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.

Crow Wiki

Pages

Markdown files

  • APRS.md
  • Backend-Selection-and-Deployment.md
  • Change-Log.md
  • Command-Reference.md
  • Configuration.md
  • Configuring-Channels.md
  • Home.md
  • LoRa-Gateway-Tags.md
  • Meshtastic-API.md
  • Memory-Use.md
  • Strict-Gatekeeper.md
  • USB-Storage.md
  • Winlink.md
  • _Sidebar.md

Maintenance

  • Keep every .md wiki page linked here.
  • Keep Home.md and _Sidebar.md in sync.
  • When a wiki page is removed, remove it from both the Home page inventory and this sidebar.

Clone this wiki locally