Skip to content
Jonny Campbell
All notes

Build notes/AI & side projects

Spotter, a gym tracker for two.

My friend and I wanted a better way to track our lifts and runs. I talked to my computer instead of shopping for an app, and 35 minutes later we had one. What Spotter does, how it plans each session, and what it took.

Spotter’s next-workout card on a dark background: Next up, week 3, Build, Workout A. Back Squat 62.5 kg and Bench Press 55 kg are each up 2.5 kg, and Barbell Row is the same at 52.5 kg. A New record badge sits on its corner, and a smaller card in front shows the squat’s three sets of 5, all logged.
The next workout, already worked out. A screenshot of Spotter’s landing page, with made-up numbers.Spotter · spotterlifts.app
The app

Spotter The gym tracker for two. Invite only.

Visit Spotter

It's still hard to get my head around it: building an app can now be cheaper and easier than finding one.

My friend and I wanted a better way to track our lifts and runs. One of us is on an iPhone, the other's on Android. Normally that means comparing apps, reading reviews, downloading a couple and settling for one that's close enough on both. I've done this before and I gave up. This time I talked to my computer instead, and we ended up with Spotter, built around exactly how we train.

This is what it does, how it plans each session, and what it took.

What we wanted

We go to the gym twice a week, on whatever days suit. We alternate between two sessions, each a couple of big compound lifts followed by a few smaller exercises. The main lifts are three sets of five, and when we hit every rep, the weight goes up by about 5%.

Most gym apps want you to set all of that up yourself, then type in every set. I wanted the opposite. Here's some of my first message, which I dictated:

…

It should be super simple. The goal is an app we barely use: at the gym, we check what's next, confirm you did it, and the next session's worked out automatically.

This is a completely independent app, it doesn't have to make money. It's just for me and my friend, so you can skip the nonsense that comes with commercial apps and prioritise the user experience. It only has to be the best app for the job.

…

The first evening

I sent that at 21:25 on Tuesday 27 October, with the plan we'd been following attached. Then I read out what we'd lifted that night. All of it was in conversation with Claude Opus 5.5, in T3 Code.

  • 22:00: Spotter was live on a Vercel address, with that night's session logged and the next ones planned.
  • 22:14: it had a login: a crew code the two of us share. Its first bug was fixed too. Progress and Plan had opened to a black screen in Chrome, which testing in Safari had missed.
  • 22:37: the code went into a private GitHub repo, so every change after that went live by itself. Until then, the only copy was on my laptop.
  • 22:40: spotterlifts.app was bought and connected, from the chat. It was $9.99 for the first year. It's the first time I've bought anything from a chat.
  • By 23:32: it also had optional warm-ups, notes, a home-screen icon, a landing page, a full-screen countdown for planks, a rest timer that's off unless you want it, a separate weight jump for each lift, and a picture for when the link's shared.

From the first message to a repo, a live app and a domain, I never left T3 Code.

How it plans a session

Each set is one tap. Finish a set, tap it. If you came up short, tap again to take a rep off. After the last set, say how many reps you had left in the tank: 0–1, 2–3, or 4 or more. That's all Spotter asks.

Logging a squat, then coming up a rep short. A screen recording of the demo on Spotter's landing page, 7 seconds, silent.

From that, it works out next time's weight for each main lift:

  • Every rep: up one jump. By default that's 5%, rounded to plates you can actually load.
  • Every rep, with 4 or more left: up two jumps.
  • Every rep, but a grind: the same weight, until it moves well.
  • Reps missed: the same weight again, to finish the job. Stuck twice at the same weight, it drops 10% and builds back past it.
  • More than three weeks off: it eases you back in at 90%.

Each lift can have its own jump, because 5% on a bench press isn't the same as 5% on a squat. When one jump would be more than 10% of the weight, as it often is with dumbbells, it adds reps first and the weight after.

The weeks follow an eight-week block. There are four weeks of 3×5 to build, two of 4×4 for strength, one of heavy triples to peak, and a deload week of two sets about 15% lighter. Then the next block starts from wherever you got to.

Spotter works the plan out afresh from what's been logged, so if you fix a mistake in your history, the plan fixes itself.

A chart card for Back Squat, week 6 of 8. A green Ahead badge reads 62.5 → 75 kg by week 5, and below it: The plan expected 67.5–72.5 kg by now. A grey band rises gently from 62.5 kg at week 1 to a peak at week 7, then drops for week 8. An orange line for Alex climbs above the band through week 5. Under the chart, eight bars mark the phases: Build, Strength (lit, for week 6), Peak and Deload.
The plan against what was lifted. A screenshot of the landing page; Alex and the numbers are made up.

One app, two phones

