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:

Ready when you are0%
Airport HQ dashboard for a fictional FBO: cash box and fuel tank readouts, month-to-date gallons pumped, this month’s fuel revenue, landing fees and net profit estimate, and quick actions to log fuel, add a cash box entry, update the public site or view reports.
The morning view: tank levels, the cash box, month to date, and the four things staff start the day doing. The business name is invented; the real one stays anonymous.
AI Insights page in sample mode: a summary of thirteen months, Jet A fuel as the top earner, the maintenance shop described as a gap in the records rather than a failing line, and a list of dated anomalies with explanations.
The analysis layer. The maintenance shop reads as a gap in the records, not a shop to cut, because the prompt was told what the books are missing.
Ask the data panel: six example question buttons, the question “Which truck earns more, and by how much?”, and an answer comparing Truck #3 on Jet A with Truck #4 on 100LL.
The demo question, more or less word for word. In the monthly sheets it is an afternoon of copying columns; here it is one sentence.
Profitability page listing margin by service line with revenue, cost, margin percentage and gallons for Jet A, 100LL, landing and ramp fees, hangar rental and the maintenance shop, with explanatory notes under the split lines.
Deterministic arithmetic, no model involved, including the 80/20 landing fee split after tax and card fees, and the hangar owner’s 70% share of net rent.
Public Site Content page: the fictional FBO’s public homepage rendered inside the staff portal, with the headline, description and fuel prices editable where they appear, and a Save changes button.
The public page, editable where it appears: fuel prices, wording, and which detailers and mechanics are listed. No more asking whoever built the website.

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.