Run315

Hills, and what they cost you

What you have climbed

128 runs · last 180 days

12639m
Total ascent

one and a half Everests

Everest is 8849 m, in the Himalaya.

Cleared

Everest ×1.4 8849 m
Denali ×2.0 6190 m
Mont Blanc ×2.6 4808 m
The Matterhorn ×2.8 4478 m
Mount Fuji ×3.3 3776 m

How you climb

43 hilly runs · 351 climbing segments

+13%
Against the energy model

You hold 13% more speed on the climbs than the energy model expects. Hills are a strength.

Measured inside each run: your speed on the flat sets the reference, and every climbing segment is compared against the speed Minetti's energy-cost model says the same effort should buy on that gradient. Because both halves come from the same run, fitness, weather and how hard you were trying all cancel — only the gradient is left.

This is the part grade-adjusted pace cannot tell you. GAP applies the model to flatten your splits; this tests it, which is why it can say whether hills are a strength.

Your hilliest runs

most climbing first

RunDistanceAscent Per kmGroundOn the climbs
Run
2026-06-06
9.3 km 179 m 19 m Hilly +8%
Run
2026-07-09
9.0 km 176 m 19 m Hilly +15%
Run
2026-04-30
9.2 km 174 m 19 m Hilly +6%
Run
2026-05-30
11.0 km 173 m 16 m Hilly +11%
Run
2026-04-21
9.4 km 172 m 18 m Hilly +15%
Run
2026-08-19
9.8 km 171 m 17 m Hilly -2%
Run
2026-09-05
5.0 km 170 m 34 m Steep +21%
Run
2026-06-13
5.0 km 170 m 34 m Steep +21%

“Ground” is ascent per kilometre, the same scale hiking guides use. The last column is that run alone against the energy model, so it moves about far more than the average above — one run is a mood.

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