Spotter is a web app you add to your home screen. It opens full screen, it has its own icon, and it keeps working without signal. That's how it covers an iPhone and an Android phone, with no app store in between.

It's just for the two of us. There's no sign-up, only a crew code: one of us sends the other a link, or just tells them the code. We can log a session for both of us in one go, follow each other's weeks, and fist-bump the good ones. There are no followers, no strangers and no leaderboard.

Two cards. Consistency, over 12 weeks: a row of orange dots for Alex and blue dots for Sam, one per week from 10 August to this week. Alex has one dimmer week, and Sam has one empty. Below it, a feed: Sam, Workout B, today, Romanian Deadlift 70 kg, with a trophy and a fist-bump button. You, Easy run, yesterday, 32 minutes, 5.4 km, from Strava, with one fist bump. You, Workout A, Monday, Back Squat 75 kg, with a trophy and one fist bump.
Twelve weeks of turning up, and the feed. A screenshot of the landing page, with made-up people.

The next day

That first night, I sent it to my friend. He isn't technical, and by Wednesday afternoon he'd come back with notes and a new programme. The big lifts stayed on their own, the smaller exercises went into supersets, and each part had its own rest time. I passed it all on, and asked for it to be handled the way a head of product would: keep the bar where it was, or raise it.

By that evening, Spotter had:

  • his programme, with supersets, and reps in the tank after each lift;
  • a colour for each kind of exercise: main lifts, accessories and core;
  • a chart of what the plan expected against what we actually lifted;
  • a body map of the muscles each session trained, and how much over the week;
  • a weekly schedule of lifting, running and rest days, with easy Zone 2 runs that go by the talk test: if you can't chat, slow down;
  • runs that log themselves from Strava;
  • a weekly weigh-in that only you can see, with how much protein to aim for at your weight;
  • and a tidy-up, so everything added that day had an obvious place.

The body map was the one I pushed hardest on. Brighter means more sets, up to about ten a week, which is roughly where muscles grow most. Tap a muscle and it shows which lifts hit it.

A body map card with tabs for Alex's week and Sam's week, Alex's selected. Two dark anatomical figures, front and back, glow orange where they've been trained: chest, shoulders, abs, upper back and the whole of the thighs and glutes, with the calves dimmer and the forearms and shins dark. Below, Sets this week, on a scale from 0 to 10+.
A week on the body map. A screenshot of the landing page, with a made-up week. Anatomy art by Ryan Graves, CC BY 4.0.

The landing page

On Thursday morning I asked for a new landing page. I didn't want screenshots of the app. I wanted its most interesting parts, picked out. Thirty-seven minutes later it was live. Every section is a working piece of the app, built from its real parts and following its real rules, played by two made-up people, Alex and Sam. Log a squat and it tells you next time's weight. Tap a week on the chart for its numbers. Give Sam a fist bump.

That's where every picture in this note comes from.

The numbers

  • 35 minutes from my first message to a live app, with that night's session in it.
  • 75 minutes to its own domain.
  • 30 messages from me over three days.
  • 15 commits and about 14,000 lines of code.
  • 100 tests on the parts that do the thinking: the plan, the warm-ups, the body map, the week and the Strava sync.
  • $9.99 for the domain's first year, then $15 a year.

What I learned

Software doesn't need a market any more. Software has been built for markets because building it was expensive: it only made sense if thousands of people wanted the same thing. Spotter has two users, and that's fine. When building costs an evening, software can be made for a household, a team or two friends, and fit them exactly instead of roughly.

What's left to pay for is what can't be built in an evening. A lot of apps are a set of features wrapped in a business: sign-ups, subscriptions, upsells, ads. The features are getting cheap to make. What still holds its value is what's hard to copy: the network, the data, the trust. Spotter leans on one of those itself: its runs come from Strava.

The scarce part is knowing what good looks like. The code was the quick part. The time went on deciding what it should do, what to leave out, and noticing what felt wrong at the gym. That's product judgement, and it matters more now, not less.

What's real and what isn't

Every picture here is a screenshot or a screen recording of Spotter's public landing page, spotterlifts.app. The demos on it are built from the app's own parts and follow its rules, but the two people, Alex and Sam, and all their numbers, are made up. None of our real training is in this note.

Spotter is invite only, so you can't sign up. It's for the two of us.

My first message was dictated, and the quote from it is edited and shortened. The times come from the chat and the commit history.

Credits

The anatomy art is by Ryan Graves, under CC BY 4.0. Runs come from Strava. Built in conversation with Claude Opus 5.5 in T3 Code, on React, Vite, Convex and Vercel.

Thanks for reading.

Back to all notes
AI Assisted

I led the work, and AI helped along the way. Badge by AI Honesty Badge.