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.
In a browser it shows install steps. Add it to your home screen to use it.
I turned the training program in my Notes app into a product I designed, built and shipped myself.
- Barbell Back Squat — 4×6–8
- Romanian Deadlift — 4×6–8
- Leg Press — 4×8
- Reverse Dumbbell Lunges — 3×8–10 per leg
- Seated Leg Curl — 4×10
- Standing Calf Raise — 4×10–12
- Seated Calf Raise — 3×12–15
- Hanging Leg Raises or Weighted Plank — 3 sets
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.
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.
| Weeks | Block | Goal | Intensity | Exercises per day |
|---|---|---|---|---|
| 1–2 | Hypertrophy | Build muscle with joint-friendly volume | Isolations close to failure; compounds 1–2 reps left | 8–9 |
| 3–4 | Heavy Strength | Mechanical tension and strength | 1–2 reps in reserve; never to failure | 8–9 |
| 5 | Deload | Fatigue reduction and joint recovery | 3–4 reps in reserve; about 60–70% of weeks 3–4 load | 7–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.
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.
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.
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.
- ExportOne tap saves a file named like plate-export-2026-10-23.json.
- Send the fileIt's a normal file, so it goes anywhere a file can.
- ImportOn the other phone, Import opens the file picker.
- ConfirmPlate says what will be replaced before it touches anything.
- TrainSame routines, same program position, ready on the Workout tab.
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.
Every screen answers "what now?" for someone holding a phone between sets
Real screens from Plate 1.5.1, loaded with a sample of my own program.
Answer "what now?" first
Workout opens on today's session with one clear button, like "Start Legs."
Glanceable between sets
Dark screens, one lime accent, large numbers and big touch targets.
Tested at the gym on my own phone
Keeping what worked and reverting what didn't.
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.
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.
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.
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.
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.
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.