Transparency

How VitalOS Calculates Scores

VitalOS scores are wellness estimates built from Apple Health signals, personal rolling baselines, missing-data checks, and confidence labels. They are not clinical measurements.

VitalOS score pipeline from HealthKit signals to baselines, score modules, confidence, and score receipts

Score Ingredients

Score Current beta ingredients What it means
Recovery HRV, resting heart rate, prior-night sleep, recent load, respiratory rate, blood oxygen when available How ready the body may be to absorb stress today.
Sleep Quality Sleep duration, sleep schedule consistency, sleep stages when available, interruptions, sleep debt How supportive last night's sleep appears for recovery.
Daily Load Active energy, steps, exercise minutes, workouts, recent trend against baseline How much activity burden is accumulating today.
VitalOS Today Score Recovery, Sleep Quality, and Load Balance A simple daily wellness summary, weighted toward recovery and sleep.

Normalization

VitalOS compares most signals to a personal rolling baseline instead of a universal ideal. When enough data exists, the beta model uses a recent baseline window, a robust median, and a capped deviation so one unusual sample does not dominate the day.

signal_delta = clamp((today_value - rolling_median_28d) / rolling_mad_28d, -3, 3)
signal_score = map_delta_to_0_100(signal_delta)

// For signals where lower is usually better, such as resting heart rate:
signal_score = 100 - map_delta_to_0_100(signal_delta)

Current Beta Formula

The exact implementation may change during beta calibration. The public target model is:

recovery =
  0.30 * hrv_score +
  0.20 * resting_heart_rate_score +
  0.25 * sleep_quality_score +
  0.15 * recent_load_balance_score +
  0.10 * oxygen_respiration_score

sleep_quality =
  0.40 * duration_score +
  0.20 * consistency_score +
  0.20 * sleep_stage_score +
  0.20 * interruption_score

daily_load =
  0.35 * active_energy_score +
  0.25 * exercise_minutes_score +
  0.20 * step_score +
  0.20 * workout_intensity_score

vitalos_today =
  0.45 * recovery +
  0.35 * sleep_quality +
  0.20 * load_balance_score

Confidence

Confidence is separate from the score. A high score with low confidence should be treated as weak evidence. Missing permissions, missing samples, delayed sync, or unstable baselines lower confidence.

confidence =
  0.45 * required_signal_coverage +
  0.35 * data_freshness +
  0.20 * baseline_stability

Score Receipts

VitalOS should show why a score moved, including:

Limits