A native iOS and watchOS app for high-intensity interval training. Minimalistic, distraction-free workout timers for focused fitness sessions.
- EMOM Timer - Interval-based workouts with automatic rep pacing
- AMRAP Timer - Time-based rounds, track as many rounds as possible
- Preset Management - Save, edit, delete, and reorder timer configurations
- Workout Stats - Dashboard with charts, muscle group breakdown, and history
- Exercise Library - 21 curated bodyweight exercises with form tips
- Audio Feedback - Warning beeps, interval sounds, and completion cheer
- Settings - Audio preferences, confetti toggle, animated launch screen
- Standalone Timers - Run EMOM and AMRAP workouts directly on Watch
- Preset Editor - Create and edit presets with Digital Crown input
- CloudKit Sync - Presets sync automatically between iPhone and Watch
- Haptic Feedback - Wrist taps for interval transitions and warnings
- Auto-Launch - Timer appears on Watch when started from iPhone
- iOS 26+ / watchOS 26+
- Xcode 17+
- Swift 6.2
- Clone the repository
- Open
Kraftli Timers.xcodeprojin Xcode - Build and run on simulator or device
- Scope - Current features, details, and UI specification
- Backlog - Future features and ideas
- Architecture - Data models, patterns, and components
- ADRs - Architecture Decision Records
Kraftli Timers/
├── App/ # Entry point and root navigation
├── Features/ # Feature modules (Timer/, Presets/, Stats/)
├── Models/ # SwiftData persistence models
├── Services/ # Protocols + implementations
├── Components/ # Reusable UI components
├── Modifiers/ # SwiftUI view modifiers
├── Extensions/ # Type extensions
└── Audio/ # Sound files
Kraftli Timers Watch App/
├── App/ # Watch app entry point
├── Features/ # Timer and preset modules
├── Services/ # Watch-specific services
├── Components/ # Watch UI components
└── Modifiers/ # Watch view modifiers
When making schema changes (adding fields, record types, etc.):
- Changes are automatically applied to the Development CloudKit environment during Xcode builds
- TestFlight and App Store builds use Production - schema must be manually deployed
- Go to CloudKit Dashboard → Your Container → Schema → Deploy Schema Changes...
- Failure to deploy results in silent sync failures in production builds
This is a learning project where educational value matters as much as working code. When contributing:
- Read through the documentation to understand patterns and conventions
- Follow existing code style and SwiftUI idioms
- Keep UI minimalistic - native components, no unnecessary features
- Test on iOS Simulator (iPhone 17 Pro recommended)
MIT License - see LICENSE file.
See ACKNOWLEDGEMENTS file.