- Tools & AI
- In development
TUR Workout Tracker
An offline-first workout notebook for iPhone with a Garmin watch companion. I built it because I wanted a log that's fast between sets, needs no account, and fits how I train: lifting, hybrid racing and switching gyms.
- My role
- Solo: product, iOS app, watch app, data, brand and website
- Built with
- Swift, SwiftUI, SwiftData, HealthKit, Garmin Connect IQ (Monkey C), Cloudflare Workers
- Scale
- 806-exercise catalog, about 350 Swift files, 42 test files
- Status
- Runs on a physical iPhone; Garmin and App Store release checks still open
Why I built it
Most workout apps are either too slow to use mid-set or lock your history behind an account. TUR keeps one action in focus at a time, keeps every record on your phone, and lets the watch do the timing.
I also designed the brand: a cave-wall theme with charcoal surfaces, one warm red for primary actions, and an aurochs-horn mark. The marketing site includes a public feature-request and roadmap portal on Cloudflare Workers.
What it does
Fast set logging
Focused weight and rep controls, supersets, circuits, warm-up, drop and failure sets, and rest timers that keep running in the background. Each session starts from last time's numbers.Gym-swap mode
Save the equipment at each gym. When a gym can't support an exercise, the app suggests the closest substitutes, ranked by shared muscles, kind of work and movement pattern, without rewriting history.Heart-rate guided rest
With a Garmin watch streaming heart rate, the rest bar shows your pulse dropping toward a recovery target, can end the rest automatically, and warns when recovery slows across sets.Race mode
For hybrid races, each station splits into work and transition on a wall-clock timer, with a live gap against a ghost of your previous attempt.Progress you can see
A front-and-back muscle-load body map, a weekly photo timeline, estimated one-rep-max records and a shareable year in review, all computed on the phone.Share without accounts
Plans share as an image card with a QR code. Anyone with the app scans it and saves the plan; no account, no server.
How it's built
feature views → feature controllers → GymCore rules and projections → repository (named actions) → SwiftData records → after commit: Health, notifications, Garmin link
Offline and private by default
Records live in SwiftData on the phone with atomic commits, migration recovery copies and full backups. The log needs no account or server.One set of training rules
Training rules live in a separate GymCore Swift package. The Garmin app mirrors the same rules (next-set rotation, rest, set validation, volume) so phone and watch agree.A real Garmin activity
Garmin watches don't run watchOS, so the companion is a Connect IQ app in Monkey C. It records a real Strength Training activity in Garmin Connect and syncs sets and timers with the phone over a versioned message link.Licensed catalog
The exercise catalog is normalised from openly licensed sources, keeps per-entry licence metadata, and merges duplicates so renamed exercises keep their history.
Where it stands
The app builds in Xcode and runs on my iPhone. The Garmin app builds for the epix Gen 2 and runs in Garmin's device simulator. Before release I still need to finish the iPhone interaction checklist, test the watch link and recording on real hardware, and validate the Apple Health integration. The project keeps a written list of what has and hasn't been verified, so this status isn't a guess.