Like most cyclists who train seriously, I was drowning in numbers. Two Zwift sessions a day, every day, plus outdoor racing from March through September, meant that Intervals.icu was quietly accumulating a mountain of data on my fitness, fatigue, sleep, and heart-rate variability.
The problem was not a lack of data; it was a lack of time to make sense of it. Garmin, at the other end of the pipeline, mostly reported the data it collected without adding much meaningful interpretation beyond the brief explanation attached to the Performance Status metric.
I looked at the third-party apps that promise to bridge that gap—the ones that connect to your training platform and let an AI “coach” interpret your numbers. Most of them required monthly or annual subscriptions for what seemed to be little more than moving data from one place to another so that an AI could analyze it.
Instead, I decided to build my own tool to help me better understand how I was training and recovering, using the data I already collected through Garmin Connect and, ultimately, Intervals.icu. Since Intervals.icu serves as the aggregator for all my data from Garmin, Zwift, and Strava, it made sense to start there.
Thanks to Intervals.icu’s excellent API, the tool can retrieve a 20-day window to provide a clear view of recent day-to-day freshness, alongside a 90-day window to capture the broader pattern of my seasonal training. Every time I open the app, it displays my Fitness, Fatigue, and Form—calculated directly from the underlying CTL, ATL, and TSB values rather than estimated by the AI. Each metric is flagged green, gray, or red, so I can see at a glance whether I am fresh, neutral, or digging myself into a hole.
The tool also includes a "Season" section. Average power is a poor way to evaluate a VO₂max or threshold workout because recovery intervals drag the number down and obscure what actually happened. Instead, the app pulls real time-in-zone data from the previous three months of riding and calculates the percentage of training spent at low, moderate, and high intensity. It then asks the AI to determine whether the overall distribution is polarized, pyramidal, or threshold-heavy, and whether that pattern is likely to continue producing gains given my race calendar. The system also reads any injury or illness notes I have logged for a particular day and incorporates them into its recommendations, so a sore knee is not silently ignored in favor of raw numbers.
Beyond the obvious cost savings, the real benefit is that nothing about the system is generic. The AI knows my exact training structure, so its advice is grounded in my actual routine rather than a one-size-fits-all template. And because the app is a small private web application protected by a password, my data never sits inside someone else’s product; it remains in my own Intervals.icu account, is analyzed on demand, and is then discarded.
It is also genuinely simple to run: a lightweight Python application hosted for free on Render, built with the invaluable help of AI and refined conversation by conversation around what athletes actually need. The goal is to continue developing the tool so that it better reflects the principles presented in my ebooks and, eventually, bring it to market.
Below a few screenshots of the tool!