Companion app for Graywolf APRS: create, place, schedule and beacon APRS objects (shelters, EOCs, aid stations, incident sites, served agencies, deployed units) from a browser. Objects go on the air through Graywolf, and with Graywolf's iGate they reach APRS-IS and aprs.fi. Built for use alongside Graywolf and VarMap rather than as a full APRS client.
- Keeps your objects in a JSON file compatible with Pinpoint APRS's
pinpointAprsObjects.json(copy yours in). - Beacons each object on its own interval, kills it on request or at an expiry time (three
_kill packets, 35 s apart, then silence) and can revive it later. - Sends through Graywolf's REST API (default, works with a stock Graywolf) or KISS over TCP (Graywolf's KISS interface or any KISS TNC).
- Web UI: map with symbol markers and countdown labels, object cards with search and filters, a searchable APRS symbol chart, CSV import with automatic 9-character names, CSV export, an activity feed of every packet, light and dark themes.
- Checks for new releases and, on Windows, updates itself.
- Talk to APRS-IS directly. Graywolf's iGate handles gating.
- Receive or display incoming traffic. That is Graywolf's map (and VarMap's, which shows Graywolf's APRS stations and objects next to VarAC stations).
Windows. Download EmcommObjects-Setup-<version>.exe from the
Releases page and run it. It installs per-user
(no administrator prompt), adds a Start-menu entry, optional desktop shortcut and start-with-Windows,
and opens the UI at http://127.0.0.1:8765. Prefer no installer? Take
emcomm-objects-<version>-windows-x64-portable.zip, unzip anywhere, run emcomm-objects.exe.
macOS / Linux / Raspberry Pi. Unpack the matching .tar.gz, run ./emcomm-objects, open
http://127.0.0.1:8765. The macOS binary is not code-signed: right-click > Open the first time.
From source (Go 1.22+):
git clone https://github.com/KK4ODA/emcomm-objects
cd emcomm-objects
go run ./cmd/emcomm-objectsWhere files live: the installed Windows build keeps config.yaml, objects.json and
emcomm-objects.log in %LOCALAPPDATA%\EmcommObjects; portable and source runs keep them beside the
executable (or in the working directory under go run). --data <dir> overrides either.
The app starts, opens your browser and shows Settings:
- Callsign-SSID to beacon from, e.g.
N0CALL-12. Use an SSID that is not Graywolf's own station SSID, so the iGate does not treat your objects as its own traffic. - Radio transport:
- Graywolf API (recommended): Graywolf URL (
http://127.0.0.1:8080), the username and password you use for Graywolf's web UI, and Send to (RF only, RF + APRS-IS, or APRS-IS only for a station without a transmitter). Test connection confirms the login and fills the radio channel list. - KISS over TCP: in Graywolf add a KISS Interface of type TCP, mode modem (mode
tncsilently drops injected frames), listen address127.0.0.1:6700, KISS port 0 mapped to your APRS channel. Then enter127.0.0.1:6700here.
- Graywolf API (recommended): Graywolf URL (
- Save. The pill in the top bar turns green when the radio link is up.
Create objects with New (click Pick on map to place them), or import a CSV. Imported objects start disabled so nothing goes on the air until you enable it.
Every object becomes one object beacon in Graywolf (disabled there, so Graywolf's own scheduler never
fires it) and Emcomm Objects calls send now on your schedule. A kill temporarily turns the same beacon
into a custom beacon that carries the spec-exact ;NAME _DDHHMMz… info field, and the beacon is
deleted once the kill sequence has drained or when you delete the object. You will see the beacons on
Graywolf's Beacons page; leave them alone.
Emcomm Objects can link this station to EmComm Planner, the deployment planner the same group uses for staffing, packets and net control:
- Stations up. Every APRS station Graywolf hears is forwarded to the planner, where net control sees each operator's last position next to their check-in status and the Sites map shows everyone heard, coloured by age.
- Messages down. Operators who choose APRS under the planner's Profile > Notifications get their offers and packet changes as APRS messages, sent through Graywolf by this app.
- Objects. Import deployment sites as objects pulls the active deployment's sites (aid stations, net control, staging) as disabled objects ready to beacon.
- Check-ins over APRS need no bridge at all: configure Graywolf Actions with the webhook URL
the planner shows, and
@@#checkin,@@#onpos,@@#checkout,@@#statusfrom any APRS radio go straight to the planner.
Setup: on the planner's APRS page create a bridge and copy its token; in Emcomm Objects open
Settings > EmComm Planner, paste the planner URL and the token, tick what to sync, Test link,
Save. The token is stored in config.yaml on this computer and never shown again. The status
pill in the top bar turns green when the link is up.
config.yaml (see config.example.yaml) mirrors Settings: station, transport
(graywolf or kiss), graywolf, kiss, storage, web, updates. Everything except the web address
and the objects file applies live when saved from the UI. --init-config writes the annotated template.
emcomm-objects run (transport + scheduler + web UI)
emcomm-objects --no-browser run without opening the browser
emcomm-objects --data D:\eo use another data directory
emcomm-objects --beacon NAME send one live beacon and exit
emcomm-objects --list list objects and exit
emcomm-objects --init-config write config.yaml and exit
emcomm-objects --version
The Windows release binary has no console window (logs go to emcomm-objects.log and the Activity tab);
use the source build for the --list / --beacon style commands.
The web UI is a thin client over a local JSON API that other tools may use (VarMap-style):
| Endpoint | Purpose |
|---|---|
GET /api/objects |
all objects, Pinpoint-shaped JSON (ObjectName, Latitude, Longitude, SymbolTable, SymbolID, Comment, IntervalMinutes, LastBeacon, Enabled, Status, …) |
GET /api/objects.csv |
CSV export |
PUT /api/objects/{name}, DELETE /api/objects/{name} |
create/update, delete |
POST /api/objects/{name}/beacon, /kill, /revive |
actions |
POST /api/objects/beacon-all |
send every enabled object now |
GET /api/status |
version, transport state, station, paths, update state |
GET /api/config, PUT /api/config |
settings (the Graywolf password is never returned) |
POST /api/graywolf/test |
try Graywolf credentials |
POST /api/planner/test, /api/planner/sync, /api/planner/import-objects |
EmComm Planner link: check the token, sync now, import the active deployment's sites |
GET /api/update, POST /api/update/check, /apply, /skip |
updater |
GET /api/events |
Server-Sent Events: packet, state, log, objects, config, update |
The app checks GitHub at start and every 12 hours (only the version number is fetched). When a newer release exists an orange Update pill appears:
- Windows (installer or portable): click it and choose Install now. The release is downloaded,
verified against
SHA256SUMS.txt, the app closes, installs and reopens. Settings and objects are kept. - macOS / Linux / source: the pill links to the release page.
Settings → Updates has the toggle, the interval, Check now, and the update dialog has Skip this version.
release.bat 0.2.0 runs the tests, tags v0.2.0 and pushes; GitHub Actions builds the Windows installer
and portable zip, the macOS and Linux tarballs and SHA256SUMS.txt, and publishes them with the matching
section of CHANGELOG.md as release notes. packaging\build.ps1 -Version 0.2.0 does the same build locally
(needs Go, and Inno Setup 6 for the installer).
APRS symbol sprites from hessu/aprs-symbols by Heikki Hannikainen
(OH7LZB), derived from Stephen Smith's (WA8LMF) set; see internal/web/ui/symbols/COPYRIGHT.md.
Maps by Leaflet with OpenStreetMap tiles.
MIT.
