four things got done: The new look has a rulebook, and new users get a proper welcome. Tap any of these to read the whole thing.
We're rebuilding how the whole app looks and feels. Today the ground rules got written down for real: one signature color (a deep blue called ultramarine) on warm cream paper, bold clean lettering, and animation saved for the big moments so it stays special. Two expert reviewers (one for looks, one for experience) went over the plan and found real problems, the blue text was too hard to read on cream, the app had no plan for brand-new users, and a couple of spots where the app could quietly invent data about you. All of their must-fixes are now baked into the rules.
The biggest piece. A design for the app's first three minutes. A new user answers a handful of quick questions (goal, experience, equipment, schedule, and roughly what they can lift, guessing is fine, skipping is fine), and then watches the app literally draw its starting picture of them. Honest guesses are marked as guesses, and the first workouts firm them up.
What this is and isn't. These are design documents, the rulebook (DESIGN.md) and two specs in docs/design/. No app code changed yet. Building it comes next, screen by screen.
The big picture (in plain words): For a long stretch now, almost all the work has been one big project: making the app truly learn each person instead of starting from scratch every workout. Today that whole chapter is officially finished and closed.
What it means for someone using the app: The app now keeps a living picture of you, how strong you're getting on each lift, how recovered you are, when you've genuinely stalled (versus just an off day), and when you've outgrown your own targets. The coaching is built on that picture instead of re-reading your raw history cold each time, so the advice stops feeling generic.
What's left for later, and none of it is blocking: A handful of small tuning jobs that need real-world data before they're worth doing, one product idea parked on purpose, and a short "revisit next chapter" list. One honest caveat: the newest target screens work and are tested, but nobody has actually watched them run on a phone yet, worth a quick eyeball before showing them off.
Status: Done. The big Phase 2 plan (issue #71) is closed.
When the app told the server "this person has seen their targets screen," the server saved that note under one spelling and the app looked for it under a slightly different one. So after a fresh sync the app couldn't find the note, and could pop up a one-time screen you'd already dismissed. A backup copy kept on the phone hid it most of the time, which is why nobody really noticed, but the server's own memory of it wasn't being read.
Matched the spelling so the app reads the server's note correctly. I also taught it to still understand the old spelling, so anyone who had already dismissed the screen doesn't suddenly get it back, the whole point of this note is that it should stick.
Three small tests: it reads the new spelling, it still reads the old one, and it now writes the new one. The app builds clean and the related tests all pass.
Each lift has two numbers: a floor (the level we keep you at) and a stretch (the next milestone). They're set once, early on, and then the floor was frozen forever. So an athlete who'd been lifting way above their floor for weeks still had a floor describing the weaker version of themselves. The number had quietly become a little bit of a lie.
The day before, I'd asked a sharper question: should changing your goal move these numbers? After a lot of back-and-forth (I had two other helpers stress-test every decision), the honest answer was: no, changing your goal words doesn't make you stronger. What should move the numbers is getting stronger. And we already measure that, using your own lifts, no guessing, no comparing you to other people.
Now, when your typical strength on a lift has climbed clearly past your stretch target (not from one lucky day, it's measured over your last few sessions), the app raises the whole target: the floor steps up to what you're actually lifting, and a new stretch is set above it. Then it tells you, the targets screen pops back up with a "You've leveled up" message and a "Levelled up" badge on the lifts you outgrew, so beating your goal feels like a win, not the app quietly moving the goalposts. Three safety rules: the floor only ever goes up, never down; it never claims more than you've actually lifted; and it can't keep re-firing, once it raises the bar, it waits until you've genuinely grown again.
One nice catch from the stress-testing: one helper worried the targets could get stuck re-raising forever for some athletes. I checked the math myself and proved that can't happen, then wrote a test to lock it in, rather than adding code to guard against a problem that doesn't exist.
Test-first, in three small steps (mechanism → screen → words/badge). 10 + 105 + 7 small tests, the app builds clean, and the database tests passed on the build server. I also found and reported an older unrelated bug (a mismatched data label, #309) but left it alone rather than fix it sideways.