- Migrate from SwiftData to CoreData with CloudKit sync - Add core models: Split, Exercise, Workout, WorkoutLog - Implement tab-based UI: Workout Logs, Splits, Settings - Add SF Symbols picker for split icons - Add exercise picker filtered by split with exclusion of added exercises - Integrate IndieAbout for settings/about section - Add Yams for YAML exercise definition parsing - Include starter exercise libraries (bodyweight, Planet Fitness) - Add Date extensions for formatting (formattedTime, isSameDay) - Format workout date ranges to show time-only for same-day end dates - Add build number update script - Add app icons
5.6 KiB
5.6 KiB
Workouts App Requirements
Overview
A workout tracking iOS application with Apple Watch companion that helps users manage workout splits, track exercise logs, and sync data across devices using CloudKit.
Platform Requirements
- iOS app (iPhone)
- watchOS app (Apple Watch companion)
- CloudKit sync between devices
- SwiftData for persistence with CloudKit automatic sync
Core Data Models
Split
name: String- Name of the workout splitcolor: String- Color theme for the splitsystemImage: String- SF Symbol iconorder: Int- Display order- Relationship: One-to-many with Exercise
Exercise
name: String- Exercise nameorder: Int- Order within splitsets: Int- Number of setsreps: Int- Number of repetitionsweight: Int- Weight amountloadType: Int- Type of load (weight units)- Relationship: Many-to-one with Split
Workout
start: Date- Workout start timeend: Date?- Workout end time (optional)status: WorkoutStatus- Enum (notStarted, inProgress, completed, skipped)- Relationship: Many-to-one with Split (optional)
- Relationship: One-to-many with WorkoutLog
WorkoutLog
exerciseName: String- Name of the exercisedate: Date- When performedorder: Int- Order in workoutsets: Int- Number of sets completedreps: Int- Number of reps completedweight: Int- Weight usedstatus: WorkoutStatus?- Completion statuscompleted: Bool- Whether exercise was completed- Relationship: Many-to-one with Workout
iOS App Features
Main Navigation (TabView)
-
Workouts Tab
- List all workouts sorted by start date (newest first)
- Create new workout from split
- Edit/delete existing workouts
- Navigate to workout logs
-
Logs Tab
- Historical exercise completion records
- Grouped by workout
-
Reports Tab
- Workout statistics and progress tracking
-
Achievements Tab
- User achievements and milestones
Split Management
- Create/edit/delete workout splits
- Assign colors and system images
- Reorder splits
- Add/remove/reorder exercises within splits
Exercise Management
- Add exercises to splits
- Set default sets, reps, weight
- Reorderable list within each split
- Support for different load types
Workout Flow
- Start workout from selected split
- Auto-populate exercises from split template
- Track exercise completion status
- Update sets/reps/weight during workout
- Mark exercises as completed/skipped
- Auto-prevent device sleep during workouts
Watch App Features
Main View
- List active workouts
- Show "No Workouts" state when empty
- Sync button to pull from CloudKit
- Display sync status and last sync time
Workout Display
- Show workout name and status
- List exercises with completion indicators
- Quick completion toggles
CloudKit Sync
- Manual sync trigger
- Hybrid approach: SwiftData for local storage + direct CloudKit API for sync
- Sync from
com.apple.coredata.cloudkit.zone - Fetch and save Splits, Exercises, Workouts, and WorkoutLogs
Data Management
Exercise Library
- YAML-based exercise definitions in
Resources/directory ExerciseListLoaderto parse YAML files- Preset libraries:
- Bodyweight exercises (
bodyweight-exercises.yaml) - Planet Fitness starter (
pf-starter-exercises.yaml)
- Bodyweight exercises (
CloudKit Configuration
- Container ID:
iCloud.com.dev.rzen.indie.WorkoutsV2 - Automatic sync via
ModelConfiguration(cloudKitDatabase: .automatic) - Development environment for debug builds
- Production environment for release/TestFlight builds
UI/UX Requirements
Design Patterns
- SwiftUI throughout
- NavigationStack for hierarchical navigation
- Form-based editing interfaces
- Sheet presentations for modal operations
- Swipe gestures for edit/delete/complete actions
Visual Design
- Custom color system via Color extensions
- Consistent use of SF Symbols
- Reorderable lists using SwiftUIReorderableForEach
- Calendar-style list items for workouts
- Checkbox components for completion tracking
Key UI Components
CalendarListItem- Formatted date/time displayCheckbox- Visual completion indicatorsSplitListItemView- Split display with icon and colorExerciseListItemView- Exercise display with sets/reps/weightWorkoutLogListItemView- Log entry display
Technical Architecture
Project Structure
Workouts/
├── Models/ # SwiftData models
├── Schema/ # Database schema and migrations
├── Views/ # UI components by feature
│ ├── Splits/
│ ├── Exercises/
│ ├── Workouts/
│ └── WorkoutLog/
├── Utils/ # Shared utilities
└── Resources/ # YAML exercise definitions
Workouts Watch App/
├── Schema/ # Watch-specific container
├── Views/ # Watch UI components
└── CloudKitSyncManager.swift # Direct CloudKit sync
Key Technical Decisions
- SwiftData with CloudKit automatic sync
- Versioned schema with migration support
- Single file per model convention
- No circular relationships in data model
- Platform-specific implementations for iOS/watchOS
- Shared model definitions between platforms
Dependencies
- Yams: YAML parsing for exercise definitions
- SwiftUIReorderableForEach: Drag-to-reorder lists
Entitlements Required
- CloudKit
- Push Notifications (aps-environment)
- App Sandbox
- File access (read-only for user-selected files)
Build Configuration
- Swift Package Manager for dependencies
- Separate targets for iOS and watchOS
- Shared CloudKit container between apps
- Automatic provisioning and code signing