← All work

My Training Program Lived in a Note. So I Built the App It Needed.

My phone's Notes app couldn't handle progressive overload, and the workout apps I tried couldn't run the program I'd written. So I designed, built and shipped Plate, an app that runs my own program and tells me exactly what to lift next.

Role
Solo designer and developer
Built with
TypeScript, React, Tailwind CSS
Hosted on
Cloudflare Pages, as an installable app (PWA)
Live at plateapp.pages.dev ↗

In a browser it shows install steps. Add it to your home screen to use it.

In one line

I turned the training program in my Notes app into a product I designed, built and shipped myself.

Before · my note
After · Plate
Plate's Back Squat card: 4 sets, 8 reps, 225 lb, with reps and weight shown against the previous session and a Done with this exercise button

The note says what to do. Plate also shows what I did last time, sets today's target, and raises it on its own as I progress. Screen shown with sample data.

75
exercise entries moved from the note into Plate unchanged
3 days
from first commit to release 1.5.1, across 7 versioned releases
18
design docs recording what I chose and rejected
$0
hosting cost, on Cloudflare Pages
Read the full story ↓
01
The note
A good program, written in an app that couldn't run it.

Notes could record a workout, but it couldn't help me progress

I wrote my own Push/Pull/Legs program and tracked it in my phone's Notes app. The note held the plan well. It couldn't tell me what to lift next.

Notes can't do progression

Every set meant scrolling back for last session's numbers, then working out whether to add reps or weight.

Notes don't know what's next

I tracked which day, block and repeat I was on by hand.

Other apps didn't fit

The trackers I tried pushed their own plans or used calendar weeks, so they couldn't run my program or handle a missed day.

Before: a five-week program in three notes

The note was a good plan: a five-week cycle of three blocks, each with Push, Pull and Legs days, 75 exercise entries in total.

Hypertrophy block in the Notes app
Weeks 1–2 · HypertrophyReal screenshot from my phone
Heavy Strength block in the Notes app
Weeks 3–4 · Heavy StrengthReal screenshot from my phone
Deload block in the Notes app
Week 5 · DeloadReal screenshot from my phone
WeeksBlockGoalIntensityExercises per day
1–2HypertrophyBuild muscle with joint-friendly volumeIsolations close to failure; compounds 1–2 reps left8–9
3–4Heavy StrengthMechanical tension and strength1–2 reps in reserve; never to failure8–9
5DeloadFatigue reduction and joint recovery3–4 reps in reserve; about 60–70% of weeks 3–4 load7–9

The note held the plan, not the numbers

It ends with "Beat your previous numbers," but nowhere in it records what those numbers were. Every rep range, like 4×10–12, implies a rule (work up to 12, then add weight) that I had to apply in my head.

02
The app
The same program, with the thinking done for me.

Plate opens on today's session and raises the target on its own

Plate turns my written program into editable routines and does the thinking for me. It opens on today's session, shows the target for every exercise, and raises the target automatically.

Workout tab showing today's Legs session
TodayOpens on today's session
Back Squat with previous and target reps and weight
In the gymPrevious vs target, every exercise
Home with weekly goal ring and activity grid
ConsistencyWeekly goal and activity grid
History of finished workouts
HistoryEvery finished workout, saved

Screens shown with sample data.

Four progression modes

Each exercise picks one. Strength adds weight every session. Hypertrophy climbs reps. Hybrid climbs reps, then adds weight and resets. Deload just logs.

Real gym increments

Barbells step 5 lb, cable stacks 10 lb, and any exercise can override its step.

Sessions, not dates

A missed day just delays the next session; nothing resets.

From note to app: every line of the note became a feature

Nothing in the program had to change to fit the app. Each kind of line in the note maps to one thing in Plate.

In my note
In Plate
"Weeks 1–2 · Hypertrophy Block"
→
A Routine named Hypertrophy, set to repeat twice
"PUSH — Hypertrophy"
→
A Day inside that routine
"Incline Dumbbell Press — 4×10–12"
→
An Exercise: 4 sets, 10–12 reps, Dumbbell equipment
"(pec deck if free)", "slow eccentric"
→
The exercise's Notes field
"Goal" and "Intensity" lines
→
The routine's Notes field
"After week 5, return to Week 1"
→
Routines run in order and repeat; a Cycle counter tracks each lap
"Beat your previous numbers"
→
Previous vs target shown on every exercise; the target rises on its own
Deload at lighter load
→
A deload progression mode, so light weeks don't push targets up

