f2da47a70a
- iPhone: disable the idle timer while the exercise detail screen is open, so the display no longer sleeps mid-set. - Watch: the work/rest timers counted on a run-loop Timer that watchOS throttles in the Always-On (wrist-down) state, so they froze. Anchor both to a wall-clock Date rendered with SwiftUI's self-updating timer text; rest haptics + auto-advance now derive from the end time so they catch up after a stall instead of stalling.
67 lines
4.2 KiB
Markdown
67 lines
4.2 KiB
Markdown
# Changelog
|
||
|
||
All notable changes to this project are documented here.
|
||
|
||
## June 2026
|
||
|
||
- 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_FAMILY` 1); 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 the
|
||
`Scripts/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 `NSMetadataQuery` event 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
|
||
`HKWorkoutSession` to 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 `NSMetadataQuery` observer. Removed
|
||
CloudKit/`NSPersistentCloudKitContainer` and 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 `Date` epoch 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
|
||
`navigationDestination` modifiers on the log list; rows now use a single
|
||
destination-based link.
|