Browse while you train.
v1.7.0 rebuilt the skill side of ZenMotion around rotations instead of level ladders. This one is shorter on architecture and longer on the day-to-day: you can finally browse the rest of the app while a workout is running, the achievement catalogue nearly doubled (22 → 56), and unlocked trophies now show up in three places instead of being buried in a settings tab.
Plus a few smaller things: hold timers now offer a pre-roll countdown, the Live Activity carries the actual target prescription, and the active workout toolbar finally fits the timer without truncating it.
The active workout lives in a sheet now
Until this release, starting a workout pushed it onto the navigation stack, which meant the tab bar disappeared. If you wanted to check a personal record on the Stats tab mid-rest, you had to finish or discard the workout first. That's hostile to how people actually use a fitness app — half the value of "did I beat last week?" is during the session itself.
v1.7.1 reshapes the active workout as a full-screen sheet over the tab bar. Tap the new chevron-down in the top left and the workout slides out of view, the tab bar comes back, and a mini-player above the bar keeps the session live — exercise name, set progress, elapsed timer. Tap it anywhere across all four tabs and the workout slides back up exactly where you left it.
The timer keeps running. The draft is intact. Set state, rest timer, hold timer — none of it touches your minimize. You can wander into Stats to check whether 8 reps is a PR, browse Programs to peek at next week's day, log into Profile to switch your weight unit — and the workout waits.
Cold-start mid-session works the same way. Quit the app during a rest period and the sheet auto-presents on next launch, with the timer wall-clock-restored to the exact second it should be.
34 new achievements — full progression ladders
The achievement catalogue used to be 22 milestones, which covered the headline numbers (first pull-up, first muscle-up, 30-day streak) but had big gaps. A user with 22 pull-ups in one set had nothing to unlock past "15 strict pull-ups" — the catalogue stopped where most lifters were just getting started.
This release adds 34 new achievements (now 56 total). The shape of the additions follows three patterns:
Progression ladders fill in. Pull-Ups now run 1 → 5 → 10 → 15 → 20. Push-Ups go 1 → 10 → 25 → 50 → 75. Dips get a full family — 1 → 10 → 25 → 50. Each one is the natural next milestone, not an arbitrary number. 20 strict pull-ups is the top 0.5 %, which is where weighted-pull-up programming becomes the only sensible direction.
Hold targets get their family too. Plank (60s) and Dead Hang (30 / 60s) existed; now they extend with 2-minute plank, 90-second dead hang, 15s and 30s L-Sit. L-Sit is brand new as an achievement track — it's the gateway to V-Sit and Manna, and was conspicuously missing.
Skill milestones across every static skill. First Tuck Planche, First Tuck Front Lever, First Tuck Back Lever, First V-Sit, First Dragon Flag, First Tuck Human Flag, First Pistol Squat, First Archer Pull-Up — and the "full" tier on the back end: First Full Front Lever, First Full Back Lever, First Straddle Planche, First Press to Handstand, First Hefesto. The skill ladder now has unlockable rungs from "I just started" to "I'm in the top 0.3 %".
Each achievement still carries its world-rarity hint (Top 50 %, Top 5 %, Top 0.3 %), its threshold prescription, and routes you toward the program most likely to unlock it.
Trophies, where you can see them
Hand-in-hand with more achievements: surfaces to actually see them. Until this release, the catalogue lived under Account → Achievements — three taps from anywhere you'd actually be looking. That's fine for a feature that was 22 entries deep. It's wrong for one that's 56.
Three new places trophies show up:
- Home — Trophies cell. The top stats row on Home gets a fourth cell next to Streak / Levels / Active when you have at least one unlock. Star icon, count, tap to open the catalogue. Most-used surface in the app now points at your collection.
- Stats — Achievements card. Between the consistency heatmap and the recent-PRs section, a new card shows your progress through the catalogue: "12 of 56", a thin progress bar, and a six-tile preview row (recent unlocks first, then a couple locked items so the row reads as "two states"). Tap anywhere on the card to drill in.
- Profile — Trophy chip. A small teal capsule under your avatar in Edit Profile: "★ 12 unlocked ›". Same nav target.
All three hide for brand-new users until they earn their first unlock — empty trophy slots read as broken state, not aspirational.
Pre-roll countdown for hold timers
Kicking into a planche or a freestanding handstand takes two or three seconds. Until this release, the hold timer started the moment you tapped Start — meaning your 30-second goal frequently logged as a 27-second hold because the seconds spent setting up ate into the count.
v1.7.1 adds a pre-roll countdown before the hold timer actually begins. Default is 5 seconds; configurable in Profile (Off / 3s / 5s / 10s) for the personal preference. There's also a chip in the active workout footer that cycles through the same values on tap, so you can change mid-session — heavier sets where you need more bracing time, easier sets where you'd rather skip.
The play button itself transforms into the countdown number (5 → 4 → 3 → 2 → 1, with a tick haptic each step), then the real hold timer starts with a success haptic. Tap during countdown to cancel.
While we were in the hold-timer code: within-workout carry-forward is now off for holds. Previously, if you accidentally tapped Stop a second late on Set 1 (35s on a 30s goal), Set 2 would prefill with that 35s — forcing you to manually edit it back every time. Holds now reset to the target prescription each set. Cross-workout target progression is preserved separately — if you beat 30s last week, next week starts at 31s automatically.
Live Activity carries the actual prescription
The lock-screen Live Activity for the active workout used to show the exercise name and a generic "Set X of Y" line. v1.7.1 adds a target prescription line under the exercise name — pre-formatted for whatever the current movement is:
- Rep work: "8 reps"
- Weighted: "8 reps · 50 kg"
- Hold: "30s" or "1:30" for longer holds
Pre-formatted on the iOS side so the widget extension stays a thin renderer. Reads at a glance from the lock screen — no need to unlock to remember the prescription.
The Live Activity also picked up a small brand-mark refresh (teal Z chip replacing the generic figure-icon), and the timer / paused state moved to the trailing slot for cleaner alignment.
Smaller fixes
- Active workout toolbar polish. The timer in the top right was truncating to "4:3…" because the program-name title was crowding the toolbar. The program name is now removed from the workout view (you know which one you started) and the timer dropped to a smaller subheadline font with monospaced digits. Result: timer reads clearly, more room for nav arrows.
- Exercise name font on rep page. Was
.titleand would wrap to two lines for names like "Decline Dumbbell Bench Press", pushing set rows below the fold. Now.title2— still prominent, doesn't dominate. - Discard confirmation, inline. The "Discard this workout?" alert from the workout summary was flickering — appearing and disappearing within a frame — because of how SwiftUI handles alerts inside deeply nested fullScreenCovers. Replaced with an inline confirm card in the summary footer: tap "Discard workout", the link transforms into "Discard this workout? · Cancel · Discard". No modal, no flicker.
- Bonus sets, finally usable. Last release shipped "+ Add set" for adding a bonus set mid-workout — this release stabilises the carry-forward logic that powers it. Bonus sets work on main and accessory exercises; circuit-phase bonus sets are queued for next release.
- Mini-player active-workout guard. Starting a new workout while one is in progress now opens a confirmation alert ("Resume active" / "Discard & start new") instead of silently clobbering the existing draft.
The thread running through v1.7.1: the app should respect that a workout doesn't pause your relationship with the rest of the app. You should be able to look up your numbers, switch your unit, peek at next week — without breaking the session. And the things you've already earned — trophies, milestones, calibration baselines — should be visible where you'd actually look for them.
Email me if anything feels off — support@zenmotion.app. Every message still reaches the person who wrote the code.
— Jacob