Field notes from the flight deck.
Build notes from TarmacLabs. Lessons from running a one-person aviation software company while flying full-time. No polish, just notes.
click to toggle · double-click for solo
The dashboard that reads zero
I built an internal KPI dashboard. It shows zero waitlist signups, zero contact submissions, and a flat-line chart. That's the point — you can't fix what you refuse to measure, and the measurement has to hurt a little.
Read post →Twenty PRs in one day, across three products
May 31 was a full-throttle day across Trim, AutoBrief, and TarmacLabs. Twenty merged PRs. Playwright E2E in Trim. Predictive compliance calendar in AutoBrief. A decimal-versioning system so the changelog reads like a living product, not a list of commits.
Read post →How to brief an IFR departure you've never flown (the 60-to-1 rule in practice)
Every published ODP or SID hands you a gradient in feet per nautical mile. Your VSI reads feet per minute. They're not the same number until you know your ground speed. Here's how to bridge them — and when to say no.
Read post →The endorsements most CFIs forget (and when the FAA asks for them)
There are 21 endorsements in AC 61-65K. You use maybe 6 regularly. The other 15 sit there until the day a DPE, an inspector, or a logbook audit makes their absence your problem. Here are the ones that trip people up.
Read post →When does your medical actually expire? The end-of-month rule, decoded.
Your medical doesn't expire on the anniversary of the exam. It expires at the end of a calendar month — but which month depends on your age, your class, and whether you're exercising first-class or third-class privileges. Here's how to stop guessing.
Read post →How a one-person SaaS hardens itself
Trim hit production with auth, payments, and pilot data — and a startled realization that nothing on the security side was load-bearing yet. The hardening sprint that followed wasn't sexy. It was three migrations and one audit, and it's the work that made the rest of the company possible to ship.
Read post →Grep every mockup, not the one in the report
Two months ago I scrubbed a marketing mockup of real beta-user names. I missed its twin. Yesterday's audit found four real students live on three pages — and the fix the original report didn't teach me is the one that matters.
Read post →Instrument before you troubleshoot
Three external CFIs signed up to Trim. Zero have flown a lesson through it. For two months I shipped UX guesses at the activation problem. Today I finished wiring the instrument the airplane was missing.
Read post →What encoding the FARs as pure functions actually looks like
The AutoBrief rules engine is ~300 lines of TypeScript. No model in the loop, no opinion, no fuzziness. Each Part 61 check is a pure function — same inputs, same output, citable to a section number. The AI sits on top. The legal call stays deterministic.
Read post →The sixteenth tool, and the 60-to-1 rule
Tool fifteen was supposed to be the last for a while. Then I went to brief a terrain-boxed IFR departure, reached for a climb-gradient calculator I'd just claimed I had, and didn't have it. So I built number sixteen.
Read post →The night AutoBrief got its name and its engine
Started the night thinking we'd reactivate AutoDispatch. The domain was taken. So we renamed it AutoBrief, then wrote the GO/NO-GO rules engine that's the actual product — pure TypeScript, 14 CFR by the section number.
Read post →AutoBrief V1, in one night
Started the evening with a working title and no domain. Ended it with eleven routes, a deterministic rules engine, an AI brief generator, full roster CRUD, an audit trail, and twenty-nine passing tests. The leverage isn't AI — it's the founder being inside the work.
Read post →Where it lives when it doesn't live anywhere
I shipped 42 commits of AutoBrief in two nights. Then my co-founder (me, but in pilot mode) asked the obvious question: where is it? Explaining the gap between 'feature-complete' and 'someone other than me can see it' — and what I built next.
Read post →The free tool is the pitch
I built a free 14 CFR Part 61 currency calculator and put it on the marketing site of a SaaS I'm trying to sell. That seems backwards. It isn't. The calculator IS the pitch.
Read post →Why the W&B calculator ships with zero aircraft presets
Most weight-and-balance calculators ship with a dropdown of common aircraft. Pick C172. Pick PA-28. Get the numbers pre-filled. We deliberately don't do that. Here's the engineering reason — and what it tells you about the rest of our stack.
Read post →What's new on tarmaclabs.org — May 2026
One session, fourteen commits, three free tools live, an interactive AutoBrief demo, real Trim usage stats on the home page. A snapshot of what changed and why.
Read post →AutoBrief is live.
Two days ago I wrote about how AutoBrief was 42 commits deep on my laptop and had no live URL. Today it has one. Here's what shipped, how I made the call to skip Supabase, and what's next.
Read post →Building the tool to sell the tool
Twenty minutes after AutoBrief went live, I built a private dashboard on tarmaclabs.org with click-to-copy cold-email templates. Felt indulgent. Wasn't.
Read post →The build that almost broke
Hours after AutoBrief went live, my next push to tarmaclabs.org failed in production. The change had nothing to do with the file that crashed. Here's the trap that caught me.
Read post →One feed for four products
Trim had its own changelog. AutoBrief had a CHANGELOG.md. TarmacLabs.org was tracking its own commits in journal posts. Tonight I consolidated them into one feed at /changelog. Here's why.
Read post →The four-tool moat
Tonight I shipped a Density Altitude calculator. That makes four free tools on tarmaclabs.org: METAR, Currency, Weight & Balance, and now DA. Four is a number that matters. Here's why.
Read post →Tools as a platform
Four nights ago I wrote about the four-tool moat. Tonight there are eight. The marginal cost of a new tool is dropping toward one sub-agent, and that changes what a `/tools` page is for.
Read post →Why we built a /services page
TarmacLabs has always been two arms — aviation products and custom builds. Tonight the second arm got a public surface. Here's why now, what we'll take on, and what we won't.
Read post →Fifteen tools in one night
Started the evening at four tools. Ended at fifteen. Same engineering pattern, same testing discipline, same FAA-data-only rule. The marathon was a stress test of the platform, not a flex.
Read post →iPad on the ramp
A CFI just shut down. Eleven minutes between flights. They open Trim on an iPad and try to drag the next lesson on the calendar. Nothing happens. The lesson sits there. They give up.
Read post →Why I'm building Trim at 5 AM before flight lessons
Most aviation software is built by people who don't fly. Trim is built by someone who flies six days a week — and the schedule shows in the product.
Read post →iPad on the ramp — why drag UIs need Pointer Events, not Mouse Events
A CFI texted me from the ramp: 'Trim won't let me drag a lesson on my iPad.' Cost me an hour. Root cause: iOS Safari doesn't dispatch mousemove during a finger drag. Here's the fix and the rule I'm saving forever.
Read post →When the roadmap PDF made the company make sense
I had been building Trim for twenty-four days. I could not, in that moment, have explained to a stranger what the product was, in order, without opening four files. So I sat down and drew it.
Read post →The OAuth cookie that wouldn't survive a redirect
Google sign-in had been broken for an unknown number of users for an unknown number of hours. I spent an hour staring at code that hadn't changed. The bug turned out to be a single 308 redirect between two domains.
Read post →Day three of silence — when your first customer goes dark
My first CFI signed up to Trim, completed onboarding in ten seconds, and didn't open the app for fifty-eight hours. Me knowing nothing while they did nothing — that's the whole job.
Read post →The day cfitrim.com became a real domain
Bought the domain at a gate hold. Two clicks, twelve dollars, done. Walked back out to the airplane. The side project crossed a line that morning — quietly, between two flights.
Read post →Every chip is a gauge
There are forty-three chips in Trim. By month two I had built each one a little differently. That was the problem — a panel of gauges is only useful if you can read them at a glance.
Read post →2 AM, a NaN, and a quiet airplane
The lesson score chart was rendering NaN coordinates. Every chart on every student detail page was crashing the React tree silently. I had not been watching Sentry. I found it by walking all 28 routes by hand.
Read post →Magic links and the weight of a live database
Day three of the build. Auth was wired, Postgres was up, seventeen surfaces were talking to a real database. Before that day, every bug was a learning moment. After, every bug was a potential customer-data problem.
Read post →Lock the name. Then go fly.
Day two of the company. The morning was competitive research. By noon I had pivoted the focus from endorsement tracker to all-students dashboard. By afternoon the name was locked. Then I went flying — that's how a pilot commits to a runway.
Read post →Why a freelance CFI tool can't live inside a flight school tool
Day one. The original plan was one product. One codebase, two buyers, twice the market. I killed that plan before the day was over — a freelance CFI and a flight school don't fly the same airplane.
Read post →