Files
workouts/CLAUDE.md
rzen 13313a32d3 Add CoreData-based workout tracking app with iOS and watchOS targets
- 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
2026-01-19 06:42:15 -05:00

3.6 KiB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project Overview

This is a workout tracking iOS app built with Swift/SwiftUI, featuring both iPhone and Apple Watch companions. The app helps users manage workout splits, track exercise logs, and sync data across devices using CloudKit.

Development Commands

Building and Running

  • Build the project: Open Workouts.xcodeproj in Xcode and build (Cmd+B)
  • Run on iOS Simulator: Select the Workouts scheme and run (Cmd+R)
  • Run on Apple Watch Simulator: Select the "Workouts Watch App" scheme and run

Architecture

Data Layer

  • CoreData: Core persistence framework with CloudKit sync via NSPersistentCloudKitContainer
  • CloudKit Container: iCloud.dev.rzen.indie.Workouts
  • PersistenceController: Manages CoreData stack initialization, CloudKit configuration, and context access
  • Models: Located in Models/ directory as NSManagedObject subclasses

Core Models

  • Split: Workout routine templates with exercises, colors, and system images
  • Exercise: Individual exercises within splits (sets, reps, weight, load type)
  • Workout: Active workout sessions linked to splits
  • WorkoutLog: Historical exercise completion records
  • WorkoutStatus: Enum for tracking workout/exercise completion states

Model Relationships

Split (1) ──cascade──> (many) Exercise
Split (1) ──nullify──> (many) Workout
Workout (1) ──cascade──> (many) WorkoutLog

App Structure

  • Dual targets: Main iOS app (Workouts/) and Watch companion (Workouts Watch App/)
  • Shared components: Both apps have similar structure with platform-specific implementations
  • TabView navigation: Main app uses tabs (Workouts, Logs, Reports, Achievements)

CloudKit Integration

  • Automatic sync: Configured via NSPersistentCloudKitContainerOptions
  • History tracking: Enabled for CloudKit sync via NSPersistentHistoryTrackingKey
  • Remote change notifications: Enabled for real-time sync updates
  • Cross-device sync: Data syncs between iPhone and Apple Watch

UI Patterns

  • SwiftUI-first: Modern declarative UI throughout
  • Environment injection: ManagedObjectContext passed via .environment(\.managedObjectContext)
  • Navigation: Uses NavigationStack for hierarchical navigation
  • Form-based editing: Consistent form patterns for data entry

Key Directories

  • Models/: CoreData NSManagedObject subclasses
  • Persistence/: PersistenceController for CoreData stack management
  • Views/: UI components organized by feature (Splits, Exercises, Workouts, etc.)
  • Utils/: Shared utilities (date formatting, colors)
  • *.xcdatamodeld: CoreData model definition

CoreData Guidelines

  • Each model gets its own file in Models/
  • Use @NSManaged for all persistent properties
  • Implement fetchRequest() class methods for type-safe fetching
  • Use NSSet for to-many relationships with convenience array accessors
  • Implement add/remove helper methods for relationship management
  • Use appropriate delete rules: cascade for owned children, nullify for references

UI Guidelines

  • Tab-based root navigation with independent navigation stacks
  • Consistent form patterns for add/edit operations
  • Sheet presentations for modal operations
  • Swipe gestures for common actions (edit, complete, navigate)

Development Notes

  • Preview support: PersistenceController.preview for SwiftUI previews
  • Color system: Custom color extensions for consistent theming (Color.color(from:))
  • Date formatting: Extensions in Date+Extensions.swift