rzen 707d71eaf0 Fix watch freeze on the progress flow; make Ready? always reachable
Tapping an in-progress exercise on the watch froze the app in an infinite
SwiftUI re-render loop. WorkoutLogListView.body observed SwiftData two ways
the iPhone list deliberately avoids: a @Query-bound Split, and a traversal of
its `exercises` relationship during render (availableExercises). Reading an
observed model's relationship inside body keeps the view perpetually
subscribed and re-invalidating. Fix: fetch the split imperatively (not via
@Query), gate the Add-Exercise affordances on the value-type doc.splitID, and
evaluate availableExercises only from the picker sheet's closure. The list
body now depends solely on the value-type working doc.

Also remove the temporary on-screen diagnostics/PVDiag plumbing and restore
PhaseTimerLayout and the dot-row animation that were dropped while debugging.

Make the Ready? page always lead the exercise flow on both watch and iPhone
(previously only for not-started exercises), so a resumed run can swipe back
to it. A deliberate swipe back to Ready? resets the run; the transient paged
TabView snap-to-0 on open is guarded by a settle gate plus an adjacent-swipe
check, so an in-progress exercise lands on its set and is never reset on open.

Claude-Session: https://claude.ai/code/session_01SCv7zvGFcKy47KSTnTLxRe
2026-06-20 19:02:09 -04:00
2026-06-20 14:17:26 -04:00

Workouts

A workout tracking app for iPhone and Apple Watch. Build workout splits, run sessions, and track your progress — with your data stored as plain JSON files in your own iCloud Drive.

Key Features

  • Workout splits — organize exercises into reusable routines with custom colors and icons. Start with built-in starter splits (Upper Body / Core / Lower Body) generated from a bundled exercise catalog.
  • Exercise library — a bundled catalog of starter exercises (bodyweight and machine-based) to populate your splits.
  • Run a workout — start a session from a split, then tap an exercise to run it as a paged flow: a Ready? lead-in, count-up work phases, count-down rests, and a Finish page — mirroring the Apple Watch. Swipe a row to mark it complete, or swipe to edit its plan (sets/reps/weight or duration) and notes.
  • Progress tracking — weight-progression charts per exercise across past sessions.
  • Apple Watch companion — starting a workout on the iPhone launches the watch app straight into it. The watch lists your in-progress workouts; pick one, pick an exercise, and run it as a paged flow: a Ready? lead-in, count-up work phases, count-down rests with final-three-second haptics and auto-advance, and a Finish page with One More and a Done that auto-completes after a countdown. A phase-dot row (purple work, teal rest) tracks progress. Rest time and the auto-finish countdown are configurable; changes sync back to the phone.
  • iCloud Drive sync — your data lives as human-readable JSON in your iCloud Drive, synced across devices and visible in the Files app. iCloud is required.

Architecture

iCloud Drive JSON documents are the sole source of truth; a local SwiftData store is a rebuildable read-through cache populated exclusively by an NSMetadataQuery observer (one-way flow: files → observer → cache). The phone is the only device that touches iCloud Drive; the Apple Watch is a thin remote that round-trips workout changes through the phone via WatchConnectivity.

See REQUIREMENTS.md for the data model and CLAUDE.md for project guidance.

Building

The Xcode project is generated with XcodeGen:

xcodegen generate
open Workouts.xcodeproj

Requires Xcode 26 (iOS 26 / watchOS 26, Swift 6).

S
Description
No description provided
Readme 6.8 MiB
Languages
Cython 89.4%
Swift 10.3%
HTML 0.2%
Shell 0.1%