LIFT 1.5: One File, Three Apps
This morning’s post opened with LIFT’s Train tab and a feature that didn’t do anything. This is the other half of that: the Train tab was also missing the thing you’d reach for first.
Typing it out every time
Adding an exercise on Android was a name you typed and an equipment field beside it, plus chips for the lifts you’d already logged. Fine for the fourth week of a programme where you do the same six things. Useless the first time, and useless the day you try something new — you’re spelling “Romanian Deadlift” into a phone keyboard and hoping you spell it the same way next Tuesday.
The browser build and the iPhone app have both searched a 873-exercise reference library for a while. Android was the one that couldn’t.
1.5 gives it the same file. Not an equivalent one — literally the same exercises.json the browser ships, copied rather than re-derived, and checked byte-for-byte inside the built APK.
Why one file and not three
This is the part that matters more than a search box usually would.
A coach writing a plan in Coach and a client logging it in LIFT have to be naming the same lift. Not approximately — exactly. “Barbell Squat” and “Back Squat (Barbell)” are the same movement to a human and two unrelated trend lines to a database. The moment they drift, the history stops lining up, the progression chart splits in half, and the coach is looking at a client who appears to have stopped squatting.
One file is how that stays true without anyone having to remember it. It’s the same reason the ingredient spellings and the pounds-versus-kilograms bug in the morning post were worth the trouble: three apps that agree by construction beat three apps that agree because someone was careful.
Two things it does differently on purpose
The phone has something the browser doesn’t: your log, sitting right there.
- Lifts you’ve logged float to the top, most recent first. No amount of tuning the reference data can tell whether “bench” means bench press or bench dips. Your own history can, and it’s right almost every time.
- That ranking runs before the results are capped, not after. The browser takes the first 40 matches and never reorders them. Doing that here would hide exactly the row the ranking exists to surface — your own bench press, sitting at position 300 of the alphabet, cut off before anything got sorted.
Typing an exercise the library doesn’t have still works. So does typing one when the file fails to load entirely. The library is a convenience, not a gate on what you’re allowed to have done — if you did sandbag carries in a car park, the app’s job is to write that down, not to ask for a citation.
The bug the tests didn’t catch
Each result row shows the exercise name with a line under it: “chest, barbell”.
I built that line by taking the full row label — "name - muscle, equipment" — and slicing it at the first " - ". Sixty-odd exercises in this library have a dash in the name of their own. So the row read:
Barbell Bench Press - Medium Grip
Medium Grip - chest, barbell
Half the name, wearing the subtitle’s clothes.
Every test passed. They passed because I wrote them, and I wrote them agreeing with the same wrong idea that produced the bug — that a name and its details could be told apart by looking for a dash. The thing that caught it was putting the app on a screen and reading it.
That’s not an argument against tests; the other twenty-nine found real problems, and six of them compare this app’s search results against output generated by the browser’s own code rather than my reading of it. It’s an argument against believing a green suite means you’ve looked. The subtitle is built as its own string now, and the joined label is built from it rather than the other way round.
Ready-made splits
Push/pull/legs, upper/lower, full body — a set of routines that are there before you’ve written any. That was on the Coming list with a footnote saying it was waiting on this, because a split is a list of exercise names, and names that don’t match the library generate history that matches nothing.
It isn’t waiting on it any more.
Getting it
It’s on the install page, and it installs straight over whatever you have — same signing key, nothing to uninstall, your log stays where it is.