Run315

Everything the watch records off the run

What actually responds to your training

27 metrics · 74 days · 108 correlations tested

Your watch records two dozen things a day. For any given person about three of them genuinely move with training, and which three is individual. These are yours.

SignalWhenr
Body battery low point same day -0.79
Your body battery low point falls on a hard day itself (r = -0.79). That is the direction that costs you.
Average stress next day +0.66
Your average stress rises the day after a hard day (r = +0.66). That is the direction that costs you.
Body battery peak next day -0.60
Your body battery peak falls the day after a hard day (r = -0.60). That is the direction that costs you.
Resting heart rate same day +0.58
Your resting heart rate rises on a hard day itself (r = +0.58). That is the direction you would hope for.
Peak stress next day +0.49
Your peak stress rises the day after a hard day (r = +0.49). That is the direction that costs you.

Testing 108 correlations at the usual 5% threshold would throw up about 5 false positives from noise alone — and in fact 36 of yours would have cleared that bar. Everything above is corrected for the number of tests, so the threshold is r > 0.44 instead.

Two honest caveats. Hard days cluster and bad nights cluster, so your days are not independent and the real evidence is weaker than the arithmetic suggests. And correlation is not causation: a daily record cannot tell you which way the arrow points. Read these as dials worth glancing at, not as findings.

Left out as arithmetic rather than insight: intensity minutes +0.95active calories +0.94total calories +0.91daily steps +0.90vigorous minutes +0.86 — calories and step counts rise on days you run further because that is what they measure.

How your nights are built

74 nights · 6.6 h asleep on average

Deep 21% Light 58% REM 21%

Your nights are built in roughly the usual adult proportions. Sleep staging from a wrist device is an estimate, so read this as a shape rather than a measurement.

Adults typically run 13–23% deep and 20–25% REM. Yours are both inside those ranges.

Which way things are heading

last fortnight against the one before

MetricBeforeRecent Change
Body mass 69.9 70.2 +0.4 notable
Light sleep 14796.9 13091.1 -1705.7 notable
Restlessness 10.2 16.1 +5.9 notable
Resting heart rate 47.6 46.5 -1.1
Garmin readiness 66.7 62.2 -4.5
Fitness age 30.9 31.1 +0.2
Overnight stress 18.0 19.2 +1.2
REM sleep 5118.5 5350.3 +231.8
Sleep score 74.8 77.1 +2.3
Body fat 12.4 12.5 +0.1

“Notable” means the change is more than half the metric’s own spread — a blunt filter, but it stops a number wobbling by its usual amount from looking like a development.

Days your body was somewhere else

unusual across several signals at once

One metric out of range is noise. Three or four at once, on the same day, is the day you were coming down with something — and no single chart can show you that.

2026-06-26 4 signals blood oxygen +2.8σ time awake +2.7σ overnight stress +2.4σ body mass -2.2σ
2026-06-30 4 signals average stress -2.4σ body fat +2.3σ peak stress -2.2σ light sleep +2.1σ
2026-06-28 3 signals body battery low point -2.9σ fitness age -2.8σ lowest blood oxygen +2.6σ
2026-07-19 3 signals deep sleep +3.4σ body battery low point -2.7σ REM sleep +2.6σ

Days when you simply ran further are excluded — calories and step counts spiking on a long run is not your body being unusual.

, so the check has to wait for the parsed document. addEventListener('DOMContentLoaded', function () { try { var dm = ['standalone', 'minimal-ui', 'fullscreen', 'window-controls-overlay']; if (!document.getElementById('frozen-note') && (navigator.standalone || dm.some(function (m) { return matchMedia('(display-mode: ' + m + ')').matches; }))) { var pk = 'portal-installed', reg = JSON.parse(localStorage.getItem(pk) || '{}'); reg.Run315 = Date.now(); localStorage.setItem(pk, JSON.stringify(reg)); } } catch (e) { /* private mode - ignore */ } }); // Installable, and readable on the train. See templates/sw.js. if ('serviceWorker' in navigator) { addEventListener('load', function () { navigator.serviceWorker.register('/Run315/sw.js'); }); }
Static demo. A synthetic athlete, frozen to files — every page here is the real app rendering real analysis, but anything that writes (Garmin sync, adding a race, the coach review) is switched off, because a file server has nothing to write to. Source & how to run it for real.