Personal Project · Fitness Dashboard

Health
Tracker

Apple Health collects the basics, but I wanted the full picture — training, body composition, nutrition, and sleep all in one place, cross-referenced and queryable

Apple Health is great at collecting data, but terrible at helping you do anything with it. It can't tell you how your Tonal strength volume affects your Peloton output the next day, whether your calorie intake on MyFitnessPal is tracking with your body composition changes on the scale, or how your Oura sleep score correlates with your training performance. When you're wearing both an Apple Watch and an Oura Ring, you're also getting overlapping data — duplicate heart rate readings, competing sleep scores, redundant step counts. So I built a system with a custom data mastering layer that pulls raw data from six sources into BigQuery, reconciles the overlaps using source-priority logic, and produces one golden record per event. A lightweight data governance tool lets me dial in source trust rankings, field-level priority rules, and conflict resolution policies — the same concepts enterprises spend millions on, applied to a personal health stack. The dashboard surfaces goal rings, streak tracking, nutrition breakdowns, sleep quality trends, and real cross-domain analysis you can't get anywhere else. The endgame: custom watch complications that replace Apple's fitness rings with my own goal trackers on the watch face, and a full-screen SwiftUI dashboard app one tap away — my own health command center on my wrist.

🏋️ Peloton + Tonal + Apple Health 🍎 MyFitnessPal Nutrition 😴 Oura Ring Sleep + Recovery 📊 BigQuery Data Warehouse ⚡ Express.js + Railway ⚛️ Next.js + Vercel ⌚ Custom Watch Complications 🎯 Goal Rings + Streaks
System Overview
Peloton Tonal Apple Health Fit Profile MyFitnessPal Oura Ring 6 sources HealthKit + Direct APIs 15-min sync Data Mastering + Governance Source trust rankings · Golden records Field-level conflict resolution BigQuery Data Warehouse 8 partitioned tables · 3 pre-agg views Clustered by source/type Express API Railway 5 parallel queries · Auto-update side effects Dedup sync pipeline Next.js Frontend Vercel Goal rings + streak bars · Workout feed Mobile-first · Garmin-style

Interactive Preview

Click any tab · Mockup data

Dashboard API · 5 Parallel Queries

The /api/dashboard endpoint fires 5 parallel BigQuery queries: daily summary, workouts, body measurements, goals, and trends. Results are cached for 15 minutes to keep sub-second load times.

67%
Weight Goal
82%
Workouts
45%
Output
58%
Strength
7-Day Streak (Last Week)

Today's Activity Feed

P
Peloton Cycling Class
45 min · 198 kJ output · Avg HR 142 bpm
T
Tonal Strength Workout
38 min · 6,200 lbs volume · Upper Body
S
Fit Profile Weigh-In
Weight 185.2 lbs · Body Fat 18.2%

Weekly Summary

142
Avg HR (bpm)
12.4k
Volume (lbs)
3,200
Calories
18.2%
Body Fat
2,180
Avg Intake (cal)
7h 12m
Avg Sleep
Filterable Workout List

All workouts from Peloton, Tonal, and Apple Watch synced through HealthKit. Deduplicated on external_id, sortable by date, type, or duration.

Date Type Title Duration Calories Avg HR
Apr 5, 2026 Peloton 45-Min Cycling Class 45 min 412 142 bpm
Apr 5, 2026 Tonal Upper Body Strength 38 min 285 118 bpm
Apr 4, 2026 Peloton 30-Min Power Ride 30 min 298 156 bpm
Apr 4, 2026 Watch Evening Run 22 min 201 162 bpm
Apr 3, 2026 Tonal Lower Body + Core 42 min 305 125 bpm
Body Composition Tracking

Measurements from Fit Profile smart scale synced daily through HealthKit. Tracked metrics: weight, body fat %, muscle mass, BMI, body water, and basal metabolic rate.

Current Stats

185.2
Weight (lbs)
18.2%
Body Fat
152.1
Muscle Mass (lbs)
25.1
BMI

Monthly Trend

187
186.1
185.6
185.2

Weight Goal Progress

Start 187 lbs Current 185.2 lbs Target 183 lbs
Active Monthly Goals

The API automatically calculates percentage complete on every data write. Daily snapshots track progress toward monthly and overall targets.

