Coach 1.3: Both Ends of the Same Name
LIFT 1.5, earlier today, gave the Android app the 873-exercise reference library the browser and the iPhone app already had. Writing that post made the hole in it obvious: I’d fixed the end where a client logs a lift and left the end where a coach prescribes one.
The half I’d missed
Coach’s routine editor on Android is a text box. One exercise per line, Bench | Barbell | 3 x 8 @ 60 — the shortest thing that still round-trips into a real routine without inventing a multi-screen editor, and genuinely fast once you know it.
It’s also a text box, which means the names in it are whatever you typed. So: a coach writes Bench. Their client, on the app I shipped this morning, picks Barbell Bench Press - Medium Grip from the library. One movement, two strings, and every piece of software downstream treats them as unrelated. The progression chart splits. The prescription lines up with nothing.
That’s the same failure the library exists to prevent, sitting on the other side of it.
What 1.3 does
Coach bundles the same exercises.json — the browser build of Coach already shipped it, and now the Android app carries it too, copied rather than re-derived.
Under the routine box there’s a search. Tap a result and it appends a correctly-spelled line. The box is unchanged: writing a whole routine as six lines of text is the fast path and stays the fast path. This is for the name that has to match, which is every name a client will log against.
Typing an exercise the library doesn’t have still works. So does typing one when the file fails to load. A coach’s own vocabulary is not an error — if you program sandbag carries, the app’s job is to write that down.
One thing it deliberately doesn’t do. LIFT floats lifts you’ve logged to the top of the results, because your own history is the best guess at which “bench” you mean. Coach doesn’t: a coach’s history is their clients’, and whose bench press to promote isn’t a question with an obvious answer. So the ordering here is the file’s, exactly as the browser does it.
Two apps holding the same code
Coach’s copy of the library code is a near-copy of LIFT’s, not a shared dependency. That was a choice, and it has an obvious failure mode: two copies of a parser drift, and the drift here would cause precisely the bug the library prevents.
So both pin themselves to the same fixture — output generated by running the browser’s own picker logic over the same file, sitting byte-identical in both repos. If either app’s parsing or its capitalisation rule drifts from the browser, a build fails. Two copies that can’t disagree silently are a different thing from two copies.
What the tests found
The line grammar is pipe-delimited and stringly typed, which means an exercise whose name contains a | would be silently split in half. None of the 873 do. There’s now a test that says so, which fails the day that changes.
And rather than checking a sample through that grammar, all 873 go through it — name and equipment out the other side intact. It’s the narrow point between a shared library and a real prescription, and it’s made of string handling. Worth knowing all of it fits.
Getting it
It’s on the Coach page, and it installs over 1.2 — same signing key, nothing to uninstall, your roster stays where it is.