Multi-engine setups
Several radios, remote Coops
Perch and Coop are deliberately separable: any Perch can watch any Coop it can reach. That one idea covers a lot of setups.
The engine switcher
Perch's header has an engine menu — add a Coop by host or IP and Perch probes the
well-known ports (2667 and its fallbacks, plus https:443) to find it, then remembers it.
Switch engines and the whole dashboard re-points. Manage the same list via
GET/POST /perch/engines, /perch/select, /perch/edit,
/perch/remove, /perch/probe?host=….
Common shapes
| Setup | How |
|---|---|
| Second radio on the same desk | Run a second Coop; it auto-binds the next port (2667 → 6374 …). Add it as a local engine and flip between radios. |
| Basement capture box, laptop viewing | Coop runs headless on the box (MESH_WEB_HOST=0.0.0.0); your laptop's Perch adds basement-box.local. Set a real apiKey. |
| Remote site over Tailscale | Coop at the remote site; add host.tailnet-name.ts.net as an engine. Tailscale provides the security; this is the pattern for a mountain-top or family-house node. |
| Public / shared viewer | Run the remote Coop with MESH_READONLY=1 — full dashboard, zero transmit, even with the key. |
Running Coop headless
# linux box or Pi — single static binary, no dependencies
MESH_WEB_HOST=0.0.0.0 MESH_API_KEY=a-real-secret ./coop
# as a user service that survives reboots (systemd):
systemctl --user enable --now coop.service # simple unit that execs the binary
loginctl enable-linger $USER
Flags & addresses worth knowing
perch -addr 0.0.0.0:8790— expose the dashboard itself to your LAN.perch -engine http://…:2667— the default engine at startup.- Every remote engine entry stores its own control key; loopback engines never need one.
The multi-radio future — one Perch aggregating several Coops into a single merged view — is the roadmap's favorite child. Today it's one engine at a time, switchable in two clicks.