Skip to content

Configuration

Builder Bob edited this page Jun 20, 2026 · 6 revisions

Crow Configuration Reference

Crow is configured using two files located in /usr/local/crow:

  • crow.conf — Default configuration (overwritten on updates)
  • crow.conf.override — User overrides (preserved across updates) ⭐ Edit this file

Only modify crow.conf.override. If it doesn't exist, create it with minimal content:

{
}

All configuration blocks below are top-level keys added to this JSON file. Restart Crow to apply changes:

/etc/init.d/crow restart

Core Configuration

Callsign

Set your node's AREDN callsign:

{
  "callsign": "N0CALL-10"
}

Bridge Configurations

Meshtastic Bridge

Prerequisites: Meshtastic device with Ethernet/LAN capability connected to your AREDN node's LAN interface. See Meshtastic for hardware and device setup.

Enable the bridge:

{
  "meshtastic": {}
}

Channel Configuration: Bind channels to Meshtastic by adding "meshtastic": true to channel entries in the channels array:

{
  "channels": [
    { "namekey": "AREDN og==", "telemetry": true },
    { "namekey": "LongFast AQ==", "telemetry": true, "meshtastic": true }
  ]
}

Note: Meshtastic uses multicast; no address configuration needed. Ensure your Meshtastic device's modem preset matches the Crow channel ID.


MeshCore Bridge

Prerequisites: MeshCore device connected via serial port (typically /dev/ttyACM0) through a Raspberry Pi running the MeshCore2Net bridge. See MeshCore for full hardware and software setup.

Enable the bridge:

{
  "meshcore": {}
}

Restart Crow:

/etc/init.d/crow restart

APRS Bridge

⚠️ Important: APRS is public amateur-radio traffic. Encryption is prohibited under FCC Part 97. Keep tx_enabled disabled until you fully understand callsign, passcode, and operator control requirements.

Single Backend (APRS-IS, Dire Wolf, or Xastir)

{
  "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 }
  ]
}

Backend Types:

  • aprsis — APRS-IS (recommended): host, port, passcode
  • direwolf — Dire Wolf KISS-over-TCP: host, port
  • xastir — Xastir/YAAC TCP text: host, port

Multi-Backend Configuration

Use backends (plural) to run multiple APRS connections simultaneously:

{
  "callsign": "N0CALL-10",
  "aprs": {
    "enabled": true,
    "callsign": "N0CALL-10",
    "channel": "APRS og==",
    "default_group": "APRSgroup1",
    "backends": {
      "primary": {
        "type": "aprsis",
        "host": "rotate.aprs2.net",
        "port": 14580,
        "passcode": "-1",
        "tx_enabled": false
      },
      "local": {
        "type": "direwolf",
        "host": "192.168.1.50",
        "port": 8000
      }
    },
    "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 }
  ]
}

APRS Channels: Always use the AREDN open key (og==) for APRS channels to comply with FCC Part 97 (no encryption).

Group Repeating: Enable repeat_member_messages to forward received messages from one group member to others (excluding the sender):

{
  "name": "APRSgroup1",
  "members": ["N0CALL-4", "N0CALL-7"],
  "repeat_member_messages": true,
  "rate_limit_seconds": 20,
  "max_members": 10
}

See APRS for detailed backend setup and troubleshooting.


Storage Configuration

USB Storage

Store Crow data on an external USB drive:

{
  "storage": {
    "mode": "usb",
    "mountpoint": "/mnt/crow",
    "label": "CROWDATA",
    "device": "/dev/sda1",
    "image_quota_mb": 64,
    "min_free_mb": 16
  }
}
Field Default Description
mode internal internal (node flash) or usb (external drive)
mountpoint /mnt/crow Where the USB drive is mounted
label CROWDATA Filesystem label (used when formatting)
device auto-detect Force a specific block device (e.g., /dev/sda1)
image_quota_mb 100 Max size for stored images (MB)
min_free_mb 16 Minimum free space before cleanup (MB)

See USB Storage for pre-configuration and device selection.


UI Configuration

Message Alignment

By default, messages you post appear on the right; others on the left. To align all messages to the left:

{
  "ui": {
    "message": {
      "align": "left"
    }
  }
}

Channel Key Format

Crow displays channel keys as base64 by default. To show hex encoding instead (useful for sharing with MeshCore users):

{
  "ui": {
    "key": {
      "format": "hex"
    }
  }
}

See UI Tweaks for additional customization options.


Complete Example

A realistic configuration combining multiple features:

{
  "callsign": "N0CALL-10",
  "meshtastic": {},
  "storage": {
    "mode": "usb",
    "device": "/dev/sda1"
  },
  "aprs": {
    "enabled": true,
    "callsign": "N0CALL-10",
    "channel": "APRS og==",
    "default_group": "APRSgroup1",
    "backend": {
      "type": "aprsis",
      "host": "rotate.aprs2.net",
      "port": 14580,
      "passcode": "-1",
      "tx_enabled": false
    },
    "groups": [
      {
        "name": "APRSgroup1",
        "members": ["N0CALL-4", "N0CALL-7"]
      }
    ]
  },
  "ui": {
    "message": {
      "align": "left"
    },
    "key": {
      "format": "hex"
    }
  },
  "channels": [
    { "namekey": "AREDN og==", "telemetry": true },
    { "namekey": "APRS og==", "telemetry": false, "meshtastic": true },
    { "namekey": "LongFast AQ==", "telemetry": true }
  ]
}

Restart Crow

After editing crow.conf.override, always restart the service:

/etc/init.d/crow restart

Per-Channel Access Control

When Strict Gatekeeper is enabled, channels can enforce their own callsign allow/deny rules. Add an access_control block to individual channel entries:

{
  "channels": [
    {
      "namekey": "#TacNet base64key==",
      "access_control": {
        "require_callsign": true,
        "allowed_callsigns": ["K6*", "W2*"],
        "deny_callsigns": []
      }
    },
    {
      "namekey": "#OpenNet base64key==",
      "access_control": {
        "require_callsign": false
      }
    }
  ]
}

See Strict Gatekeeper — Per-Channel Access Control for pattern syntax and enforcement details.


MeshCore Discovery

When running a MeshCore TCP API backend, Crow can auto-discover group channels programmed into the radio’s 8 memory slots. Enable periodic discovery sync:

{
  "meshcore_discovery": {
    "enabled": true,
    "sync_interval_ms": 300000
  }
}
Field Type Default Description
enabled boolean false Enable group discovery and periodic sync.
sync_interval_ms integer 300000 How often (ms) to re-query radio slots for changes.

Discovered groups appear in /cmd discover and can be joined with /join.


Related Topics

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