Weight Goal
Lose 10 lbs by June (4 lbs down, 6 to go)
Workout Count
20 workouts/month (16 completed, 4 remaining)
Peloton Output PR
Hit 400 kJ in a class (Peak: 398 kJ)
Body Fat Target
Get to 16% body fat (Current: 18.2%)

How Data Flows

From workout to dashboard

The whole point of this system is that data from six different sources ends up in one place where it can be queried together. Apple Health and direct APIs handle the collection, but BigQuery is where the real analysis happens — joining Peloton ride metrics with Tonal strength data, correlating body composition with MyFitnessPal nutrition logs, layering in Oura sleep and recovery scores, and pre-aggregating daily summaries so the dashboard loads in under a second.

📱

Data Sources

Peloton syncs cycling metrics, Tonal pushes strength data, the Fit Profile scale uploads body composition through HealthKit. MyFitnessPal logs nutrition via its API, and the Oura Ring pushes sleep stages, HRV, and readiness scores through the Oura Cloud API.

🔄

Data Mastering + Sync Engine

Six sources sync on a near real-time 15-minute cadence during waking hours. When Apple Watch and Oura Ring both report heart rate and sleep, the data mastering layer applies source-priority logic — Oura wins for sleep and HRV, Apple Watch wins for active heart rate and workout metrics — and deduplicates on external_id plus time-window matching to produce one golden record per event. A lightweight data governance tool manages source trust rankings and field-level conflict resolution. Watch complications refresh every ~30 minutes via watchOS TimelineReloadPolicy, pulling the latest goal progress, streaks, and scores from the API.

🗄️

BigQuery

Data lands in partitioned, clustered tables. Daily summaries pre-aggregate for fast reads. Views power the dashboard queries.

Express API

The /api/dashboard endpoint fires 5 parallel BigQuery queries. Every write auto-updates streaks, daily summaries, and goal progress.

📊

Dashboard

Next.js frontend renders goal rings, streak bars, workout feeds, and body comp trends. Mobile-first, data-dense, Garmin-inspired.

Data Mastering + Governance

Every write triggers automatic side effects — daily summary rollups, streak updates, and goal progress checks. But the real differentiator is the data mastering layer: when Apple Watch and Oura Ring both report heart rate and sleep, source trust rankings and field-level governance rules determine which signal wins for each metric. The same master data management concepts that enterprises spend millions implementing — source-of-truth hierarchies, conflict resolution policies, golden record creation — applied to a six-source personal health platform.

System Architecture

The full picture

Current state plus where it's heading. Use the phase buttons to see how the system evolves.

Frontend Layer
Next.js App
Vercel · React SSR · Mobile-first
Watch Complications
Custom goal rings on watch face · Streak count · Today's calories · Sleep score — replacing Apple's fitness rings with my own trackers
watchOS Dashboard App
SwiftUI · Full-screen custom dashboard one tap from the watch face · Goal rings, streaks, sleep score, today's stats · The health command center Apple doesn't make
API Layer
Express.js API
Railway · REST · Auth · Logging
Data Mastering + Governance
Data Mastering Engine
Source-priority logic · Golden record creation · Time-window dedup
Data Governance Tool
Source trust rankings · Field-level rules · Conflict resolution
Side Effects Engine
Streaks · Daily summaries · Goal progress
Storage Layer
Google BigQuery
8 tables · 3 views · Partitioned
Sync + Refresh Layer (Phase 3+)
HealthKit Sync
15-min polling during waking hours · Batch push to API · Heart rate, steps, workouts, sleep
Oura Cloud API Sync
Polls every 15 min · Sleep stages, HRV, readiness scores · Overnight data finalizes by morning
MyFitnessPal API Sync
Polls every 15 min · Daily calories, macros, meal log · Updates as meals are logged
Peloton Enrichment
Post-workout pull · Instructor, class type, leaderboard, detailed metrics via unofficial API
Complication Refresh
watchOS TimelineReloadPolicy · Goal rings, streak, sleep score update every ~30 min on the watch face
Data Sources
Peloton
Cycling · Cardio metrics
Tonal
Strength · Volume tracking
Apple Health
Watch · HRV · Recovery
Fit Profile Scale
Weight · Body composition
MyFitnessPal
Calories · Macros · Nutrition
Oura Ring
Sleep stages · HRV · Readiness
Intelligence Layer (Phase 4+)
Workout Recommender
ML-powered suggestions
Body Comp Forecaster
Predictive trends
Recovery Advisor
Oura HRV + sleep · Training load
Nutrition Analyzer
MFP macros vs body comp trends
Notifications + Automation Layer (Phase 5+)
Push Notification Engine
APNs · Apple Watch + iPhone delivery · Real-time nudges right on your wrist
Streak Warnings
Afternoon nudge if no workout logged · "You're 1 day from breaking your 12-day streak"
Goal Pace Alerts
Tracks daily run rate vs target · Flags when you're falling behind on monthly goals
Inactivity Nudges
No movement by 2pm? Gentle tap on the wrist · Configurable quiet hours
Milestone Celebrations
PR alerts · Weight milestones · Streak records · "You just hit 20 workouts this month 🎉"
Auto Goal Adjustment
Dynamic targets based on progress rate · Ratchets up when you're crushing it
Weekly Digest
AI-generated summary · Week-over-week trends · Delivered Sunday evening

