Skip to content

curara81/SportsDashboard

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

67 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Runner+

CI Platform No paid APIs Localization License

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.


Screens


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.


Why Runner+

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.

What makes it different

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.


Features by area

🏃 On the watch — live workout (watchOS 10+)

  • 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 HKWorkout with its attached GPS route back to Apple Health.

📱 On the phone — Garmin-Connect-style app (iOS 17+)

  • 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 .mp4 export 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.

😴 Sleep & recovery

  • 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.

📊 Analytics engine (all from public literature)

  • 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.

🌐 Localization & accessibility

  • 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.

100% free & fully on-device

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.


Install it yourself (share this repo link)

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.xcodeproj

Then in Xcode:

  1. Select the SportsDashboard Watch App scheme (for the watch) or SportsDashboard (for the iPhone).
  2. Under Signing & Capabilities, set Team to your own Apple ID (a free Apple ID works — you don't need a paid developer account).
  3. 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.

Swapping in real device captures

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).

Requirements

  • 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

Tests

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=NO

CI (.github/workflows/ci.yml) runs these plus a watchOS + iOS compile on every push.

Tech stack

SwiftUI · HealthKit · CoreLocation · MapKit · CoreBluetooth · Swift Charts · AVFoundation · WatchConnectivity · SwiftData · WatchKit. Project generated from project.yml with XcodeGen. Targets watchOS 10 / iOS 17.


Disclaimer & Trademarks

  • 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.

License

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

About

Runner+ — Garmin-class running & training analytics native on Apple Watch + iPhone. Live GPS maps, HR-zone gauges, TSB/VDOT/ACWR training load, readiness, route flyover→MP4. 100% on-device, no paid APIs.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages