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.
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:
- Signals that raised the score.
- Signals that lowered the score.
- Signals that were missing or stale.
- Whether confidence is low, medium, or high.
Limits
- VitalOS does not diagnose, treat, cure, monitor, or prevent medical conditions.
- Scores are influenced by wearable availability, sensor quality, permissions, and sync timing.
- Travel, illness, stress, alcohol, medications, shift work, and device fit can move signals in ways the beta may not understand.
- Do not use VitalOS to make medical, emergency, legal, financial, or safety decisions.