Export and import: how my program reaches friends and family

Plate has no accounts and no server. Everything lives on the phone, so sharing needed its own path. Export saves everything to one dated file. Import loads that file on another phone. That's how I share my program with friends and family: they install Plate, import my file, and start on the same program I run.

Screens captured from Plate 1.5.1 with no data loaded.

What the file holds

Routines, days and exercises, workout history, logged sets, each exercise's progress, the current place in the program, and the kg/lb setting.

Import replaces, it doesn't merge

Every routine, day and set links to the others by ID. Keeping the file's IDs intact keeps those links intact, which only works on an empty device, so Import clears first and writes everything in one transaction. A failure can't leave half-old, half-new data.

A gap I fixed while building it

The first version of Export left out program position and the unit setting. A restore would have brought back every workout but reset the program to Week 1. Both are in the file now.

The cost

It's one full backup, not a program-only share. A file I send carries my history and progress along with the routines, and importing it replaces whatever the other phone had.

03
The design
Built for the minute between sets, tested at the gym.

Every screen answers "what now?" for someone holding a phone between sets

Install Plate to continue screen with numbered steps to add it to the home screen
Install firstA browser tab gets install steps, not the app
My Routine sheet sliding up over the workout, listing Push, Pull and Legs days
Editing as a detourThe routine slides up over the workout
Push day editor listing the note's exercises with sets, rep ranges, equipment and notes like 30 to 35 degrees
The note, as a daySame exercises, notes kept on each one
Exercise editor with Hybrid, Strength, Hypertrophy and Deload modes, sets, rep range, weight step, and Cancel and Done buttons
Cancel and DoneFour progression modes; nothing saves until Done

Real screens from Plate 1.5.1, loaded with a sample of my own program.

  1. Answer "what now?" first

    Workout opens on today's session with one clear button, like "Start Legs."

  2. Glanceable between sets

    Dark screens, one lime accent, large numbers and big touch targets.

  3. Tested at the gym on my own phone

    Keeping what worked and reverting what didn't.

  4. Editing as a detour

    Routine editing slides up as a sheet over the current page, so changing the program never feels like leaving the workout.

  5. Cancel and Done for edits

    Changes to a routine stay a draft until confirmed, so the program can't be broken by a stray tap.

  6. Install first

    In a browser, Plate shows step-by-step install instructions for iPhone or Android instead of the app, because it's meant to live on the home screen.

How I worked: a real product process, run by one person

Designed on the real device

A dev server on my home network put every change on my iPhone instantly, and I judged it there, not on a laptop.

Kept a decision record

18 design docs, one per screen, component or pattern, capture what I chose, what I rejected and why.

Ran a real backlog

Bugs, gaps and polish items went onto a P0–P3 kanban board instead of getting lost.

Verified before shipping

Type checks on every change, and scripted browser tests for risky flows, run against a separate test copy so my real training data was never touched.

04
Shipped
From my Mac to my home screen in one command.

One command builds Plate and ships it; GitHub holds the source

Plate is a TypeScript and React app with no server: data stays on the phone and it works offline. One command builds it and ships it to Cloudflare Pages, and installed copies update themselves.

Stack

TypeScript, React 19, Vite, Tailwind CSS v4, Dexie (IndexedDB), vite-plugin-pwa.

Built with Claude Code as an AI pair

I made the product and design calls; the AI wrote and tested code to my direction.

Versioned releases

Seven releases, 1.0.0 to 1.5.1, each with a changelog entry.

Result

Plate replaced my Notes workflow. At the gym it tells me what to lift and how heavy, and it raises my targets as I get stronger. Friends and family run the same program by importing my file, and it all costs $0 to host.

3 daysfirst commit to release 1.5.1
7 releaseseach with a changelog entry
4 modesof progression, picked per exercise
0 serversdata stays on the phone, works offline

What's next

Sharing works, but it's a full backup. A program-only export would let me send my routines without my workout history, and let a friend add my program instead of replacing everything on their phone. That's the next build.

Plate, a workout tracker built as an installable web app. Designed, built and shipped solo, with Claude Code as an AI pair for the code.

Ready to Start Your Project?

Let's bring your design vision to life.

Schedule a Call