Live in production
Personal tool
PWA
Project showcase

Home Workout

A daily 20-minute program with reminders, built to replace the two fitness apps I was paying for.

Next.js MongoDB Auth.js Web Push PWA
Scroll to explore
The problem

Two apps, neither built
for my routine.

I was paying for two subscriptions, and neither matched the fixed dumbbell routine I already followed. Both nagged me with content I didn't want, and neither reminded me at the right time of day.

I was using about 10% of each app. What I actually wanted was one place with my program, a calendar, a timer, and a reminder in the evening if I hadn't trained yet.

What I considered
01
Keep paying and ignore the noise
Two subscriptions for a routine neither app was built around.
02
A spreadsheet plus phone alarms
Tracking in one place, reminders in another, no timer at all.
03
A native iOS app
A full rebuild and an app store step for every update.

Rejected because none gave me a calendar, a timer, and a reminder in one place without a rebuild.

Scope

What I cut.

Cut
Social features
Cut
Exercise library beyond my routine
Cut
Apple Health sync and Android push
PWA web push covers iPhone, which is what I use.
What I built

Three screens I open every day.

In the order a user sees them: check the calendar, run the workout, watch the numbers move.

Calendar screen for September 2026 with completed workout days filled in orange, rest days marked with a dot, and a Mark done button for today
CalendarEvery day is a workout or a rest day. Filled means done.
Workout timer screen showing total time, round 1 of 3 of the circuit, and rep and weight steppers per exercise with the last session's numbers as a hint
Workout timerLog reps and weight per set, with last session shown as a hint.
Progress screen listing each exercise with its best set, session count, and a small trend line
ProgressBest set per exercise with a trend line, so I know when to move up.
Demo data: screenshots use demo history seeded on staging.
Key decisions

Three tradeoffs that shaped it.

01
PWA instead of native
So it installs from a link and updates without an app store.
02
MongoDB Atlas free tier
Because the other free databases were already in use by other projects.
03
Staging and production split
With a phone-tested merge rule after the first bug reached my own device.
Today screen with a Ready to move up card suggesting a heavier dumbbell weight and a longer wall sit, each with an Apply button
Ready to move upWhen you top the range twice, the app suggests the next weight.
Outcome

What changed.

I cancelled both subscriptions and trained daily on the program. [ ] friends now use it on their own accounts, installed from the same link I use.

Next

Replace the demo screenshots with real history once the streak is a few months long.

Available for PM roles

Let's build
something great.

I'm actively looking for PM roles. Whether you're a recruiter, a founder, or just want to connect, I'd love to hear from you.

Send a message →
NR