brokermon: camden-edge-2
StackBun · Hono · React 19 / Vite 7 / Tailwind 4 / jotai · valibot · bun:sqlite (WAL) on a persistent volume · one hardened rootless-podman container (read-only rootfs, cap-drop=ALL, no-new-privileges, non-root), Quadlet unit, deployed by ansible
WitnessAuthenticated mqtts:8883 client subscribed to the whole DJI Cloud API topic tree, recording every message to SQLite · never publishes: the client is wrapped to expose only subscribe/receive, enforced by a startup assertion and a unit test · the record survives container replacement, which is the point (the fs10 flight evidence was lost when logs and Postgres wiped on boot)
ViewsLive dock/drone state coalesced from partial osd/state deltas, with per-field change pulses and sparklines · broker view (topic tree, message rates, clients, $SYS) · tid request↔reply and bid whole-operation correlation · schema baselining to diff structure across generations and firmware
DetectDock generation and aircraft model derived from the live OSD (sub_device.device_model_key), not asserted: M3TD/Dock 2 = V2, M4TD/Dock 3 = V3, verified against live traffic · schema drift against the documented Dock-2 baseline surfaces unpublished Dock-3 behavior (this host: V2, M3TD)
SecuritySurfaces credential and control material on the wire for detection (drc_mode_enter creds, device_secret/nonce, object-store tokens) · token-gated UI over HTTPS/WSS · optional in-window BYOK agent, gated default-off and off on every edge host, key held in the browser and never on the edge · in-app reference overlay with an architecture diagram and operator-oriented DJI MQTT docs, rendered without dangerouslySetInnerHTML
Read-only MQTT witness for robotic (DJI dock/drone) systems: intelligence-gathering, monitoring, and investigation