Skip to content

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.

The product website I designed and built, embedded as a working snapshot (sign-up and roadmap switched off). Try the phone demo: start a workout, log three sets, see the progress. The app screens on it are design mockups, not device captures. Open the site full screen
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.

TUR logo: a red aurochs-horn mark next to the TUR wordmark

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.