← Back to updates

Train together — Challenges arrive

ZenMotion has always been a solo tool. You pick a program, you log your sets, the app quietly tracks the rungs and the readiness and the rest. Good for the discipline of showing up. Less good for the honest fact that a training partner — someone to compare, poke, and be pushed by — is one of the strongest motivators in this sport.

v1.27 adds Challenges. Pick a movement, pick a duration, share a link. Your friends tap the link, install ZenMotion (or open it, if they already have it), and their name appears next to yours on the leaderboard. Every set they log toward that movement bumps their score. Every set you log bumps yours. That's it.

Templates that match what you already train

Challenges start from a template — push-ups in 30 days, longest plank in 7 days, most reps on pull-ups in 14 days, longest active hang, longest wall handstand hold. Ten templates cover the movements users actually chase. Each template knows what to measure (best single set, total reps across the window, longest single hold), so you don't configure anything — the challenge just knows.

Pick a template, tap "New challenge", set your duration (7 / 14 / 30 days), give it a title if you want, and you're done. Public or private is a toggle — public shows up in the Programs tab for anyone who has your app; private only reaches people who tap your share link.

One tap, one link, one leaderboard

Sharing is a single system share sheet. iMessage, WhatsApp, Discord, Instagram DM — whatever your training group lives in. The link looks like zenmotion.app/c/{id}.

Two paths from there:

  • Friend has ZenMotion installed → tap the link, app opens directly on the Challenge detail. Tap Join. Their name shows on the leaderboard. Done.
  • Friend doesn't have ZenMotion → tap the link, a preview page opens with a description of the challenge and an App Store button. They install, open, and the challenge they were invited to lands on their Home tab — no manual search, no "what was that link again?". The app knows which challenge they came from.

That second path is where most invite flows break, so it got the most engineering care. The link ID rides through the App Store install via the iCloud pasteboard, gets consumed exactly once post-install, and skips the diagnostic onboarding so link-followers can join their first challenge in about 15 seconds from tap to leaderboard.

Quick-log that matches how the app already logs sets

Once you're on the Challenge detail, there's a Quick-log row: a rep stepper, adaptive step size for holds (±1 for short holds, ±5 for medium, ±30 for holds over 10 minutes), and a big teal checkmark to commit. The exact same input pattern the workout view has used since v1.6 — no new learning, no keyboard popping up, no context switch.

The Challenge doesn't require you to be in a workout. If you did 12 push-ups between coffee and email, tap the challenge, log 12, done. If you crushed a hold in your Foundations session, sets that touch a challenge-tracked movement auto-contribute — the workout complete-hook does the score bump for you. Either path works.

Home shows what matters, hides what doesn't

Home's approach to Challenges is deliberately quiet: nothing until you actually have an active one. No "invite a friend!" nudges, no empty-state cards begging for engagement. If you don't do challenges, Home stays exactly as it was.

  • One active challenge → one compact card between your next workout and your weekly stats. Tap opens detail.
  • Two or more → one summary row ("3 active challenges") that pushes to the full list. Keeps Home tight even when your training group is on fire.
  • Zero → nothing. Home stays clean.

Creation lives in the Programs tab under a new Challenges category — a deliberate, opt-in surface for when you're ready to start one, not a nudge you can't dismiss.

Sessions still count without changing anything

The nice property of tying challenges to movements (not to programs, not to session types) is that any session you already run contributes automatically. Your Push Focus Split day has push-ups? Every set contributes to the Push-Ups Challenge you joined. Your handstand day has an active hang warmup? Contributes to the Active Hang Challenge. No re-authoring, no re-thinking, no "challenge mode" toggle. Regular training just accumulates on the leaderboard.

What's next

This is Phase A. Two things follow:

  • Discover — a curator-picked list of public challenges you can join even if nobody sent you a link. Global "most push-ups in 30 days" boards, monthly community goals, that kind of thing. On the roadmap.
  • Announcements — a one-shot introduction sheet when big features like this ship, so we don't have to hope you scroll through Programs to find them. Coming in v1.28.

The small stuff

  • Challenge templates are movement-typed. Best-single-set, total-across-window, and longest-hold each have their own scoring semantics — the leaderboard math is honest to the movement.
  • Score bumps flow through the same /complete hook that already handles rung bumps and achievements, so there's no new race conditions between "session saved" and "score updated".
  • Universal Links are properly signed (AASA), so zenmotion.app/c/{id} is a native deep-link on any iPhone with the app installed. Copy-paste the URL into a note or a browser bar and it still works.
  • Analytics tracks eight events across the growth-loop funnel — shared, tapped, installed-and-joined, logged — so we can see what parts of the invite flow lose people and fix them without guessing.

Solo training got you here. Training with friends gets you further.