Emergency Communications Dashboard for ARES/RACES, SKYWARN, and Served Agency Operations
The EmComm layout provides a dedicated emergency communications dashboard for amateur radio operators supporting public safety events and disaster response. All six development phases have shipped — the layout includes real-time APRS station tracking with RF source support, net operations management, point-to-point APRS messaging, resource token aggregation, NWS alerts, FEMA shelter/disaster data, and APRS telemetry parsing.
Design Principle: Local-first. Each station runs OpenHamClock locally. Internet may be unavailable during emergencies — all core EmComm functions work over RF alone when paired with a local TNC via rig-bridge.
- Open Settings (click the gear icon or your callsign in the header)
- Select Emergency Communications from the Layout dropdown
- Click Save — the page reloads with the EmComm layout
Requirements:
- Station location — Latitude/longitude must be set (needed for alerts, shelters, distance calculations)
- APRS — Set
APRS_ENABLED=truein your.envfor APRS-IS internet feed (zero-config) - Local APRS (RF) — Optional. Requires rig-bridge with the APRS TNC plugin connected to Direwolf or a hardware TNC
- NWS/FEMA data — Zero-config, public APIs, no keys needed
The EmComm layout replaces standard sidebar panels with emergency-focused data. The left side (~70%) is an interactive map; the right side (~30%) contains stacked information panels.
- Range rings at 50, 100, and 200 km from your station
- NWS alert polygons color-coded by severity (Extreme=red, Severe=orange, Moderate=gold, Minor=yellow)
- Shelter markers with capacity popups (green=OPEN, red=CLOSED, orange=FULL)
- EmComm APRS station markers (cyan) for emergency-related stations with resource token popups
- APRS source toggle — filter by All Sources, RF Only (local TNC), or Internet Only
| Panel | Description |
|---|---|
| Resource Summary | Aggregated dashboard showing totals across all APRS stations reporting resource tokens. Capacity bars with color coding (red >90%, orange >70%). |
| NWS Alerts | Active weather watches, warnings, and advisories from the National Weather Service, color-coded by severity with countdown to expiry. |
| Disaster Declarations | Recent FEMA disaster declarations for your state (last 30 days), auto-resolved from your coordinates via reverse geocoding. |
| Nearby Shelters | Open shelters within 200 km, sorted by distance, with capacity bars, wheelchair (♿) and pet-friendly (🐾) indicators. Click to pan map. |
| EmComm Stations | APRS stations using emergency symbols, with resource token pills and RF source badges when heard locally. |
| Net Roster | Live net operations with operator check-ins, status messages, resource tokens, and point-to-point messaging. |
The EmComm layout can receive APRS data from two sources simultaneously:
- APRS-IS (Internet) — Read-only connection to
rotate.aprs2.net. Enabled viaAPRS_ENABLED=truein.env. No API key needed. - Local TNC (RF) — Via rig-bridge's APRS TNC plugin. Connects to Direwolf (software TNC) or a hardware TNC (Mobilinkd, TNC-X, KPC-3+) using KISS protocol over TCP or serial. Stations heard over RF are tagged with a green "RF" badge.
The APRS Source Selector in the EmComm sidebar lets you filter the display:
- All Sources — Shows both internet and RF stations (default)
- RF Only — Shows only stations heard by your local TNC
- Internet Only — Shows only APRS-IS stations
The EmComm layout filters APRS stations to show only emergency-relevant symbols:
| Symbol Code | Type | Icon |
|---|---|---|
/o / Eo |
EOC | 🏛️ |
\z / So |
Shelter | 🏥 |
\! |
Emergency | 🚨 |
/+ |
Red Cross | ✚ |
\a |
ARES | 📡 |
\y |
Skywarn | 🌪️ |
Each station card shows: callsign with icon, RF badge (if heard locally), distance from your station, last-heard time, resource tokens (if present), and cleaned comment text.
Operators at shelters or EOCs can encode structured resource data in their APRS beacon comments using bracket notation. OpenHamClock parses these tokens and displays them as color-coded pills on station cards, and aggregates them into the Resource Summary panel.
Token format (within the 67-character APRS comment field):
| Token | Meaning | Example |
|---|---|---|
[Key Value] |
Quantity | [Staff 5] |
[Key Curr/Max] |
Capacity (current/maximum) | [Beds 30/100] |
[Key -Value] |
Resource NEEDED (deficit) | [Water -50] |
[Key OK] |
Status nominal | [Power OK] |
[Key !] |
Critical alert | [Food !] |
Built-in token keys: Beds, Water, Food, Power, Fuel, Med, Staff, Evac, Comms, Gen. The parser accepts any key — unknown keys display with a generic icon.
Example beacon comment: [Beds 30/100][Power OK][Water -50] Shelter Alpha (47 chars)
The EmComm layout parses APRS telemetry frames (T# packets) with support for PARM, UNIT, and EQNS metadata. This enables field-deployed sensors to report:
- Battery voltage
- Ambient temperature
- Signal strength
- Custom analog/digital channels
Telemetry data is available via GET /api/aprs/telemetry.
The EmComm layout includes a built-in net operations system for managing check-ins during emergency activations.
Operators check in to a net by sending an APRS message:
Check in:
TO: EMCOMM
Body: CQ NETNAME <your status message>
Check out:
TO: EMCOMM
Body: U NETNAME
Example: Sending CQ HOTG Deployed to Shelter Alpha to EMCOMM checks you in to the HOTG net with the status "Deployed to Shelter Alpha".
For operators without APRS TX capability, the server provides a REST endpoint:
POST /api/aprs/net/checkin
Body: { "callsign": "W1ABC", "netName": "HOTG", "status": "At EOC" }
The roster shows all checked-in operators with:
- Callsign and net name
- Last-heard time (green if recent, orange if >10 minutes stale)
- Status message
- Resource tokens from their APRS beacon
- MSG button — click to compose a point-to-point APRS message to that operator
The EmComm layout supports sending and receiving point-to-point APRS messages.
- Click the MSG button on any net roster entry or APRS station
- A compose panel appears with the callsign pre-filled
- Type your message (67-character APRS limit, enforced by character counter)
- Click Send — the message is transmitted via your local TNC
Requirement: Sending messages requires a local APRS TNC connected via rig-bridge with TX capability.
Incoming APRS messages addressed to your callsign appear in the message stream. The system also detects:
- Shelter reports — Messages containing shelter-related keywords are flagged
- Net commands — CQ/check-in and U/check-out messages are automatically routed to the net roster
- Bulletins — APRS bulletin messages (BLN) are displayed in the feed
POST /api/aprs/message
Body: { "to": "W1ABC", "message": "Need water at Shelter B" }
- Source:
api.weather.gov(public, no API key) - Polling: Every 3 minutes
- Coverage: Based on your station coordinates
- Display: Expandable alert cards with severity coloring, headline, description, instructions, and time-to-expiry countdown
- Map: Alert areas rendered as colored polygon overlays
- Source:
gis.fema.govArcGIS (public, no API key) - Polling: Every 5 minutes
- Radius: 200 km from your station (configurable)
- Display: Sorted by distance, with status badges (OPEN/CLOSED/FULL), capacity bars (current/max evacuees), wheelchair accessibility (♿), and pet-friendly (🐾) indicators
- Interaction: Click any shelter to pan the map to its location
- Source:
fema.govopen API (public, no API key) - Polling: Every 15 minutes
- Coverage: Your state (auto-resolved from coordinates via Nominatim reverse geocoding)
- Time range: Last 30 days
- Display: Declaration title, incident type icon, declaration type (Major Disaster / Emergency)
Status: Plugin built. Waiting on API key approval from Winlink team (W3QA). See issue #297.
The rig-bridge includes a Winlink gateway plugin (rig-bridge/plugins/winlink-gateway.js) that provides:
- Gateway discovery — Find nearby Winlink RMS gateways by grid square, range, and transport mode (HF/VHF/UHF)
- Pat client integration — Interface with the Pat Winlink client for inbox/outbox management and message composition
- Message sending — Compose and send Winlink emails over RF via Pat
What's waiting: The gateway discovery feature requires an API key from api.winlink.org to query the RMS gateway database. The key has been requested. Pat client integration (local messaging) works independently without the API key.
Endpoints (available when plugin is enabled):
| Endpoint | Method | Description |
|---|---|---|
/winlink/gateways |
GET | List nearby gateways (requires API key) |
/winlink/gateways/:callsign |
GET | Single gateway details |
/winlink/inbox |
GET | Pat inbox messages |
/winlink/outbox |
GET | Pat outbox messages |
/winlink/compose |
POST | Send message via Pat |
/winlink/connect |
POST | Connect to a gateway |
Configuration (in rig-bridge config):
{
"winlink": {
"enabled": false,
"apiKey": "YOUR_WINLINK_API_KEY",
"refreshInterval": 3600,
"pat": {
"enabled": false,
"host": "127.0.0.1",
"port": 8080
}
}
}| Variable | Default | Description |
|---|---|---|
APRS_ENABLED |
false |
Enable APRS-IS internet connection |
APRS_HOST |
rotate.aprs2.net |
APRS-IS server |
APRS_PORT |
14580 |
APRS-IS port |
APRS_FILTER |
(empty) | Geographic filter, e.g. r/40/-75/500 |
APRS_MAX_AGE_MINUTES |
60 |
Purge stations older than this |
| Endpoint | Method | Description |
|---|---|---|
/api/aprs/stations |
GET | All cached APRS stations |
/api/aprs/messages |
GET | APRS messages and bulletins |
/api/aprs/shelters |
GET | Extracted shelter reports from messages |
/api/aprs/net |
GET | Net roster with computed age/staleness |
/api/aprs/net/checkin |
POST | Manual net check-in |
/api/aprs/net/checkout |
POST | Manual net check-out |
/api/aprs/message |
POST | Send APRS message via TNC |
/api/aprs/local |
POST | Inject local TNC packets (cloud relay) |
/api/aprs/telemetry |
GET | APRS telemetry data |
/api/emcomm/alerts |
GET | NWS weather alerts for location |
/api/emcomm/shelters |
GET | FEMA shelters within radius |
/api/emcomm/disasters |
GET | FEMA disaster declarations for state |
┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ Radio/TNC │────▶│ APRS Daemon │────▶│ OpenHamClock │
│ (Direwolf) │◀────│ (rig-bridge │◀────│ (Node.js) │
│ │ │ plugin) │ │ │
└─────────────┘ └──────────────┘ └─────────────────┘
▲ │
│ RF Network │ Optional
▼ ▼
┌──────────┐ ┌──────────────┐
│ Other │ │ APRS-IS │
│ Stations│ │ (Internet) │
└──────────┘ └──────────────┘
Key design decisions:
- APRS daemon as rig-bridge plugin — Reuses the existing plugin architecture, same config model and lifecycle management
- KISS protocol — Universal TNC protocol, works with Direwolf, hardware TNCs, and most radio interfaces
- Dual-source APRS — Internet (APRS-IS) and local RF can run simultaneously with deduplication
- In-memory storage — Stations, messages, net roster, and telemetry stored in memory with configurable TTLs. No database required.
- Zero-config public APIs — NWS, FEMA, and Nominatim require no API keys or authentication
All six phases of the EmComm layout have shipped:
| Phase | Feature | Version |
|---|---|---|
| 1 | Display dashboard | v26.1.1 |
| 2 | APRS station icons, source selector, RF tags | v26.2.1 |
| 3 | Net operations roster | v26.2.1 |
| 4 | APRS messaging | v26.2.1 |
| 5 | Logging & documentation | v26.2.1 |
| 6 | APRS telemetry parsing | v26.2.1 |
Feature requests and discussion welcome in GitHub Issues with the emcomm label.