A standalone Apple Watch + iPhone running & training app that brings Garmin-Forerunner-class analytics to Apple's own hardware — live GPS maps and heart-rate-zone gauges on the watch, cinematic route flyover replays on the phone, and a full training-load / readiness / recovery engine computed entirely on-device from openly published sports-science formulas.
Personal / educational open-source project. Not affiliated with any fitness brand. See Disclaimer & Trademarks.
Live HR zone arc |
Zone training + keep-alert |
Wrist-raise pace glance |
Live GPS map |
Readiness + training balance |
Route flyover → MP4 |
Calendar + workout detail |
Design previews rendered from the app's real UI components (Garmin-standard zone palette, 270° gauges). Swap in device captures anytime — see below.
Dedicated fitness watches (Garmin, Suunto, Coros) give you training load, readiness, recovery, route maps and replays — but you pay for the hardware and the analytics live in a closed vendor cloud. Runner+ asks: how far can you get toward a premium fitness watch using only an Apple Watch, Apple's frameworks, and public peer-reviewed research?
Every number in the app comes from a formula you can look up in a paper — not a proprietary black box, and not a paid cloud service. It runs offline.
Searching GitHub, the comparable projects fall into three buckets, and none do what Runner+ does:
| Category | Examples | Gap |
|---|---|---|
| Android / cross-platform trackers | Gadgetbridge (4.5k★), OpenTracks (1.4k★), RunnerUp (938★) | Not Apple-native; no periodization science |
| Self-hosted web dashboards | wger (6.3k★), FitTrackee (1.1k★), open-wearables (2.1k★) | Import files server-side; no live on-watch workout |
| Apple-native but narrow | OpenWorkoutTracker (81★), Gym-Routine-Tracker Watch (59★) | Simple logging; no training-load / readiness analytics |
Runner+ is the only one combining native watchOS live workouts + Garmin-style periodization (TSB / VDOT / ACWR / readiness) + Korean voice guidance + indoor smart-trainer support — all on-device.
- Big-text data screens, one metric per screen, Digital-Crown paged (Garmin style): heart rate, pace (current + average), distance, speed, cadence, calories, elapsed.
- Zone arc gauge — a 270° Garmin-signature arc split into the 5 Karvonen HR zones (standard gray/blue/green/orange/red), inactive zones dimmed, a marker dot riding the arc at your current HR, and the big BPM readout tinted by the current zone.
- Zone training screen (Apple-Workout style) — segmented zone bar with the current zone swelling into a labeled chip, time spent in the current zone, and average HR. Optional zone-keep alert: pick a target zone (off by default, remembered across workouts) and drifting out of it for 20 s triggers a haptic + Korean voice cue ("영역 2로 낮추세요") — built for Z2 fat-burn sessions.
- Auto-adapting HR zones — resting HR refreshes from your measured 7-day HealthKit average and max HR rises to match any workout that actually hits a new high, so zone boundaries track your fitness instead of a one-time snapshot.
- Live GPS map page — your route polyline drawn in real time, follow camera, current position, back-to-start bearing.
- Elevation — live altitude, ascent, descent (grade-adjusted pace via Minetti cost).
- Auto-pause / auto-resume, manual + automatic laps, time-in-zone.
- Indoor cycling mode — GPS auto-off; connects Wahoo KICKR / ELEMNT and other Bluetooth Cycling Power sensors (service
0x1818) for live power and cadence, with auto-reconnect. - Now Playing page inside the workout — change tracks with the Crown and page straight back, no app switch.
- Wrist-raise pace glance — raise your wrist mid-run and current + average pace flash big for 5 seconds, then fade back.
- Korean voice guidance — every-kilometer split, current/average pace, and alerts spoken in Korean (
AVSpeechSynthesizer, ducks your music instead of stopping it, un-ducks cleanly when the cue ends). - On-screen warnings if GPS is denied or a metric fails to start collecting — never a silent gap.
- Saves a full
HKWorkoutwith its attached GPS route back to Apple Health.
- Tabs: Home / Calendar / More.
- Calendar marks workout days and high-step days; tap a day → full workout detail. Covers as far back as Health has data, not a fixed window.
- Morning readiness ring (sleep + HRV + resting HR), gradient-scored.
- Training balance — CTL / ATL / TSB fitness–fatigue chart, ACWR (hidden until you have enough history to mean anything), training status.
- Recovery countdown — "N hours until your next recommended workout", anchored to your last session.
- Multi-source training load — same-day workouts from Apple Watch, Apple Fitness, Wahoo, or Strava are aggregated (not overwritten) and de-duplicated when the same session gets recorded twice.
- Route flyover replay over a 3D satellite map (play / pause / scrub / speed) and
.mp4export to share (MKMapSnapshotter+AVAssetWriter), with an on-screen error if a render fails. - VO₂max estimate, fitness age, race-time prediction, weekly trends, full workout history.
- Auto-refreshes when you reopen the app so it never shows last night's stale snapshot.
- Nightly sleep staging from HealthKit (core / deep / REM / awake) → sleep score (efficiency + HR dip).
- Sleep Bank — rolling 7-day sleep debt / surplus.
- Reads sleep already recorded by AutoSleep or Apple's own tracking; no extra tracking of its own. If both write the same night, the app merges the overlap instead of double-counting hours.
- TRIMP — Banister, Edwards, Lúcia
- CTL / ATL / TSB — Coggan fitness–fatigue (42-day / 7-day EMA)
- ACWR — acute:chronic workload ratio (EWMA, Gabbett)
- Karvonen HR zones, heart-rate recovery, cardiac drift / decoupling
- Daniels VDOT, Riegel race prediction, Minetti (2002) gradient-adjusted pace
- Foster monotony / strain, ACSM VO₂max → fitness-age table
Every formula is peer-reviewed and citable. No vendor's proprietary algorithm (no Firstbeat "Body Battery", etc.) is used or reproduced.
- Korean-first, English available — UI labels localize automatically on an English-language device (
Localizable.strings); voice guidance and domain terminology stay Korean by design. - VoiceOver labels on the gauges and live metrics for visually-impaired use.
No paid APIs. No API keys. No cloud. No account. Verified across the whole
Swift codebase: zero URLSession calls, zero external endpoints, zero AI/LLM
services. The only frameworks imported are Apple's own:
SwiftUI · SwiftData · HealthKit · CoreLocation · MapKit ·
CoreBluetooth · Swift Charts · AVFoundation · WatchConnectivity ·
UserNotifications
All analysis is plain math running on your watch and phone. Maps use Apple Maps (no key required on-device). The app works with the network off.
Anyone with a Mac, Xcode, and an Apple Watch paired to their iPhone can build and run Runner+ on their own devices — no App Store, no purchase. This repo link is the shareable page.
git clone https://github.com/curara81/SportsDashboard.git
cd SportsDashboard
brew install xcodegen # if you don't have it
xcodegen generate # builds the .xcodeproj from project.yml
open SportsDashboard.xcodeprojThen in Xcode:
- Select the
SportsDashboard Watch Appscheme (for the watch) orSportsDashboard(for the iPhone). - Under Signing & Capabilities, set Team to your own Apple ID (a free Apple ID works — you don't need a paid developer account).
- Pick your paired watch / phone as the run destination and press Run.
Free-Apple-ID caveats: apps signed with a free personal team expire after 7 days (re-run from Xcode to renew) and you can have a limited number of app IDs active at once. The bundled team ID in
project.yml(DEVELOPMENT_TEAM) is the author's and won't work for you — replace it with yours. Watch installs can also fail if the watch is locked ("Navigation away from clock is not allowed") — unlock it first.
Full signing / provisioning / on-device notes: BUILDING.md.
The images under docs/screenshots/ are illustrative SVG previews. To use real
captures: on the watch press the side button + Digital Crown together; on the
iPhone press side button + volume up. Save the PNGs over the files in
docs/screenshots/ (or add new ones and update the <img> tags in this README).
- macOS with Xcode 15+
- Apple Watch (watchOS 10+) paired to an iPhone (iOS 17+)
- HealthKit permission (granted on first launch)
- Optional: a Bluetooth Cycling Power trainer/sensor for indoor cycling
MetricsEngine's sports-science formulas have a host-less macOS logic-test bundle:
xcodebuild test -project SportsDashboard.xcodeproj -scheme Tests \
-destination 'platform=macOS' CODE_SIGNING_ALLOWED=NOCI (.github/workflows/ci.yml) runs these plus a watchOS + iOS compile on every push.
SwiftUI · HealthKit · CoreLocation · MapKit · CoreBluetooth · Swift Charts ·
AVFoundation · WatchConnectivity · SwiftData · WatchKit. Project generated from
project.yml with XcodeGen. Targets
watchOS 10 / iOS 17.
- Not affiliated with, endorsed by, or connected to Garmin, Firstbeat, Apple, Suunto, Coros, Wahoo, Strava, or any other company. All product names and trademarks are the property of their respective owners and are used here only nominatively, for description and comparison.
- Metrics are approximations derived from public sports-science research, not the proprietary algorithms of any vendor. No Firstbeat-branded metric (e.g. Body Battery) or proprietary algorithm is used or reproduced.
- Not a medical device. Provided for informational and educational purposes only; it is not intended to diagnose, treat, or prevent any condition.
- Maps and flyover videos use Apple Maps; map data © Apple and its data providers. Apple Maps attribution must be preserved where map content is displayed or shared.
PolyForm Noncommercial License 1.0.0 — free to use, modify, and share for noncommercial (personal, educational, research) purposes. Commercial use requires a separate license from the author.
Required Notice: Copyright © 2026 curara81