Beta Service Notice
WattWeLove is Currently in Beta
Thank you for using WattWeLove! Please be aware that this service is currently in beta phase, which means it is still under active development and testing.
Important Information:
⚠️ Data Loss Warning
During the beta phase, data may be lost or reset during service upgrades. We cannot guarantee the persistence of your data, including:
- Activity data and analysis results
- User settings and preferences
- Training metrics and historical data
- API credentials and authentication tokens
What This Means for You:
- Expect Changes: Features, user interface, and functionality may change without notice.
- Report Issues: We appreciate bug reports and feedback to help improve the service.
- No Guarantees: The service is provided "as is" during beta testing with no guarantees of uptime or data retention.
- Backup Your Data: If you rely on any analysis or metrics, we recommend keeping your own records.
- Re-authentication May Be Required: You may need to reconnect your Strava account after updates.
Moving Forward:
We are working towards a stable release where data persistence will be guaranteed. Until then, please use the service with the understanding that it is experimental and subject to change.
By continuing to use WattWeLove, you acknowledge and accept these terms of the beta service.
📐 How Everything is Calculated
In the interest of full transparency, here are the exact mathematical formulas used to compute every metric in WattWeLove. All power data is sourced from Strava activity streams, sampled at 1 Hz (one data point per second).
Mean Maximal Power (MMP)
MMP at duration d is the highest average power sustained for any consecutive d seconds in an activity. It is computed using a prefix-sum (cumulative sum) array for efficiency:
Where Pj is the power at second j and N is the total number of seconds in the activity.
Durations computed: 1 s, 5 s, 15 s, 1 min, 5 min, 20 min.
📚 Why this formula?
The MMP (also called the "Record Power Profile") is the established standard for characterising a rider's power capabilities across durations. It was formally described by Pinot & Grappe (2011) "The record power profile to assess performance in elite cyclists" Int. J. Sports Med. 32(11):839–844 and is widely used in applied sports science for talent identification and performance benchmarking.
Functional Threshold Power (FTP)
FTP is estimated from the 20-minute MMP using the standard 95% factor (accounts for the anaerobic contribution over 20 minutes vs. a true 60-minute effort):
The power profile card always shows the highest FTP estimated across all analysed activities.
📚 Why this formula?
FTP is defined as the highest average power maintainable for approximately one hour, which closely corresponds to the Maximal Lactate Steady State (MLSS). The 95% correction factor for a 20-minute field test was introduced by Coggan & Allen in "Training and Racing with a Power Meter" (2nd ed., 2010, VeloPress) and is now the de facto standard for FTP field estimation. Its physiological validity relative to MLSS is supported by Borszcz et al. (2018) "Functional threshold power in cyclists: validity of the concept and physiological responses" Int. J. Sports Physiol. Perform. 13(6):737–742.
Critical Power (CP) & W′ (Anaerobic Capacity)
The 2-parameter Critical Power model describes the power–duration relationship:
By substituting x = 1/t, this becomes a linear equation P = CP + W′ · x. CP and W′ are fitted via ordinary least-squares regression across the MMP values at 5 s, 1 min, 5 min, and 20 min:
W′ = (n·∑xy − ∑x·∑y) / (n·∑x² − (∑x)²)
CP = (∑y − W′·∑x) / n
Where n = number of MMP data points, x = 1/t, y = P(t).
W′ is expressed in joules (J) – it represents the finite anaerobic work capacity above CP.
📚 Why this formula?
The hyperbolic power–duration relationship was first described by Monod & Scherrer (1965) "The work capacity of a synergic muscular group" Ergonomics 8(3):329–338. The two-parameter linear regression form (fitting on 1/t) is the standard approach for field estimation of CP and W′, as validated by Vanhatalo et al. (2007) "Rapid O₂ uptake kinetics during severe-intensity exercise in humans" Exp. Physiol. 92(2):373–384. A comprehensive review of the model and its physiological basis is given in Jones et al. (2010) "Critical Power: Implications for determination of VO₂max and exercise tolerance" J. Physiol. 588(Pt 19):3769–3781.
Training Stress Score (TSS)
TSS quantifies the training load of a single activity relative to the athlete's FTP. The Intensity Factor (IF) measures how hard the effort was relative to FTP:
IF = NP / FTP
TSS = (t × NP × IF) / (FTP × 3600) × 100
= (t × NP²) / (FTP² × 3600) × 100
Where t = duration (seconds), NP = weighted average watts from the Strava activity stream.
A TSS of 100 corresponds to one hour at exactly FTP. The FTP used is taken from the athlete's current power profile.
📚 Why this formula?
TSS is an adaptation of the exercise impulse (TRIMP) concept originally introduced by Banister et al. (1975) "A systems model of training for athletic performance" Aust. J. Sport Med. 7:57–61. The power-meter specific formulation using Normalised Power and Intensity Factor was developed by Coggan (2003) and is described in detail in "Training and Racing with a Power Meter" (Allen & Coggan, VeloPress). TSS has been widely adopted as the standard quantification of cycling training load because it accounts for both duration and intensity in a physiologically meaningful way.
Fitness (CTL), Fatigue (ATL) & Form (TSB)
These metrics are computed as exponentially weighted moving averages (EWMA) of daily TSS, updated once per day across the entire activity history:
Fitness (CTL) — 42-day time constant:
CTLn = CTLn−1 + (TSSn − CTLn−1) / 42
Fatigue (ATL) — 7-day time constant:
ATLn = ATLn−1 + (TSSn − ATLn−1) / 7
Form (TSB):
TSB = CTL − ATL
Both series start at 0 and are seeded from the oldest available activity date. TSS = 0 is assumed for rest days.
📚 Why this formula?
The dual-EWMA impulse–response model for CTL and ATL was first proposed by Calvert, Banister & Savage (1976) "A systems model of the effects of training on physical performance" IEEE Trans. Syst. Man Cybern. 6(2):94–102 and extended by Morton, Fitz-Clarke & Banister (1990) "Modeling human performance in running" J. Appl. Physiol. 69(3):1171–1177. The application to cycling with TSS as the training impulse and the 42-day / 7-day time constants was popularised by Coggan (2003) and is detailed in "Training and Racing with a Power Meter" (Allen & Coggan, VeloPress). A rigorous review of the model is provided in Busso (2003) "Variable dose-response relationship between exercise training and performance" Med. Sci. Sports Exerc. 35(7):1188–1195.
W′ Discharge (Anaerobic Depletion)
W′ discharge simulates how much of the anaerobic capacity was depleted during the activity. The model integrates second-by-second, tracking the remaining anaerobic reserve:
For each second, if P > CP (depleting):
W′rem = max(0, W′rem − (P − CP))
If P ≤ CP (recovering):
W′rem = W′rem + (W′ − W′rem) × (CP − P) / (CP × τ)
Normalised discharge returned:
Dnorm = (W′ − min(W′rem)) / W′
τ = 300 s (recovery time constant). Dnorm = 0 means no depletion; 1.0 means full depletion of W′.
📚 Why this formula?
The differential W′ balance model (W′bal) was developed by Skiba et al. (2012) "Modeling the expenditure and reconstitution of work capacity above critical power" Med. Sci. Sports Exerc. 44(8):1526–1532. The recovery term using a fixed τ is based on the integral formulation refined in Skiba et al. (2014) "Validation of a novel intermittent W′ model for cycling using field data" Int. J. Sports Physiol. Perform. 9(6):900–904. The model is widely used to predict time to exhaustion and evaluate pacing strategies, as W′ depletion directly limits high-intensity performance above CP.
Fat / Carbohydrate Fuel Split
For each second of activity, metabolic energy expenditure is estimated and split between fat and carbohydrate using a logistic function centred at CP:
Pmetab = P / η (η = 0.24, gross mechanical efficiency)
E = Pmetab / 4184 (kcal, 1 kcal = 4184 J)
fcarb = 1 / (1 + exp(−5 × (P/CP − 1)))
ffat = 1 − fcarb
%fat = (∑ ffat × E) / ∑E × 100
%carb = (∑ fcarb × E) / ∑E × 100
The logistic sigmoid means fat dominates at low intensities (P ≪ CP) and carbohydrate dominates at high intensities (P ≫ CP), with a smooth transition around CP. The steepness constant k = 5 controls how sharp this transition is.
⚠️ These values are theoretical estimates based on the CP model and a fixed efficiency constant. Individual metabolic variation and substrate availability are not accounted for.
📚 Why this formula?
The physiological basis is the "crossover concept" established by Brooks & Mercier (1994) "Balance of carbohydrate and lipid utilization during exercise: the 'crossover' concept" J. Appl. Physiol. 76(6):2253–2261: at low intensities fat oxidation dominates, while carbohydrate oxidation increases with intensity and becomes predominant above the lactate / critical-power threshold. A logistic function centred on CP provides a smooth, continuous model of this crossover. The gross mechanical efficiency constant η = 0.24 is consistent with values reported for trained cyclists by Jeukendrup & Martin (2001) "Improving cycling performance: how should we spend our time and money" Sports Med. 31(7):559–569.
Estimated VO₂max
VO₂max (maximal oxygen uptake, ml∙kg⁻¹∙min⁻¹) is estimated from two independent models that are combined into a weighted average. Both require the athlete's body weight to be set in the profile.
Model 1 — 5-min MMP linear model (weight: 70 %):
VO₂max₁ = (MMP5 min / m) × 10.8 + 7.0
Model 2 — FTP gross-efficiency model (weight: 30 %):
VO₂max₂ = (FTP / m) / 0.75
Combined estimate:
VO₂max = 0.70 × VO₂max₁ + 0.30 × VO₂max₂
Where m = body mass (kg), MMP5 min = best 5-minute mean power (W) from the 12-week rolling profile, FTP = functional threshold power (W). Both power profile values must be available for the estimate to be shown.
⚠️ These are field-based estimates with typical errors of ±5–10 % compared to laboratory VO₂max tests. They are intended for tracking trends over time, not for clinical assessment.
📚 Sources & rationale
The 5-min MMP linear formula (VO₂max ≈ P5min/kg × 10.8 + 7.0) derives from the observation that the 5-minute maximal power output is strongly correlated with laboratory VO₂max in trained cyclists. The slope and intercept constants were reported by Hawley & Noakes (1992) "Peak power output predicts maximal oxygen uptake and performance time in trained cyclists" Eur. J. Appl. Physiol. 65(1):79–83 (r = 0.98, SEE ≈ 3.5 ml·kg⁻¹·min⁻¹).
The FTP gross-efficiency model uses a gross mechanical efficiency of η = 0.75 (oxygen equivalent), reflecting that at FTP intensity approximately 75 % of the maximal aerobic capacity is engaged. This is consistent with the intensity-fraction approach described by Bassett & Howley (2000) "Limiting factors for maximum oxygen uptake and determinants of endurance performance" Med. Sci. Sports Exerc. 32(1):70–84.
Combining the two estimates (70/30 weighting) reduces reliance on any single measurement and partially compensates for individual differences in pacing strategy and anaerobic contribution during the 5-min effort.
Fitness Age
Fitness Age is the chronological age whose population-median VO₂max equals the athlete's estimated VO₂max. A fitness age lower than the athlete's real age indicates above-average aerobic capacity for their cohort. Requires VO₂max estimate and gender to be set.
Linear age–VO₂max model:
VO₂maxmedian(age) = α − β × age
Inverted to find Fitness Age:
Fitness Age = clamp( (α − VO₂max) / β, 18, 80 )
Population reference constants:
Male: α = 62.0, β = 0.63
Female: α = 51.0, β = 0.47
Clamped to [18, 80] years to avoid extrapolation beyond the range of the reference population data.
📚 Sources & rationale
The concept of fitness age as an inversion of a population VO₂max–age regression was introduced and validated by Nes et al. (2013) "Personalized activity intelligence (PAI) for prevention of cardiovascular disease and promotion of physical activity" — see also — "Fitness age and healthy ageing" Br. J. Sports Med. 47(7):443–447 and the large-scale HUNT study cohort data reported by Nes et al. (2013) "Age-predicted maximal heart rate in healthy subjects: the HUNT Fitness Study" Scand. J. Med. Sci. Sports 23(6):697–704.
The reference constants (α, β) are derived from population VO₂max norms compiled by Shvartz & Reibold (1990) "Aerobic fitness norms for males and females aged 6 to 75 years: a review" Aviat. Space Environ. Med. 61(1):3–11 and cross-checked against the American College of Sports Medicine (ACSM) fitness classification tables in ACSM's Guidelines for Exercise Testing and Prescription (11th ed., 2022).
⚠️ Fitness Age is a population-level statistical concept. Individual variation is substantial (SD ≈ 7.5 ml∙kg⁻¹∙min⁻¹ for men, 6.5 for women). It should be interpreted as a rough indicator, not a clinical measurement.
VO₂max Percentile
The percentile ranks the athlete's estimated VO₂max against the population of people of the same age and gender. The 60th percentile means the athlete's aerobic capacity exceeds 60 % of their peers. Requires VO₂max estimate, age, and gender.
Population median at a given age:
μ(age) = α − β × age
Standardised score (z-score):
z = (VO₂max − μ(age)) / σ
Standard-normal CDF approximation (rational form):
Φ(z) ≈ 0.5 × (1 + tanh( z / (1 + 0.2316419 × |z|) ))
Population reference constants:
Male: α = 62.0, β = 0.63, σ = 7.5 ml∙kg⁻¹∙min⁻¹
Female: α = 51.0, β = 0.47, σ = 6.5 ml∙kg⁻¹∙min⁻¹
The same α and β constants are used as for Fitness Age. σ is the approximate population standard deviation of VO₂max at any given age.
📚 Sources & rationale
Percentile ranking against age- and sex-matched norms follows the framework used in clinical exercise testing, as described in Kaminsky et al. (2015) "Reference standards for cardiorespiratory fitness measured with cardiopulmonary exercise testing: data from the Fitness Registry and the Importance of Exercise National Database (FRIEND)" Mayo Clin. Proc. 90(11):1515–1523.
The rational tanh approximation of the standard normal CDF is a well-known numerical method; the specific form used here is discussed in Abramowitz & Stegun (1964) Handbook of Mathematical Functions, formula 26.2.17 (National Bureau of Standards). It has a maximum absolute error below 0.001 across the full real line.
⚠️ The percentile is only meaningful if the athlete's true VO₂max is close to the estimated value. All caveats for the VO₂max estimate above apply here too.
Source code: All formulas are implemented in src/analysis/mod.rs, src/tasks/mod.rs, and src/db/mod.rs. WattWeLove is open source — you can inspect the exact implementation at any time.
Questions or Feedback?
We value your input! Your feedback helps us improve WattWeLove for everyone.