← back to the timeline
Jun 16 2026

three things got done: Rebuilt the Progress tab and made its numbers trustworthy. Tap any of these to read the whole thing.

Rebuilt the Progress tab and made its numbers trustworthy

The Progress screen got a fresh, premium look, but the numbers behind it weren't honest yet.

Shipped
the problem

The Progress screen got a fresh, premium look, but the numbers behind it weren't honest yet. The strength estimate counted every set, warmups, lighter back-off sets, all-out final sets, so it could look like you'd hit a personal record when you really hadn't, and the big number on screen didn't match the one the AI coach uses. The volume section just counted sets without saying whether you were behind on anything, and there was no sign of how confident the app was in a lift.

what I changed
  • Strength number you can trust. It now counts only real "top sets" in a sensible rep range, so fake records disappear, and the headline shows the same smoothed number the coach reasons from (with a small "smoothed" note so it's clear why it can differ a touch from your latest session).
  • Volume vs. target. The volume card now quietly says which muscles are behind their target over your last ~7 sessions, worst first, and stays silent when you're on track (no empty praise).
  • Confidence note. Each key lift can show "still learning this lift" or how many sessions it's based on, and hides itself when there's nothing solid to say.
  • Plateau help. When a movement keeps stalling, it now tells you what to do ("rotate the exercise or rebuild the block") instead of just counting the stalls.
how I tested it

Built by several focused helpers in stages, one for the data, two for the screen, and two independent reviewers whose job was to attack it. The reviewers caught two real problems (a freshly-tracked lift could show "0.0 kg", and the little up/down number didn't line up with the headline); both were fixed and pinned with tests. Everything hides gracefully when there's no data. App builds clean and the 6 new tests pass.

Shipped to main. The look-and-feel landed first (PR 432), then the trustworthy numbers on top (PR 434, which replaced 433 after a stacked-branch hiccup).

Fixed four sign-in / data-saving bugs

A batch of leftover bugs from the sign-in security work could lose or mis-save data right after the app starts, before it has finished quie…

Done
the problem

A batch of leftover bugs from the sign-in security work could lose or mis-save data right after the app starts, before it has finished quietly signing in:

  • "Reset All" wiped saved data but didn't stop a workout that was already running, so that live workout could still try to save under the old identity.
  • If the app couldn't start a workout because sign-in hadn't finished, it just silently re-enabled the Start button and told you nothing.
  • A few save paths (your program, your gym equipment, set-correction notes) grabbed the user identity too early, while it could still be a temporary placeholder, so the save could be rejected by the server's ownership rules.
  • If you set up your program while offline (or sign-in stalled), the program was saved on the phone but never to the server, and nothing ever retried, so later workouts had nothing to attach to and failed.
what I changed
  • Reset All now also clears a running workout (#403).
  • Failing to start a workout now shows "Couldn't start, check your connection and try again" instead of silently doing nothing (#399).
  • The program/gym/notes save paths now wait for the real signed-in identity before saving, and skip the save entirely (rather than save wrong) if it isn't ready yet (#409, done in two parts).
  • The app now quietly backfills a phone-only program to the server the next time it loads with a real identity, and is careful to tell "server has nothing" apart from "couldn't reach the server" so it never double-saves or hides a real program (#425).
how I tested it

Each fix was built test-first (a failing test that proved the bug, then made green), reviewed by a separate independent check, and the full nearby test groups were re-run green before merging. Each one was its own small, single-purpose change on its own branch and pull request.

All merged. PRs 427 (403), 428 (399), 429 + 430 (409), 431 (425), issues 403, 399, 409, 425 all closed.

Made the UI removal official and tidied the task list

Yesterday we decided to throw away the half-built new look and keep the old four-tab app.

Done
the problem

Yesterday we decided to throw away the half-built new look and keep the old four-tab app. Today that change actually went live on the main copy of the code, and I cleaned up all the leftover paperwork that the decision created.

what I changed
  • Merged the big delete (about 9,400 lines of the abandoned new UI) into main, so the app now only has the old, working four-tab screens. Nothing the old app needs was removed, I checked the build still works and the start-up tests pass before merging.
  • Removed a leftover scratch copy of the project (a stale "worktree") that still held a piece of the old new-UI code.
  • Closed 17 old to-do tickets that were all about building the new UI, they're dead now, so I marked them "won't fix" and pointed each at the decision record (ADR-0029). Also closed a draft write-up tied to one of them.
  • Closed one ticket (#391) that was actually already done, the database safety-trigger it asked for had shipped earlier and is live; the ticket just never got closed.
  • Kept one ticket open on purpose: the app-icon / wordmark artwork (#344), since the old app could still use a proper icon.
how I tested it

The new code built cleanly and the launch tests passed before the merge; the merge into main was a clean fast-forward. The closed tickets were verified against the actual code and the merged removal first.

Done. PR 426 merged (commit a779dc4). Issues 342, 343, 348–363, 376, 391 closed; draft PR 383 closed. 344 kept open for re-scoping.