Smart swaps for the gear you have

v1.41's Equipment Mode taught the app what gear you have. On step-based sessions (Foundations, all 11 skill families), the app already clamped content downward to the highest step you could actually train.

But strength splits and add-on programs — the catalog-authored sessions — had a gap. If Day 4 called for Chin-Ups and you didn't own a bar, the app told you what was missing. It didn't help you replace the exercise.

v1.48 closes that gap.

What actually changes for you

Open a strength split or an add-on program. When the workout preview loads, you'll now see a compact section above the exercise list titled "ADJUSTED FOR YOUR GEAR · 2 SWAPS" (or however many). Each row is one honest trade:

Chin-Ups → Doorway Chin-Ups
No bar today — Doorway Chin-Ups on a sturdy interior door frame. Same underhand grip, same biceps + back recruitment.
Front Squats → Backpack Squats
No barbell today — load a backpack with books (10-20 kg) and hold it front-loaded against your chest.

You see the trade before you start. The exercises further down the list have already been rewritten. When you finish and save, the app records what you actually trained, not what it prescribed.

What's in the substitutions catalog

56 gated source movements across bar, bands, weighted, and parallettes axes. When we couldn't find an equivalent bodyweight movement — because pull-based work genuinely has no honest replacement without pulling something — we added new ones:

  • Doorway Chin-Ups on a sturdy solid-core door frame. Real vertical pulling.
  • Table Rows underneath a stable table or desk. Real horizontal pulling.
  • Towel Door Rows with a bath towel trapped over a closed door. Portable horizontal pull.
  • Backpack Squats, Backpack Bulgarian Split Squats, Backpack Overhead Press, Backpack Rows, Backpack Curls, Backpack Floor Press — real loading via a book-filled bag.
  • Broomstick Dislocates — shoulder mobility without bands.

Every one of these ships with a mandatory anchor-test as the first step of the execution instructions. Before you hang from a door frame, you grip the top and pull hard downward for 5 seconds. If the frame creaks or the hinges shift, you stop and pick a different variant. The Terms of Service section 2 was updated to be explicit that ZenMotion doesn't certify your furniture or your door frame — you verify the anchor before you load it.

Some paths — deep pull-up variants, weighted bar work — genuinely don't have a great bodyweight equivalent. The table honestly says so: the fallback might be Prone Y-Raise or Superman Hold, which train adjacent muscles rather than pretending to replace the pull. Better to be honest about the gap than pretend a scapular retraction stands in for a chin-up.

Custom programs stay untouched

You built a custom program with chin-ups. You don't have a bar. We show you chin-ups anyway.

That's not a bug. Custom programs are your intent — you picked those exercises deliberately. The app doesn't overrule that pick, ever. Equipment Mode adjusts what the app prescribes; it doesn't touch what you authored.

Under the hood (the interesting bit)

The substitution runs on /focus/preview, not at workout-save time. This matters because iOS had a subtle data-loss trap: if the swap fired at save time, the user would have trained "Chin-Ups" but the backend would have written "Doorway Chin-Ups" — and the merge that reconciles your logged reps with the backend's exercise list would silently drop everything.

Moving the swap upstream to the preview endpoint means the workout view, your training draft, and the eventual saved run all agree on the same movement. Zero data loss, zero mystery.

Feature-flag env ENABLE_V1_48_EQUIPMENT_SUBS lets us kill the swap in production in 30 seconds if anything misbehaves — same posture as the other kill-switches we ship behind.

Coming next

Wave 3 of the UX audit — pausable elapsed timer, TipKit systematic fix, exercise-count reconciliation between Home and preview — lands in v1.49.

Available in v1.48.0 on TestFlight now. Rolling out to the App Store this week. Feedback welcome at support@zenmotion.app.