Multi-Domain Ground Control Station
One console to fly drones, drive ground robots, sail boats, and dive underwater vehicles — all on one screen. Multi-domain from day one, license-clean, works air-gapped. No cloud, no vendor lock-in. This is the full build log, oldest question to newest answer.
Newest answer to oldest question
The EMERGENCY button that did nothing
A command came back REJECTED with no reason given. Chasing it down led me to a button labelled EMERGENCY that had never worked on that aircraft type — not broken, not disabled, just quietly incapable while looking exactly like a working control. The bug was one word in a list.
Latest 2026.08.14A number is not a measurement
The console said the drone was at 394. Four hundred what, measured from where, and as of when? A bare number on an operations screen is three questions pretending to be an answer. Today I shipped the unit, the reference frame, and the age — and a test caught me quietly widening a safety limit while converting between them.
2026.08.11A Dead Drone That Looked Alive
This is the most important safety bug I've fixed on this project, and the scariest kind: the drone lost its link, and the console kept showing it flying. Frozen position, frozen battery — a calm, healthy-looking asset that was no longer talking to anyone. Silence has to look like silence.
2026.08.03A Simulator, and the Five Bugs That Only Showed Up Once I Flew It
I added the MAVLink adapter and the tests passed. Then I built a tiny simulator so I could actually watch a vehicle fly — and within ten minutes it handed me five real bugs the green test suite never caught. One of them crashed the whole console.
2026.08.03One Port, Many Drones: Teaching the Console to Speak MAVLink
The console could already fly my own simulator. Teaching it MAVLink — the protocol industry autopilots speak — was supposed to be the big job of the week. It was a small one, and that's the whole point: a new kind of vehicle is a new adapter behind one unchanged seam.
GatedOne Map, Eleven Radars: A Whole-Fleet Glance
A map answers where everything is. It's bad at telling you which asset is about to have a problem. So I built the what-view: eleven assets, every critical number, one screen — a grid of identical status cards where trouble literally glows.
2026.07.20Sealing the Black Box: Making the Tape Tamper-Evident
The recorder is append-only, which makes it honest but not tamper-evident. It still trusts whoever holds the file. This post chains every event to the last, so changing any past entry breaks the whole chain after it. There is no quiet edit.
Gated 2026.07.14The Black Box: An Append-Only Record of Everything
I promised the recorder at the end of the pipeline post. Here it is — every operator action, every gate verdict, every command that reached a vehicle, written to a log that only ever grows. After an incident, you replay the tape.
Gated 2026.07.09Wiring the Command Pipeline: The Ticker Stops Being a Promise
I'd marked the command pipeline "designed, not wired" and said so plainly. This post closes that gap — every command now traverses RBAC → Safety → ROE → Authorization before anything moves. The architecture that made it a small change instead of a rewrite.
Gated 2026.07.09Why TypeScript Now — and When I'd Reach for Rust, Go, or C++
Is the stack good, or should the whole thing be rewritten in something faster? For what this software does today, TypeScript isn't a compromise — it's the right fit. The other languages have a real place, but at the edges, and only at a concrete trigger.
Thinking Ahead: The Comms Layer, and a Polyglot Edge
A direction post, not a shipped-feature post. Resilient datalinks, gateways, a mission system, and integration through published standards — plus why the edge goes polyglot (Rust, Go, C/C++) while the core stays TypeScript.
2026.06.28Zero-Trust: What I Actually Enforce, and What I Only Designed
Most security write-ups blur the line between what's enforced in code and what's on a slide. For a defense-grade console that line IS the deliverable. Here's mine drawn explicitly — enforced, designed-but-not-wired, and roadmap. Naming the gap is the point.
Gated 2026.06.25Talking to Drones Without the Internet
Air-gap means no internet, not no communication. The two-channel model, the local bearers, and the one seam that lets any device plug in — plus the first real hardware adapter, a clean-room Tello driver. (The Tello is the proof, not the plan.)
Gated 2026.06.25The Stack — and the Three Rules That Picked It
TypeScript, Electron, React, MapLibre — and the three hard rules that chose every one of them: license-clean, runs air-gapped, and dangerous parts impossible by type. The stack is downstream of the rules.
Gated 2026.06.01GCS Build Log: Days 0–6
The day-by-day journal — what actually happened. Docs, design tokens, the map going live, making it testable, a ghost bug that took three sessions, and why I wrote a design doc instead of code.
Gated