Side project

Trekmates

I had never built an app. Then eight of us went to Greece.

Company
Side project
Role
Designer, and whatever else it needed
Dates
April – August 2026

Two families were going to Greece for ten days. Eight of us, two households, four parents and four daughters between fifteen and nineteen. The planning lived in a group chat, three Google Docs and a spreadsheet nobody had opened in a week. So I built an app instead. I had never built one before.

Four phone screens from a test trip called Las Vegas Trip. First, a day as a list: Saturday August 1, with a flight, a hotel check-in, a blackjack session and lunch, each on its own card with a time and a place. Three of them carry a blue Booked pill and the blackjack card does not. Second, the same day as a calendar, hour by hour from 8am to 2pm, with the flight, the check-in and lunch drawn as filled blocks and the blackjack session as an outlined one. Third, the expenses total, $431.76, broken into Activities, Food and Transit with each purchase listed under its category. Fourth, the new expense form: title, amount and currency, purchase date, a row of category pills with Food selected, who paid, and a choice between splitting evenly and paying for everyone.
Four screens: a day as a list, the same day as a calendar, what the trip cost, and adding an expense to it. These are from a test trip. The real one has other people's names and money in it. Full size

The real reason

The trip was the excuse. What I actually wanted was to find out what it is like to work with AI as an engineer rather than read another thread about it.

I have spent twenty years writing specifications for engineers and reviewing what came back. I had never been on the other side of that, and I did not want to learn it from a book. So I gave myself a project with a deadline I could not move and a user group that would tell me, loudly and at dinner, when something did not work.

The first rule was that the app could not know about Greece

No euro sign anywhere. No Athens. No Greek copy, outside data clearly labeled as sample data.

That sounds like a strange thing to care about for an app whose only job was one trip. It was the most useful decision I made. An app built for one trip hides that trip's assumptions in a hundred places nobody notices: a currency symbol typed into a component, a date that means "day three" instead of a real day in a real place, a clock that quietly uses whatever the phone thinks the time is.

Writing the rule first forced each of those into the open where I had to decide it properly. Money is stored as whole cents with its currency next to it. Times are stored in one timezone and shown in the trip's.

Whether that rule was worth it gets settled by the next trip rather than by me, and the next trip is already in there collecting ideas.

I started where I actually know what I am doing

I designed it first. Components in Figma, both themes, then screens.

Two structural things came out of that and I am pleased with both. There is one page chrome component with a slot in the middle, so expenses, itinerary, balances and chat are the same frame with different contents rather than four screens that resemble each other today and will not in six months. And one card with a slot, so a card holding a date, a card holding two people and a card holding a running balance are one thing with three fills.

I did not plan either of them. I built six screens by hand first, noticed I had assembled the same header and tab bar six times, and went back. Which is the correct order and also not an order anyone puts in a process diagram.

The Figma component board, laid out as a grid of parts rather than screens. Itinerary cards with and without a Booked pill, a trip card with a photograph, the five-tab bar, text inputs, dropdowns, checkboxes, radio buttons, pill groups, a donut chart, a date field, buttons in default, send and delete variants, a comment composer, chat bubbles, an empty state reading no settlements recorded yet, the person row repeated in its selected and unselected states, and the calendar blocks at every duration including the double-booked pair drawn side by side.
The component board. Cards, pills, inputs, the person row, the empty state, and the chrome that wraps every screen. Full size

One set of components, two themes

One library, two themes. One card, one pill, one button, with tokens carrying two values for each. Switching theme changes what the tokens resolve to and nothing else.

The same four screens in both themes, light across the top row and dark across the bottom: the day as a list, the day as a calendar, an item opened to its details, and the balances screen. Every screen is the same layout and the same components in both rows. Only the values behind them change, so the cream page and dark text of the light row become near-black and off-white in the dark row while the blue Booked pills and the orange action button keep their hue.
The same four screens in both themes: the day as a list, the day as a calendar, one item open, and the balances. Full size

Claude takes you extremely literally

This is the part I came for, and it is funnier than I expected.

A human engineer fills in gaps. They guess what you meant, ask when it is genuinely unclear, and notice on their own that the new screen does not match the last one. Twenty years of design systems had quietly been running on all three of those and I had never once had to notice it.

An agent does not do any of that. It reads what is written, does that exactly, and where nothing is written it invents something perfectly reasonable and ships it at two in the morning. Every convention I had been carrying around in my head became a written rule or it did not exist.

Two examples, both mine, both entirely my fault.

