Fitness Model (CTL/ATL/TSB)
FitRepo implements the classic PMC (Performance Management Chart) model originally described by Dr Andrew Coggan. It uses Training Stress Score (TSS) from each activity to compute three daily metrics.
Metrics
Section titled “Metrics”CTL — Chronic Training Load
Section titled “CTL — Chronic Training Load”CTL represents your long-term fitness. It is an exponentially weighted moving average (EWMA) of daily TSS with a 42-day time constant.
CTL_today = CTL_yesterday × e^(-1/42) + TSS_today × (1 - e^(-1/42))CTL rises slowly with consistent training and falls slowly during rest. A higher CTL generally means greater fitness.
ATL — Acute Training Load
Section titled “ATL — Acute Training Load”ATL represents your short-term fatigue. It uses the same formula with a 7-day time constant.
ATL_today = ATL_yesterday × e^(-1/7) + TSS_today × (1 - e^(-1/7))ATL responds quickly — a hard week spikes ATL; a rest day drops it noticeably.
TSB — Training Stress Balance
Section titled “TSB — Training Stress Balance”TSB (also called “form”) is simply:
TSB = CTL - ATL| TSB range | Interpretation |
|---|---|
| > +25 | Very fresh — possibly detrained |
| +5 to +25 | Fresh and ready to race |
| -10 to +5 | Neutral — good for quality training |
| -25 to -10 | Some fatigue — training adaptation zone |
| < -25 | High fatigue — risk of overtraining |
TSS calculation
Section titled “TSS calculation”TSS requires a power meter and an FTP value:
TSS = (duration_s × NP × IF) / (FTP × 3600) × 100Where:
NP= Normalised PowerIF= Intensity Factor = NP ÷ FTPFTP= Functional Threshold Power at the time of the activity
Activities without power data (e.g. running without a stryd, cycling without a power meter) are excluded from CTL/ATL/TSB.
Warmup period
Section titled “Warmup period”When querying the fitness timeline via the API or MCP, FitRepo automatically loads 90 days of history before your requested start date to warm up the EWMA accumulators. This ensures CTL and ATL are accurate at the start of your window, not artificially low.
FTP history
Section titled “FTP history”FTP is tracked historically in the user_thresholds table. When calculating TSS for past activities, FitRepo uses the FTP that was in effect at the time of that activity — not the current FTP. This means your historical TSS values are stable even as your FTP changes.
See Thresholds for how FTP history is stored and auto-detected.
Limitations
Section titled “Limitations”- No heart-rate TSS — FitRepo currently only computes TSS from power. HRrTSS (HR-based TSS) is not yet supported.
- Cycling only — TSS is only calculated for activities with power data. Running, swimming, and other sports contribute 0 to CTL/ATL.
- Day resolution — The model is computed at daily granularity. Multiple activities on the same day have their TSS summed.