← Back to updates

Coach, out of the corner — planche, muscle-up, and the rest of the catalog

Coach shipped in v1.14 as a handstand tool. The whitelist of movements you could analyze mid-workout was a hardcoded set of 9 handstand slugs. In v1.16 planche joined the catalog server-side — tagged with coachType: "planche_static", variant-aware rulesets, everything — but the iOS mid-workout button never got the memo. Users who trained planche got no Coach button in their session, and no obvious way to know Coach even applied to their skill.

Firebase Analytics told the story: 78 analyses in the wild across 8 unique users total since Coach shipped. That's not a "nobody wants form feedback" number — that's a "nobody could find it" number.

v1.24 fixes discovery in three places at once.

Coach opens to more than handstands

The mid-workout "Coach this hold" button now surfaces on planche variants (Tuck, Advanced Tuck, Straddle, One-Leg, Full) alongside the original 9 handstand slugs. Each variant carries its own coach-type + variant-hint tuple so the analysis runs against the correct ruleset — a Straddle Planche gets graded against the straddle targets, not handstand. Front lever, back lever, and the remaining skill families are next in the queue as their rulesets get authored.

Upload video, not a camera icon in the corner

The 56pt circular camera-glyph FAB in the bottom-right corner was making people hesitate. Two questions came up in support: "does this open my camera live?" and "which way should I hold the phone?" Both answers are the same — Coach opens the Photos picker, never a live camera — but a naked icon can't say that.

The sticky Upload video pill at the bottom of the Coach tab removes the ambiguity. It's full-width, it names the action, and it's anchored so it stays in reach while you scroll history. The camera glyph stays as the icon so the affordance still reads "video, not text".

The empty state finally admits Coach isn't just for handstands

Fresh Coach tab used to say "Analyze your first handstand" with body copy naming only handstand. Now it says "See what a coach sees" — handstand, planche, front lever, and more — upload a side-view clip and Coach reads five form angles in seconds. Same CTA copy as the sticky pill so the two surfaces agree.

The BETA badge on the Coach tab is also gone. It was scaring curious first-time visitors away — they read the red accent-dot as "not ready to try". Transparency about beta still lives inside the tab (empty-state footer + privacy info sheet), just without the deterrent signal at first-impression time.

Under the hood

Yellow triangle nav bug, two flavors, both fixed. SwiftUI's NavigationStack renders a yellow placeholder triangle when it can't resolve a destination. Two failure modes surfaced this week:

Hash-collision. CaliDestination.startProgram was a parameter-less case, so two sequential pushes of the same destination were Hashable-equal — SwiftUI treated them as one slot and drew the placeholder. Fix: added a UUID nonce with a default value. Every push is now hash-distinct regardless of whether you tap the same program twice or flip between programs.

Nested NavigationStack. The Coach tab was wrapping itself in its own inner NavigationStack. When its .fullScreenCover for analysis tore down, SwiftUI invalidated the outer stack's .navigationDestination(for:) registration and the next tap on Home's Next Workout card rendered the triangle. Fix: removed the nested stack so Coach uses the same outer container as every other tab.

Both fixes together mean the "Programs → tap A → back → tap B" and "Coach → analysis sheet → Home → tap Next Workout" flows are now stable.

Home stat cells tap into detail. The four stat cells at the top of Home (Streak, Levels, Active, Unlocked) all tap somewhere now, not just Unlocked. Streak + Levels open the Stats tab; Active opens Programs filtered to Recent; Unlocked opens Achievements. Same real estate, more depth.

ASO tracker. Not user-facing, but new for us: a keyword-ranking dashboard sweeping 15 keywords × 12 countries daily. Baseline is thin (started this week) but after another 7 days we'll know which of "muscle up", "bodyweight", "planche training" are indexing where — and where to push next.

Feedback

Same channel: support@zenmotion.app. If Coach still doesn't surface on a movement you'd expect it to, tell us the movement name — the whitelist expansion is a manual authoring step so we'd rather add yours than assume nobody trains it.

Train well.