Run315

Race plan

2026-09-05 · 5.00 km

Club parkrun

Run 2 days ago.

Result

19:29 3:54 /km
Finish time
−0:08 projected 19:37
Faster than projected

The course

4.99 km · 71 m up · 72 m down

Start 1% harder than flat Finish

Where it bites:

Postmortem

the run

Evenly run, start to finish.

19:29
Ran
+12s vs goal
+0.0%
Second half vs first
-5.1% on effort
65s
Lost against plan
+11
HR drift, bpm
KmPlanRan DeltaGrade EffortHR
1 3:21 /km 3:54 /km +28s -2.7% 4:31 /km 172
2 4:08 /km 3:54 /km -14s +1.0% 3:42 /km 176
3 4:00 /km 3:54 /km -6s +1.1% 3:40 /km 179
4 3:17 /km 3:54 /km +37s -2.8% 4:33 /km 183
5 4:34 /km 3:54 /km -33s +3.4% 3:15 /km 186

“Effort” is the pace adjusted for gradient, so a slow kilometre uphill can be a better effort than a quick one on the flat.

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