Management and operations daemon for OpenMANET mesh networks. Runs on OpenMANET mesh nodes and provides, mesh management, an embedded React web interface, and a gRPC/HTTP API.
MeshTopologyService) with 60s churn metrics
(routes added/lost, gateway changes, reconverge time) for the UI
topology viewgpsd to stream position dataCommsService, DashboardService, WifiConfigService, NetworkInterfaceService, BLOSService, MeshTopologyService, GNSSService, node and status endpointsCommsService) and BLOS events (BLOSService)Authorization: Bearer header for direct callers — see docs/api-authentication.mdcmd/ CLI entry points (root daemon, frontend-only mode)
internal/openmanet/ Top-level wiring — starts all subsystems
internal/openmanet/server/ ConnectRPC HTTP server + service registration
internal/openmanet/server/handlers/ Service handler implementations
internal/api/ AUTO-GENERATED protobuf + ConnectRPC Go stubs
internal/comms/ Opus/RTP audio, PTT control, jitter buffer
internal/blos/ BLOS/Tailscale/VXLAN overlay
internal/mgmt/ Alfred mesh management, wireless config
internal/gpsd/ gpsd integration, NMEA/CoT publishing
internal/network/ Network interface, DHCP, routing, UCI config
internal/frontend/ Embedded HTTP server (serves SPA, proxies /api and /ws)
internal/database/ SQLite: schema.sql + query.sql; models/ is generated
internal/config/ Viper-backed config (/etc/openmanetd/config.yml)
proto/ Git submodule — .proto source files
frontend/ React SPA (Vite); build output → static/
Ports: API + WebSocket = 8087. Frontend = 8081 (proxies /api/* and /ws to 8087).
Start the DevContainer and run:
make build # fmt → vet → buf → sqlc-gen → frontend → compile
./bin/openmanetd
Use make build-lite for a smaller binary (~5 MB) without audio/comms hardware dependencies.
Frontend dev server (hot-reload, pointed at a remote node):
cd frontend && VITE_API_TARGET=http://<node-ip>:8081 pnpm run dev
Frontend-only mode (no local database or hardware):
./bin/openmanetd frontend --api-address http://<node-ip>:8087
The config file lives at /etc/openmanetd/config.yml. Key sections:
| Section | Purpose |
|---|---|
alfred.* |
Batman-adv alfred socket, data type publish toggles |
blos.* |
Tailscale enable, auth key, status poll interval, advertised mesh subnet |
gnss.* |
gpsd enable, NMEA/CoT output |
meshTopology.* |
Delta-tracker sample interval and ring size (powers the 60s churn panel) |
frontend.* |
HTTP/HTTPS listen addresses, TLS cert paths |
api.* |
gRPC API listen address |
database.* |
SQLite file path |
instrumentation.* |
Periodic JSON snapshot capture (see docs/instrumentation-snapshot.md) |
runtime.* |
Memory limit, GC tuning |
proto/, a git submodule from OpenMANET/protobuf. If empty: git submodule update --init --recursive, then make buf.go-sqlite3, portaudio, go-alfred). Use make build-lite to skip comms/whisper.internal/api/, frontend/src/gen/, or internal/database/models/ — these are generated and will be overwritten.| Task | Command |
|---|---|
| Full build | make build |
| Lite build (no hardware deps) | make build-lite |
| Run Go tests | make test |
| Integration tests | make integration-test |
| Frontend tests | make test-frontend |
| Lint (Go + React) | make lint |
| Regenerate protobuf | make buf |
| Regenerate database models | make sqlc-gen |
Further documentation can be found in the Getting Started doc.
$ claude mcp add openmanetd \
-- python -m otcore.mcp_server <graph>