Back to selected work

Stayed

My own product · iPhone app and website

I built Stayed on my own, from first idea to the App Store and on to version 1.16. It reads hotel booking emails and keeps one clear record of every stay, your loyalty status and your points.

from first commit to the App Store
Six weeks
shipped by October 2026
Version 1.16
product, design, code and release
One person
Stayed: today’s checkout and the next check-in, in one viewStayed: today’s checkout and the next check-in, in one viewStayed loyalty wallet: programme cards and progress towards hotel statusStayed loyalty wallet: programme cards and progress towards hotel statusStayed Passport: a globe of past stays with total nights, stays and countriesStayed Passport: a globe of past stays with total nights, stays and countries
Real screens from the app. The travel records are examples.

The problem

Hotel bookings are scattered. The details sit in confirmation emails, loyalty status sits in a different app for every hotel group, and nobody tells you when points are about to expire.

I wanted one place that answers simple questions. Where am I staying next? How close am I to the next status? When do my points run out?

How a booking becomes a record

Reading booking emails is the heart of the product, so it had to be right. Stayed tries the simplest and most private method first, and only uses AI when it has to.

  1. Read the booking’s own data

    Many confirmation emails carry hidden structured data. If it is there, Stayed uses it. No AI needed.

  2. Read calendar files and PDFs

    Attachments often hold the hotel and dates in a clear format.

  3. Ask the AI on the phone

    Apple’s on-device model reads what is left. Nothing leaves the phone.

  4. Ask Claude, only if needed

    As a last resort, the text goes to Claude through my own server, and only after the person agrees.

  5. The person confirms

    Nothing is saved until someone checks it. If Stayed cannot read an email, it says so and offers to add the stay by hand.

Stayed: bookings found in email wait for review, and one it could not read offers to be added by handStayed: bookings found in email wait for review, and one it could not read offers to be added by hand

Decisions that shaped it

Stayed points estimate listing room total, exchange rate, earn rate and status bonusStayed points estimate listing room total, exchange rate, earn rate and status bonusStayed stay details flagging that cancellation terms are not set yetStayed stay details flagging that cancellation terms are not set yet
Left: an estimate that shows its workings. Right: missing cancellation terms are flagged, not invented.

Set the quality bar before the screens

Before designing anything, I set a target: most booking emails should read correctly with at most one detail to fix. I built a test tool for that first, because a good-looking app that reads bookings wrong is useless.

Show the maths

A points estimate shows every step: room price, exchange rate, earn rate and status bonus. People can check the number instead of having to trust it.

Never present a guess as a fact

Every hotel group has its own loyalty rules. Stayed only shows a deadline when it matches the programme’s official rules, and I checked the whole catalogue against official sources in October. When the app does not know something, it says so.

Private by default

No account and no login. The AI key stays on my server, not inside the app, and Stayed asks before any booking text goes to the cloud.

What I cut and what went wrong

Knowing what not to ship mattered as much as what I built.

An AI chat assistant
I built Stacy, a chat assistant for your stays. In live testing it was not reliable enough, so I took it out of the release instead of shipping something people could not trust.
A social layer
I planned and costed a way to share stays with friends, then parked it. A social feature needs a crowd, and Stayed does not have one yet.
My first design
The first visual direction lasted three days. It did not feel right, and changing early was cheap.
Promises the app could not keep
When the website described more than the app could do, I closed the gap: either the site changed or the app caught up.
A rejected first release
Apple rejected version 1.0 because my notes for the reviewer had ended up in the public description. I fixed it and was live within a week.

How it shipped

  1. July 2026

    First commit. The booking reader and its test tool came before any screens.

  2. August 2026v1.0

    Version 1.0 is rejected once, then goes live. Version 1.2 makes the free plan more generous after feedback from a Reddit user.

  3. September 2026v1.6

    Version 1.6 stops stay dates from shifting when you fly across time zones.

  4. October 2026v1.16

    Layouts for the foldable iPhone. The AI assistant is held back. Version 1.16 puts your hotel brands on the Passport globe.

How I build with AI

Claude wrote much of the code. My job was to decide what to build, write clear briefs, set the tests and review what came back. Across more than 1,000 commits that split held: the AI made me fast, and the checks kept the work honest.

  • Every release has to pass the full test suite, including tests that tap through the app like a person would.
  • A second AI reviews big changes as a critic. I treat its notes as suggestions, because it is sometimes confidently wrong.
  • The hard rules live in the project’s written instructions, so quality does not depend on my memory.

What I learned

Building is now the fast part. One person with AI can ship a polished app in a few months. The hard part is everything around it: deciding what deserves to exist, holding a quality bar, and getting it in front of people.

Stayed has a small group of users today. The lesson I am taking forward is that reach deserves as much care as the build.

Back to selected work

Let’s talk product.

Product, building with AI, or turning an idea into something people use.