How it works

Methodology

Power Predict turns your Strava archive into a sustainable-watts forecast in four steps: extract per-activity power streams, build a mean-maximal-power curve, fit a critical-power model, and apply a fatigue decay for endurance durations.

1. Per-activity power streams

Each FIT file in your Strava archive contains a 1 Hz stream of power-meter readings. Power Predict reads these in your browser and builds a per-activity mean maximal power array — the best average watts you held across every duration window from 1 second up to several hours, using a sliding-window scan over prefix sums.

Activities without a power stream (older rides, phone-only recordings) are skipped. Only the derived MMP arrays are persisted; raw streams stay in browser memory just long enough to compute, then get discarded.

2. Rolling-best aggregation

We take the maximum across activities at each duration to build an aggregate MMP curve, computed in three windows:

Power Predict fits the model on Last 90 days by default and falls back to All time if 90 days has too few points in the fitting window.

3. The Critical Power model

For durations from roughly 3 minutes to 20 minutes, sustainable power is well-described by the 2-parameter Critical Power model:

P(t) = CP + W′ / t

where

With x = 1 / t, the formula becomes a line, and we fit it by ordinary least squares. W′ falls out as the slope, CP as the intercept. Power Predict reports the fit's RMSE alongside CP and W′ so you can see how well your data matches the model.

Why 3-20 minutes

Below about 3 minutes, anaerobic / neuromuscular contributions distort the simple two-parameter relationship. Above 20 minutes, fatigue and substrate-depletion effects pull power below the model's prediction. Fits done outside this window are unreliable.

4. Fatigue decay for endurance durations

If you ask the raw CP model what you can hold for 8 hours, it will answer "approximately CP" — the asymptote. That's wrong: real cyclists fade well below CP over those durations as glycogen runs low.

For predictions beyond the 20-minute window we apply a Riegel-style power-law decay:

P(t) = Panchor × (tanchor / t)k

The anchor is whichever is later: your longest observed MMP point, or the 20-minute model prediction. Anchoring at real data when available means a 12-hour forecast is grounded in your actual 4-hour or 6-hour ride, not extrapolated all the way from the CP fit.

The fatigue exponent k = 0.10. Skiba publishes 0.07, which fits the 1–4 hour range; observed pro and amateur ultra-endurance data falls off faster than that, more like 0.10 in the 8–24 hour range. Defaulting higher avoids the trap of ultra predictions reading too close to CP.

DurationTypical fraction of CPPower Predict default
1 hour≈ 95%≈ 89%
4 hours≈ 85%≈ 80%
8 hours≈ 75%≈ 75%
12 hours≈ 68%≈ 72%

Without observed long-duration MMP, the 1-hour and 4-hour numbers run a touch low — that's a known trade-off of the steeper k. Once your archive contains long rides, the anchor moves to those real points and the prediction tightens up.

The "extrapolated" badge in the predict UI marks any duration outside your observed MMP range. The confidence band widens logarithmically with how far out you've reached.

References

Limitations and planned improvements

Today's predictions assume your last 90 days of data accurately reflect your current fitness. Issues planned for upcoming releases:

Track these on the project milestones.