Now on iPad

ZenMotion runs natively on iPad in v1.35.0. Same app, same data, same account — bigger canvas. Sync between iPhone and iPad is instant because there's nothing to sync: both devices talk to the same backend.

What "native" means here

Same binary. Universal target flipped on, App Store now delivers ZenMotion to iPhone and iPad from one build. No scaled-up iPhone rendering, no letterbox — the app runs at iPad's native resolution and gets iPad screenshots on the App Store listing.

The trickier work was making the layout feel right on the wider viewport.

The two decisions that shaped v1.35

Backgrounds go full-bleed. Forms don't.

When the app grew from a 390pt-wide iPhone canvas to a 1024pt-wide iPad, two problems appeared. Full-width backgrounds looked correct — hero images and gradients need the whole viewport, otherwise the app feels like it's floating in a letterbox. Full-width forms looked absurd — a "your nickname" text field stretching 900 points across the screen is the design equivalent of a shouty caps-lock.

The fix is a modifier that only fires on iPad's .regular horizontal size class. Background layers stay full-bleed; form-heavy views cap themselves at 560pt centered. On iPhone the modifier is a no-op, so nothing on the phone changed.

Applied on the onboarding welcome carousel and the nickname step for v1.35 — the two views where the delta was most obvious. Other views got audited and left alone: the workout view, the Stats tab, the Programs list — all of them already had layouts that scaled without ballooning.

Scaffolding stays even when it's currently a no-op.

There's a second modifier — iPadContentWidth() — that today is a no-op. It's there because Tier 2 (the next iPad pass, if usage justifies it) will introduce two-column layouts on views like Programs and Stats. Adding it now, plumbed into the views that will use it later, means Tier 2 is a swap-in change instead of a plumbing project.

Also in v1.35

Apple Watch UI polish.

The rest-timer ring on the watch was sized in absolute points — fine on 44mm, cramped on 40mm. It now scales to viewport width (min(100pt, width * 0.65)), so it fills 65% on smaller watches and caps at 100pt on the larger ones. Same code, better rendering across the whole watch lineup.

The watch idle view also had default 16pt padding, which on 40mm ate about 9% of usable width. Tightened to 8pt horizontal / 4pt vertical.

Three new core movements.

Copenhagen Plank, Side Plank Leg Raise, and Starfish Plank are now in the Foundations Movement Library. Available in Create Program's exercise picker for custom programs, and eligible for cross-program history tracking (Movement rows auto-derive from unique exercise names, so they slot into MovementDetailView + heatmap + trend pools without any hand-authoring).

Copenhagen Plank in particular fills a gap — adductor-loaded side-lying holds that most calisthenics catalogs skip.

Under the hood

Universal binary means the app now needs to render correctly on every iPad size class. The modifier pattern (iPadFormWidth / iPadContentWidth) is the intended way to add iPad-specific layout affordances going forward — read the horizontal size class, branch only when needed, be explicit about what the constraint is doing. No sprawling .ifOS(.iPad) conditionals scattered through view code.

Backend didn't change for v1.35 — the app talks to the same endpoints from the iPhone or the iPad, and account state is server-side, so signing in on iPad picks up exactly where iPhone left off.

What's next

Tier 2 iPad depends on usage signal. If people actually reach for ZenMotion on iPad — not just as a "look it works" install, but as a training device — we invest in the two-column workout view, the wider Programs grid, and the iPad-specific hero art. If not, the current adaptive layout stays as-is and we spend the budget elsewhere.

For now: install on iPad, sign in with your existing account, start a workout.

Available in v1.35.0 on TestFlight now. Rolling out to the App Store this week.