Less thought leadership,
more real talk.
Build logs from projects I build on nights after work and on weekends — never on company time, never with a team. Grouped by project — open one to see every entry in that log. Some posts have sections behind a password; the concepts stay open, the implementation detail doesn't.
After hours Everything here is built in the hours left over after a full-time job. That's the pace, and it's the honest reason some logs go quiet for a while.
Written with AI These posts are composed with AI in the loop — the same way I build. The systems they describe are designed and architected by me, and every claim is something I checked, corrected, or cut as the engineer who did the work. If it's wrong, that's on me, not the model.
Narra — AI That Presents, and Answers For Itself
Multi-Domain Ground Control Station
One console to fly drones, drive ground robots, sail boats, and dive underwater vehicles. Multi-domain from day one, license-clean, works air-gapped. TypeScript, Electron, MapLibre. Apache-2.0, my own IP.
AI-Powered SDLC Agent Platform
A multi-agent platform that turns a prompt into generated code, tests, design, and an audit trail. An append-only debugging journal — honest about what broke, and specific about why.
Drone + SDR Validation Platform
A device-agnostic framework for validating autonomous systems, with signal analysis. Hardware first, AI later — prove the rig before trusting the model.
Enterprise Knowledge Platform
Local-first RAG that unifies enterprise knowledge across trackers, wikis, and code hosts — surfaces the conflicts between them, and helps a human decide with an audit trail. Read-only by design.
All 28 entries
Whodunit: The Case of the Crashing Computer
An evening of pilot testing where everything kept crashing. The GPU was framed by a ghost, the AI had an alibi with receipts, and the real culprit was me — running every project at once on hardware I'd forgotten was finite. Also: the one-command triage tool this mess earned.
Latest 2026.08.15The 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.
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.13Hardware first, AI later
The plan for a device-agnostic validation framework for autonomous systems. Starting where it matters: can we talk to a drone and listen to the spectrum? Simulation is running; the physical hardware goes on the bench next.
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.
Gated 2026.07.30One 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.10The Day I Mostly Didn't Build (and Why That Was the Point)
Some days you ship code. Some days you ship clarity. An audit found six unused dependencies, four frameworks in the docs that the code never imported, and nine capabilities in the pitch deck that lived in no backlog. Today produced no features. It produced a project that knows what it is.
Gated 2026.07.10A Cancel Button That Lies, and Retrieval That Returns Garbage Confidently
Two problems six weeks apart that turned out to be the same problem. A cancel button that stopped the UI but not the work. A search that confidently returned a table-of-contents fragment. Both fixed by refusing to make the primary mechanism smarter.
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.
2026.06.30Thinking 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.23One Connector for Every Tool Server (and the Bugs You Only Find by Running It)
It started as "how do we ingest our wiki?" and ended as a generic, reusable connector. The unit tests passed against a fake server. Then I ran it against a real one, and reality had notes — a Windows subprocess bug and a reference server that didn't implement the primitive I'd assumed.
Gated 2026.06.10Governance, Generated Documents, and a Freeze Hiding in Plain Sight
The platform went from "it surfaces problems" to "it helps you decide and produce" — and ended with a bug it had already warned me about. In a document it wrote. About itself. I should read my own generated docs.
Gated 2026.06.08Making It Legible: Conflicts You Can Act On, and Knowing Your Own Machine
A long UX sweep driven entirely by someone poking at the app and asking the questions a real user asks. A wall of 2,773 near-identical rule cards became a navigable tree. The value isn't the feature — it's making the feature legible.
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 2026.06.01Building an Enterprise Knowledge Platform
Where it started. Retrieval-augmented generation over enterprise documents, designed to run disconnected. The architecture, the retrieval strategy, and the honest trade-offs.
Gated 2026.05.01The Cache Trap: When a System Fails Identically Every Time
Two runs of the same prompt produced byte-identical test files — both containing a test that asserted a plus sign would lowercase to False. The system wasn't broken randomly. It was broken reproducibly, which is worse. Plus the architectural decision that removes a whole risk class.
Gated 2026.05.01The Failure Mode Wasn't the LLM — It Was the Contracts Between Agents
Codegen wrote source and the tester independently guessed what was in it. The reviewer judged code it couldn't see. A fallback string became a project requirement and four stages built on top of it. Every implicit assumption between agents was a place a bug could hide.
Gated 2026.05.01Most "AI Flakiness" Was Infrastructure Flakiness
I spent days convinced the model was the problem. Random hangs, empty error messages, runs dying mid-pipeline. It was a file watcher, a timeout, and an event loop policy. When part of your system is non-deterministic, every other bug gets to hide behind it.
Gated 2026.05.01Building a Ground Control Station from Scratch
Where it started. What a GCS is, why I'm building one from scratch, and why multi-domain and license-clean matter. Civilian, Apache-2.0, my own IP.
Gated 2026.05.01Building an AI-Powered SDLC Agent Platform — The Honest Build Log
Where it started. The architecture, the agent roster, the war stories. What it takes to build an agent platform for the software development lifecycle — and what I'd do differently.
Gated