← Back to updates

On the wrist — ZenMotion runs on Apple Watch

Hold timers belong on your wrist. Not in a pocket, not face-up on a bench next to you, not lit up on a phone you can't reach with your feet in the air. v1.25 ships a paired Apple Watch companion so your training data lives where your training happens.

This is a Level-2 release in the sense that iPhone is still the source of truth — everything you already do on the phone works exactly the same. The Watch is a live view into an active workout, plus the two surfaces that actually benefit from being on-wrist: the hold-timer countdown and the between-set rest.

Full-screen hold countdown on Watch

Tap Start on a hold set on iPhone. Within a second, the paired Watch swaps its glance for a full-screen countdown — exercise name, set number, goal seconds, a big monospaced timer counting up, and a red Stop button that fills the width of the display.

Two things about that flow that matter more than they should:

The countdown reads from a wall-clock anchor, not a Timer. When your Watch enters low-power display mid-hold (blessed inevitability on the 4th 30-second hold of a session), the seconds keep counting from the actual clock instead of pausing. Wake it back up and the timer is where it should be.

A success-haptic fires exactly at goal reached. One clean pattern — WatchKit's .success — the moment your elapsed crosses the target. If you keep holding past goal, a soft .click fires every 5 seconds as encouragement. Both are subtle enough not to break your position; both are precise enough to trust when you can't see the screen.

Tap Stop on the Watch and the set commits on iPhone with your elapsed value. Rest timer starts. Watch view flips to the next surface.

Between-set rest, rendered on-wrist

The moment the hold ends and rest starts, Watch renders the rest countdown as a circular progress ring — teal-blue while resting, green when done — with the remaining time in the center and an orange Skip button below. Warning haptic at 3 seconds remaining ("hands to the bar"), success haptic at zero.

Skip on the Watch cancels the rest timer on iPhone. Same round-trip principle as the hold Stop button: your action on wrist authoritatively drives iPhone state, not the other way around.

Live Activity mirror in Smart Stack

Beyond the ZenmotionWatch app itself, active workouts now surface as a Live Activity in the Watch Smart Stack automatically — same content as the iPhone lock-screen Live Activity, sized down for the watch face. Program name, current exercise, set-progress bar, wall-clock timer. Works whether or not you have the Watch app open. It's the same feature Apple's own workout apps use for Smart Stack presence; we opted in via supplementalActivityFamilies and let watchOS handle the render.

What we deliberately didn't ship

Coach analysis on Watch, HealthKit workout builder on Watch, standalone Watch launch (workout starts from wrist without touching phone). All three are Level-3 concerns — meaningful only after we know Level 2 gets used. We wired the bidirectional message contract from day 1 so those hook in without a data-model refactor, but shipping them today would double the surface area with no signal yet that the wrist is actually where users want it.

Under the hood

Versioned bidirectional message contract. Everything iPhone ↔ Watch goes through one WatchMessagePayload enum with a version field at the root. When the schema needs to grow, older clients skip unknown messages silently rather than crash. Adding v2 payloads is additive, never breaking.

Wall-clock anchors, not tick counters. Every time-related payload sends an anchor Date (session start, hold start, rest end) rather than "seconds remaining". Watch computes deltas per frame via TimelineView. Drift-resistant when either device backgrounds; correct across app kills; instant re-sync on foreground.

Attempt-then-fallback message delivery. WCSession's sendMessage is preferred for real-time surfaces (hold start, rest start). If the Watch is unreachable at that moment (backgrounded, low-power), the coordinator silently falls back to updateApplicationContext — delivers when the Watch app foregrounds next. No dropped events, no user-visible failure.

Nine analytics events, all attributed by pairing state. Firebase now tracks whether users have a paired Watch (watch_state_discovered), which surfaces actually reach it (watch_session_started, watch_hold_started_on_watch, watch_rest_started_on_watch, watch_live_activity_route), and — the actual retention question — which users tap buttons ON the Watch itself (watch_hold_stopped_from_watch, watch_rest_skipped_from_watch). Segment retention by Watch-adopters vs. non-adopters in Firebase Console to see whether the wrist actually correlates with staying with the app.

Requirements

Apple Watch Series 6 or later, watchOS 26.6+. If your Watch is on an older watchOS, the ZenmotionWatch app won't install but nothing else about the iPhone experience changes.

Feedback

Same channel: support@zenmotion.app. If Watch surfaces don't sync (glance stays stuck on "Open on your phone" while a workout is running), reproduce it on-wrist and let us know which step lost sync — WCSession has real edge-cases we'd rather learn about from the field than guess at.

Train well — on the wrist.