3bba78eab5
Tapping an exercise now opens ExerciseProgressView -- the watch's Ready -> work/rest -> Finish flow on iPhone, with rep sets counting up, timed sets and rests counting down and auto-advancing, a work-set dot row (dash on the active set, gap widening at the current rest), and capsule Start/Done/One More buttons. The detail/edit screen moves behind a trailing Edit swipe (leading swipe still completes). Swiping back to the Ready page resets the run.
5.6 KiB
5.6 KiB
Changelog
All notable changes to this project are documented here.
June 2026
- Tapping an exercise on iPhone now opens a paged progress run — the same Ready? → work / rest → Finish flow as the Apple Watch (with One More and an auto-firing Done), now with iPhone haptics. Rep-based sets count up (swipe on when done); timed sets and rests count down and auto-advance. A dot row tracks progress with one dot per set — the active set drawn as a dash, with the gap widening at the rest you're currently in. The detail/edit screen (set grid, plan, notes, weight chart) is unchanged but moved behind a new Edit swipe on the trailing edge, alongside Delete; the leading swipe still completes. The paged flow fills the top of the screen for now, with the lower half reserved for a later iteration.
- Reworked the Apple Watch progress flow. The root now lists every in-progress workout (rather than diving into a single one); picking one shows its exercises, and picking an exercise opens a paged run: a lead-in Ready? page with a Start button (shown only when the exercise hasn't begun), the count-up work phases and count-down rests, then a dedicated Finish page with One More and a Done button that auto-completes after a configurable countdown (iPhone Settings → Auto-Finish Countdown, default 5s, synced to the watch). Trimmed the "swipe to skip/rest" hints and added a phase-progress dot row — purple dots for work, teal for rest, the current phase a wider dash — with the count-up/down timers tinted to match (brand purple / light teal).
- Fixed the Apple Watch work/rest timers freezing when the wrist was lowered. They counted by incrementing a per-second
Timer, which watchOS throttles in the Always-On (dimmed) state; they now derive from a wall-clock anchor rendered with SwiftUI's self-updating timer text, so the time keeps advancing while dimmed and is correct the instant the wrist comes back up. Rest haptics and auto-advance are driven off the end time too, so they catch up after a stall instead of stalling. - Keep the iPhone screen awake while the exercise detail screen is open, so the display no longer sleeps mid-set. (The Apple Watch already stays awake during a workout via its HealthKit workout session.)
- Set the iPhone app to iPhone-only (
TARGETED_DEVICE_FAMILY1); it was inadvertently universal but isn't an iPad-shaped experience. The Apple Watch app is a separate target and is unaffected. - Exercise detail now renders the set-progress grid correctly on the first frame (seeded from the log in
init) instead of filling in a frame later. - Added a DEBUG-only screenshot harness (seeded sample data +
--screenshot --screen <name>launch args, excluded from release builds) for generating App Store screenshots from the iPhone and Apple Watch simulators, plus theScripts/metadata/App Store listing source of truth. - Redesigned the Apple Watch app into a focused workout runner: it opens directly on the active workout's exercise list (or prompts you to start one on iPhone), and each exercise runs as a horizontally-paged HIIT cycle — a count-up work phase, swipe to a count-down rest that pings once per second in the final three seconds then auto-advances to the next set, and One More / Done buttons on the final set.
- Added a configurable rest-between-sets duration (iPhone Settings, default 45s), synced to the watch over WatchConnectivity.
- Watch progress is now monotonic and reliably synced: completing a work phase advances the set count on the iPhone and a finished set is never un-counted, and reopening an exercise jumps straight to the first unfinished set (skipping completed work/rest pairs) instead of snapping back to set 1.
- Fixed: progress made on the watch now updates open iPhone screens live. The phone applies a watch-forwarded workout to its cache directly on receipt, instead of waiting on an
NSMetadataQueryevent that a same-process file overwrite doesn't reliably emit — and the exercise detail screen now observes these updates, so its set grid advances in real time without leaving and re-entering the screen. - Starting a workout on the iPhone now launches the Apple Watch app straight into the session via HealthKit (a one-time Health permission); the watch holds an
HKWorkoutSessionto stay active while you train and releases it when the workout finishes. - New app icon: a tilted dumbbell on a purple gradient, full-bleed across iOS and Watch (replaces the teal circular mark).
- 2.0 — Re-platformed persistence onto an iCloud Drive document architecture: JSON files in iCloud Drive are now the sole source of truth, with a rebuildable SwiftData cache populated by an
NSMetadataQueryobserver. Removed CloudKit/NSPersistentCloudKitContainerand the App-Group store. - Rebuilt the Apple Watch sync on a new WatchConnectivity bridge keyed by stable ULIDs (the phone is the sole writer of iCloud Drive).
- Migrated the project to XcodeGen; iOS 26 / watchOS 26, Swift 6 strict concurrency.
- Splits ship as an on-demand machine-based starter routine (Upper Body, Core, Lower Body) at 4×10 with sensible starting weights.
- Stored exercise/log durations as integer seconds (was a
Dateepoch hack). - Fixed: workout marked complete on creation, an undismissable delete dialog, toolbar buttons hidden by nested navigation stacks, and a placeholder "Settings coming soon" row.
- Fixed: tapping an exercise in a workout log pushed the wrong screen (a duplicate of the split list) with the exercise detail hidden underneath — a single row tap was navigating twice. Caused by stacking two
navigationDestinationmodifiers on the log list; rows now use a single destination-based link.