Tech Stack

The tech stack

🗄️
Google BigQuery
Cloud Data Warehouse

8 tables, 3 views, partitioned by date and clustered by source. Pre-aggregated daily summaries for sub-second dashboard loads.

Express.js
Backend API

REST API handling data ingestion, dashboard queries, and goal tracking. Auto-updates streaks and summaries on every write. Lives on Railway.

⚛️
Next.js
Frontend (Planned)

Mobile-first React app with a Garmin-inspired data-dense UI. Goal rings, streak indicators, workout feeds, and body composition charts. Will deploy to Vercel.

📱
Apple HealthKit
Data Hub

One of two integration paths. Peloton, Tonal, and Fit Profile sync through HealthKit for workout and body comp data. MyFitnessPal and Oura connect via their own REST APIs for nutrition and sleep — giving us six sources feeding one warehouse.

🚂
Railway
API Hosting

Auto-deploys from GitHub on every push to main. Environment variables for GCP credentials, API keys, and CORS config. Health check monitoring built in.

🔺
Vercel
Frontend Hosting (Planned)

Edge-deployed Next.js with automatic preview deployments on PRs. Same hosting stack as briancronin.ai.

🏋️
Peloton + Tonal
Workout Sources

Peloton for cycling and cardio metrics, Tonal for strength training and volume tracking. Both sync through HealthKit, with optional Peloton API enrichment for instructor names and class details.

⚖️
Fit Profile Scale
Body Composition

Smart scale pushing weight, body fat percentage, muscle mass, BMI, body water, bone mass, and basal metabolic rate through HealthKit.

🍎
MyFitnessPal
Nutrition Tracking

Calorie and macro tracking via the MFP API. Logs meals, snacks, and water intake. Cross-referenced with body composition data to surface whether nutrition is actually driving the results you're seeing on the scale.

😴
Oura Ring
Sleep + Recovery

Sleep stages (deep, REM, light), HRV trends, readiness scores, and resting heart rate via the Oura Cloud API. The missing piece that connects training load to recovery — so you know when to push and when to pull back.

🎯
Goal Engine
Progress Tracking

Monthly and overall goals with daily progress snapshots. The API automatically calculates percentage complete on every data write.

🔔
Push Notifications
APNs · Planned

Apple Push Notification service delivering real-time nudges to Apple Watch and iPhone. Streak warnings before you break a run, goal pace alerts when you're slipping, inactivity nudges if you haven't moved by afternoon, and milestone celebrations when you hit PRs. Your own accountability coach on your wrist.

Watch Complications
watchOS · Planned

Custom goal ring complications that replace Apple's built-in fitness rings right on the watch face. Your weight, workout, output, and strength goals — glanceable on your wrist 24/7, powered by your own API. One tap opens the full dashboard app.

📲
watchOS App
SwiftUI · Planned

Full-screen SwiftUI dashboard app — the health command center Apple doesn't make. Goal rings, streaks, sleep score, nutrition summary, and today's training all on your wrist. Talks to the same Railway API that powers the web dashboard — one backend, three frontends (web, watch face, watch app).