Inspiration

I hate the gym. I am never motivated to go.

What does motivate me is a challenge, especially one from someone I know. Tell me to beat a number and suddenly I care.

And because I never liked training, I never learned it. I did not know which exercises were good for me, or how to actually do them. My boyfriend wrote me a list, and then had to babysit me through every single session. What is next. How does this machine work. Am I doing this right. I spent more time standing around with my phone looking things up than lifting anything.

Every app I tried was built for people who already know what they are doing. I wanted the opposite.

So I built the app I needed. One where he could be my coach: build my workouts, see how I am progressing, and challenge me to beat my last week. The exercise animations exist because I was the person who did not know how to do them. The coach feature exists because I needed one. The challenges exist because they are the only thing that gets me through the door.

Publishing it was never the plan. Then we started noticing other people at the gym stuck exactly where I had been, wandering between machines, phone in hand. We showed a few of them what we had been using. They were impressed, and they asked how to download it.

That is when it stopped being a private thing.

What it does

Progressive Overload is a gym tracker built around a single number going up.

  • Log a set in seconds. Reps and weight, or held duration for planks and cardio. The app remembers, so next week you know exactly what to beat.
  • 193 exercises. Over 100 illustrated by hand, 73 with a looping animation showing the movement. No stock photos, no embedded videos from strangers. They are ours, and the ones still being drawn say so rather than showing you somebody else's video.
  • Filter by the equipment you actually have, down to nothing but bodyweight.
  • A body map to find exercises by the muscle you want to train, and a recovery map showing what is fresh and what you have been quietly avoiding.
  • Build your week into training days, reorder them by dragging, and the home screen floats the day you are due for to the top.
  • Add a coach. A friend you promote can build your program and log sets on your behalf. Remove them and their access ends that second.
  • Challenges between friends, with rewards you write yourselves.

It works offline, because gyms have concrete walls and no signal.

How I built it

React Native + Expo 56, TypeScript throughout, Expo Router for navigation. Supabase for Postgres, auth and storage, with row-level security doing the real access control. Every table, enforced at the database, so the app being compromised still would not expose another athlete's data. Coaching, challenge transitions and progress queries all run through SECURITY DEFINER functions rather than direct writes.

RevenueCat powers the subscription. Free stays a genuinely usable logger: unlimited sets, the full illustrated library, the body map, the recovery map, and 30 days of history. Pro buys depth: your whole history, personal records and estimated 1RM, coaching, friends, challenges, export.

The monetization idea I am most pleased with is the referral month. Every account has a share code. When someone subscribes using yours, you get a free month, once per account, ever, not once per referral. It is deliberately not a pyramid. It pays for the one introduction that actually matters and then stops. A Supabase Edge Function listens for RevenueCat's purchase webhook and grants the referrer a promotional entitlement, claimed with a conditional update so two purchases landing at once cannot both win.

The artwork is the other half of the work. Every illustration and animation is generated in-house from a consistent house style and reviewed one at a time. I rejected a lot of them. The ones that survive read clearly at a glance, which is the only thing that matters when you are between sets.

Challenges I ran into

A referral system that silently did nothing. The RPC recording who referred whom returned the referrer's name and persisted absolutely nothing. A SECURITY DEFINER function does not bypass triggers, and auth.uid() still resolves to the calling user inside one. So my own guard against clients writing that column was quietly reverting every legitimate write. It only surfaced because I tested the column instead of the return value.

"This exercise no longer exists." Opening any exercise without signal claimed it had been deleted. The whole catalogue was cached the entire time; the detail screen just fetched under its own key, which held nothing. It was even loading the cached list on the same screen for its "similar exercises" row. The fix was to read what was already there.

Buttons that appeared dead. React Hook Form declines to submit when validation fails, silently. The error was rendering correctly, but under the keyboard, on a field the user could not see. Every form now says why it will not submit.

Getting onto Google Play at all. A new personal developer account cannot reach production until 12 testers have been opted in for 14 consecutive days. No amount of code makes that faster. It reframed the whole schedule: the engineering was never the critical path, recruiting twelve humans was.

What I learned

Verify the thing itself, not the thing that reports on it. Three of the four bugs above returned success while doing nothing at all.

And that shipping is mostly not code. Account deletion, a privacy policy that matches your data-safety form, Québec's Law 25 setting its consent threshold at 14 rather than 13, a domain, a support address that actually receives mail. None of it is glamorous, and all of it is the difference between an app and a released app.

What's next

Continue expanding the animation library until every exercise has motion guidance. Now that Android is live, I plan to use focused Google App campaigns to improve its Play Store visibility, learn which messages bring in the right users, and measure whether installs turn into consistent workouts and Pro subscriptions.

Apple next. Then the thing people keep asking for: automatic progression suggestions. The app already knows what you lifted and how you have been trending, so it should be able to tell you what to put on the bar.

Share this project:

Updates

Submission history