WorkoutTimer is a native iOS calisthenics app for building exercise libraries, creating reusable workouts, and following guided set and rest intervals.
- Browse, search, filter, sort, create, edit, and delete exercises.
- Assign each exercise one Planche, Push, Pull, Legs, Handstand, L-sit, Core, Freeze, Power, Cardio, Popping, or Skill type, with duplicate names supported across different types.
- Configure sets, reps or seconds, and rest time for each exercise.
- Keep one automatic workout synchronized for every exercise category.
- Build reusable workouts by selecting and reordering exercises.
- Run workouts with automatic guided warm-up and cool-down phases, a set jump slider, set progress, background-safe rest countdowns, completion alerts, and upcoming-exercise previews.
- Pin and reorder all workouts, and edit or delete user-created workouts.
- Enable sound effects, countdown beeps, haptic feedback, automatic set advancement, and screen-awake behavior.
- Start with a bundled calisthenics exercise catalog and category workouts.
- Store exercises, workouts, and preferences locally on the device.
- Swift 5
- SwiftUI
- SwiftData
- AVFAudio
- UIKit
- Xcode 26.5
- iOS 26.5+
The project has no third-party dependencies.
- Clone the repository.
- Open
WorkoutTimer.xcodeprojin Xcode. - Select the
WorkoutTimerscheme and an iOS simulator or device. - Build and run with Command-R.
Code signing is required when running on a physical device.
The app installs the bundled exercise collection and applies versioned catalog updates to existing installations, matching exercises by name and type while preserving custom entries. The catalog reflects the October 2, 2026 Workout CSV, including its reps, sets, rest times, and archive flags. The CSV's Skills type appears as Skill and supplies the 13-exercise Skill workout.
The app maintains one automatic workout for every category and synchronizes its exercises with the exercise library. Archived exercises remain labeled in the library but are excluded from automatic workouts and the Add Exercises picker. Existing user-created workout snapshots remain unchanged. Automatic category workouts cannot be renamed or deleted; user-created workouts remain independently editable.
Rebuilding the project does not clear persisted SwiftData. Delete the app or erase its simulator data to start with a completely fresh copy of the bundled database.
The app uses a feature-first layout with shared core layers:
| Directory | Responsibility |
|---|---|
WorkoutTimer/App/ |
App entry point, root navigation, and startup |
WorkoutTimer/Core/ |
App-wide configuration, models, persistence, extensions, and utilities |
WorkoutTimer/Features/ |
Exercise library, workout library, workout runner, and settings flows |
WorkoutTimer/Shared/ |
Reusable design-system components and styles |
WorkoutTimer/Resources/ |
Asset catalogs and other bundled resources |
Documentation/ |
Architecture and contributor-facing project notes |
See Architecture for the full directory map, dependency direction, and file-placement conventions.
The exercise model stores reusable definitions. Automatic category workouts stay synchronized with those definitions. When an exercise is added to a user-created workout, its values are copied into the saved workout, allowing it to remain stable if the exercise library changes later. Each workout owns its ordered exercises through a SwiftData cascade relationship.
To perform a command-line simulator build:
DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer \
xcodebuild \
-project WorkoutTimer.xcodeproj \
-scheme WorkoutTimer \
-sdk iphonesimulator \
-configuration Debug \
-derivedDataPath /tmp/WorkoutTimerDerivedData \
CODE_SIGNING_ALLOWED=NO \
build