Case study: a prototype, on purpose
Airport HQ
A front-end prototype for a small fixed-base operator, built in a couple of days on the shape of their real numbers, to show them what one workbook a month was hiding.
- Role
- Solo: discovery, product, design, build and the demo
- Built in
- A couple of days · Aug 2026
- Stack
- Next.js 16, React 19, TypeScript, Tailwind 4, Anthropic API, Zod
- Status
- Prototype. Demoed; not adopted yet
- Business
- Anonymous. The name in the screenshots is invented
How it started
My dad asked me to look at their website.
My dad started working at a fixed-base operator, the business on an airfield that sells fuel, rents hangars and runs the maintenance shop. He wanted my read on their systems, and thought I might tidy up the website while I was at it.
Once I heard how they were actually running the place, the website stopped being the interesting part. It was clear how simple it would be to bring their reporting into 2026, and just as clear that some of their other systems needed attention before they'd be ready for it.
The problem
One workbook per month.
Everything was entered by hand into Google Sheets, with a new workbook for every month. Each month is fine on its own. The trouble is anything that spans months: which truck earns more, what winter actually costs, whether a tank is losing fuel or a meter is drifting. Those answers are all in the sheets, spread across files that never talk to each other, so nobody asks.
One detail told me I'd understood the business rather than just the request: FBOs compete on posted fuel prices, and pilots decide where to buy fuel based on them. A stale price on the website isn't a cosmetic bug. It's a plane landing somewhere else.
What I decided,
and what I rejected
Five calls, and what each one cost.
Call 01Change nothing about how they work
They gave me one real month of numbers, exactly as they track them. My goal wasn't to change their process at all. It was to show them how powerful the data they already collect could be.
If they'd had to learn a new way of working before they could see the value, the demo would have been about the new way of working. This way the only new thing on the screen was what their own numbers could now do.
- Chose
- Every sheet became its own screen with data entry built in, laid out the way staff already track it.
- Rejected
- A new workflow modeled on what FBO software usually does.
- The cost
- Some screens inherit the sheets' quirks. That's the point: they recognized every one of them.
Call 02Make moving between months effortless
One workbook per month was the actual problem, so flipping between months (and laying several side by side) had to take a click rather than an afternoon. The goal was year-over-year comparison once there was a year of real data behind it.
For the months I didn't have, I generated data with the same shape as the month they sent, and said so plainly. They were looking at their own sheet with more months attached, and they knew which month was real.
- Chose
- Month filters on every report and side-by-side comparison across several months, with year-over-year next.
- Rejected
- More dashboards for a single month.
- The cost
- With one real month, the history had to be generated, in exactly the same shape as theirs, and I told them which was which.
Call 03Questions in plane English
In the demo I asked it which fuel truck was the most profitable. That's a question their sheets can only answer with an afternoon of copying columns between monthly files. Here it's one sentence, and the answer shows its working.
The example questions matter as much as the text box. Nobody knows what to ask a blank input about their own business; six good questions teach the shape of the thing in a glance.
- Chose
- Natural-language questions answered by Claude over their own numbers, with example questions to start from.
- Rejected
- Another report to go looking for.
- The cost
- An answer is only as honest as the brief behind it, which is the next call.
Call 04Put the known gap in the system prompt
The maintenance shop's labor billing isn't recorded anywhere; only parts spend is. So the shop always reads as a loss. An analysis layer looking at that will tell you to cut the shop, confidently and disastrously, for a business whose fuel customers land there because there's a mechanic on the field.
So the gap is stated beside the line in the profitability view and in the prompt the model actually sees. The insights describe it as what it is, a gap in the records rather than a failing shop, and recommend starting to record what the shop bills. A model's output is only as honest as its brief, and the things you know are missing from your data are exactly the things it can't infer.
- Chose
- Encode known gaps in the records in the prompt, and show them next to the affected number.
- Rejected
- Hiding the line, or letting the model reason from books it doesn't know are incomplete.
- The cost
- The prompt now carries domain knowledge that has to be maintained alongside the data.
Call 05Give them the keys to their own page
Changing the fuel price on their website meant working out who built it, getting in touch, and asking. That's a chain of people and an unknown wait standing in front of a number that changes weekly and decides where pilots buy.
In the prototype, the staff portal renders the public page inside the admin and staff edit it where it appears: the prices, the wording, and which third parties (detailers, mechanics) show up on it. The bottleneck was a person, not a technology, and it would have been easy to fix the wrong half.
- Chose
- In-place editing of the public site: fuel prices, wording, and which detailers and mechanics are listed.
- Rejected
- Asking whoever built the website every time a number changes.
- The cost
- No approval step. Right for a weekly fuel price; wrong for anything with legal weight.
A detail I like
The loading bar is a plane.
When the analysis is thinking, a small aircraft taxis down a dashed runway. It's there because it makes the software a little more fun to use, and because it's honest about time in two ways that are easy to get wrong.
- It never claims to be finished early. It eases toward 95% over the expected duration and holds there; only the finished answer takes it to 100%.
- It isn't stranded in a background tab. Its position comes from how much time has actually passed, not from animation frames. Browsers pause those in a hidden tab, which would leave the plane mid-runway when you came back.
The easing curve is tuned too: a squared curve covers a fifth of the runway in the first tenth of the time and reads as a jump, so it uses a gentler one. Here it is, ported to Vue:





The demo
They liked it. They weren't ready.
I showed it to the owner and to the person he's preparing to take the business over. The owner has run it this way for years and didn't see a problem. The person taking over from him saw the value straight away.
I was straight with them about the risk. I could build this for them, but it would be one person supporting software their business runs on. That's a real risk, and one they deserved to hear from me rather than discover later.
I also looked at what else is out there. Most FBO reporting software is sold by fuel suppliers, and it's built to keep the FBO dependent on that supplier's product. An independent tool that works from their own records is a genuinely different offer.
They're still deciding. The website changes and security updates went to the company that built their site originally, and I'm hoping to bring the reporting side back to them when the timing is right.
What I'd do
differently
Nothing. I went in knowing.
I built it knowing there was a strong chance they wouldn't adopt it, and that was fine. It was a new domain, a real business, and a chance to think a problem through from scratch using everything I've picked up across my career. I loved the exercise.
And it did its job: it showed them what they were missing, in their own numbers. It's how I'd start with anyone: the finished-looking front end first, with the back end built once the answer is yes. That's the front end first idea on the home page, done for real.