The screens with no way out. I wrote that tab screens do not need a back button, because tabs are how you get around. True, when the tabs are the top level of the app. Not true here, because you pick a trip first and the tabs live inside it. I had written a rule that produced four screens a person could reach and not leave. The rule now carries the distinction and the reason it exists.

The switch that turned green. I had one rule above all the others: orange is the only accent in this app. Then a settings toggle shipped green, because the platform's switch paints its own green when it is on and ignores the color you hand it. My rule was fine. Reality was not consulted. It ships through a small wrapper now that forces the orange, and the rule says use the wrapper, not the switch.

Neither of those is visible in a screenshot. Both took an afternoon.

Then we actually went

Athens, Milos, Paros, Santorini, in under two weeks. Four places, boats between them, and a tour guide waiting somewhere in each one.

The itinerary got opened every day, and mostly for one reason: to see what was already booked. That turned out to be the most load-bearing thing in the whole app, and it is a small blue pill. Booked means be there at nine. Not booked means this is an idea, and we can look at the weather and the state of everyone's feet and decide in the morning. Almost everything good about using it came from being able to tell those two apart at a glance.

Looking a day or two ahead is what kept us where we needed to be, and it is also what let us cancel things in time.

Both views earned their place, which I had not been sure about. The calendar answers one question, which is how packed is tomorrow. The list answers a different one, which is what is all of this. I had assumed one of them would win and the other would sit there. Neither did.

The calendar is built out of one block with a variant per duration, from thirty minutes up to two hours, plus empty slots and a double-booked state for when two things genuinely overlap. Drawing the overlap as a real variant rather than letting two blocks collide is the sort of decision that costs an hour and saves the day you have a boat and a dinner booked at the same time.

The expenses tab is the part I would not have predicted. Two families do not split every bill. They take turns. You get this dinner, we got the taxi, we paid for the hotel in Paros so you get the next few meals. It works fine right up until somebody has to remember all of it.

So the app kept score and nobody had to. By the last day we were close enough to even that squaring up took about a minute.

The balances screen at the end of the test trip. Suggested settlements reads Everyone's settled up with a party emoji. Below it both people, Pat Mullin and a test account called Apple Reviewer, are marked settled up. Spend by category totals $431.76 as a donut: Food $158.76, Activities $250.00, Transit $23.00. At the bottom, settlement history records one payment, Apple Reviewer paid Pat Mullin $215.88, made through Venmo.
The balances screen on the last day. The two hundred dollar gap in the figure above is gone, and the payment that closed it is sitting in the settlement history underneath. Full size

And the map is where it fell down. Brad, the other dad, went back to the hotel for his sunglasses. The rest of us carried on to meet the guide at the Parthenon. He then had to find the rest of us in the middle of Athens, and the app was no help at all, because I had built a map that shows where things are and not one that shows where anyone is.

That is the feature for next time, and I would not have known to want it from a whiteboard.

The chat tab of the test trip, in the dark theme. Short messages alternate between a stand-in account called jane-doe on the left and Pat on the right: thank you, picked up, hands up, in the air, yes, a message giving a meeting point at the end of a gate, and a note about the food. Each carries a sender and a timestamp, and Pat's own messages carry a delete control. A message field and the five-tab bar sit at the bottom.
The chat tab, which is where the map's job ended up. The names and the details in it are stand-ins. Full size

The part I did not design for

The trip is over and the trip is still there.

We go back into it. Not to plan anything, just to look: what we did on the Tuesday, what that restaurant in Milos was called, how much the boat actually cost. It turned into a record of the trip without anyone deciding it should be one.

It is also the starting point for the next one, and I have already handed it to somebody else who is going to Greece, as a set of ideas rather than a set of instructions.

I built a planning tool. What we got was a scrapbook that happens to know the schedule.

It is not in the App Store yet

The trip was the beta test, and it was a better one than I would have designed. Eight users, ten days, four locations, patchy signal, and not one person in the group being polite about it when something did not work.

There is a short list of finishing touches left. Then it goes up.

What I got out of it

I can specify better now, and not in a vague way. Several things I have asked engineering teams for over the years turned out to be more expensive than I had been assuming, and a few turned out to be trivial, and I had the ratio backwards on both.

I also learned that a lot of what I thought were standards were preferences I had been enforcing by being in the room. Anything I could not write down precisely enough for someone to follow without me was not a rule, it was a habit. Slightly uncomfortable to find out. Genuinely useful.

And I have an app. Eight people used it in another country, on purpose, instead of the group chat, and it is the reason we know what the boat cost.