Files
workouts/CHANGELOG.md
T
rzen 3bba78eab5 Open a paged progress run when tapping an iPhone exercise
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.
2026-06-20 14:15:43 -04:00

5.6 KiB
Raw Blame History

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_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.