Cycling Data Pipeline
Cycling is my hobby, and a big part of why it works for me is that it gets me away from a computer screen. I spend my working life in technology industry, so getting outside on a bike for a few hours is the balance to that, and I'm protective of it. What makes these parts of my life interesting is that every ride produces a pile of data. Heart rate, power, cadence, elevation, GPS, plus everything around the ride like sleep and Heart Rate Variability (HRV) and how sore I felt when I woke up.
There's a thing I keep running into professionally, which is that data is the whole game now. Everyone wants to talk about AI models and agents, but the difference between an AI experience that's genuinely useful and one that's a party trick is almost always the data underneath it. Clean, structured, accessible. That's the unglamorous part nobody puts in the demo. So there's a certain irony in the fact that I ended up proving it to myself on my hobby. I have built a data pipeline for my cycling data that captures it using my phone, processes it using two key cycling applications and then allows me to use AI to analyze, query and act on my data.
And all of this data powers my activity.dylanhansen.ca site that I blogged about not too long ago!
One Device on the Bars
Everything starts with Cadence.app, which is what I use to record rides. It runs on my iPhone, and that's the entire point. I don't want another device to charge, update and sync while my phone sits in my pocket doing nothing. My phone is already the most capable computer I own and it's already coming with me. Cadence just lets me use it as the bike computer too. A few things make that actually work rather than just being a nice idea:
It integrates directly with Apple Health. Every ride lands with the rest of my health data instead of in a walled garden I have to export from.
The Apple Watch works as a heart rate monitor. No chest strap. I already wear the watch, so that's one less thing to remember, charge and wash.
The screens are endlessly configurable, on the fly. I can rearrange what I'm looking at mid-ride depending on whether I'm doing intervals or just spinning. Most head units make you sit down at a computer for that.
For mounting I use a Quad Lock and it's been great. I was skeptical about putting a phone on the bars and I've now done it over some genuinely rough pavement with zero issues. Case on the phone, mount on the stem, quarter turn to connect.
I will note that for MTB I skip the phone and just track with the Apple Watch. It still connects to sensors, so I'm not losing data quality. I just don't get a display or a HUD while I'm riding. Which turns out to be fine. On the road I want the numbers in front of me. On the trail I want to ride the trail and look at the data afterward.
Two Data Destinations In Parallel
From Cadence or Apple Watch, ride data gets pushed to two places at once: Intervals.icu and Strava. People ask why both, and the answer is that they do genuinely different jobs.
Intervals.icu is where I plan and analyze. Structured workouts, the fitness model (CTL, ATL, TSB), HRV, resting HR, sleep, mood, fatigue, soreness. It's where I decide what to do tomorrow and whether yesterday cost me more than I thought. A basic account is free (although it’s worth the $50 CAD / year to upgrade), the developer is remarkably responsive, and the API is wide open.
Strava is where I network and where the ecosystem lives. It's where I see what everyone else is riding, track my PRs, and keep a history going back years. It's also the data set that feeds other Strava-specific tools. I use ProBikeGarage to track component wear, which only works because Strava is sitting there as the source of truth for how many hours are on a chain.
Strava tells me what I did and who else was doing it. Intervals tells me what it cost me and what I should do next.
Asking Questions Instead of Reading Charts
Both platforms are now queryable with Claude. For Intervals.icu I built a Skill, essentially a reusable set of instructions that teaches Claude how my data is structured, what my zones and thresholds are, and which endpoints to pull. For Strava I use their MCP connector, which does the same job without me building anything. It’s been great to see Strava launch this MCP connector in the wake of blowback on API changes in the past few years. The result is that I stopped reading dashboards and started asking questions:
What's my HRV done since that last big week, and should I be doing intervals tomorrow?
Which routes haven't I ridden in six months?
Build me a plan for next week that respects a group ride Sunday and legs that are cooked.
Two things came out of that which I didn't expect.
The first is honesty about effort and recovery. I used to train on feel, which in practice meant training hard when I felt good and training hard when I felt bad because I felt guilty. Now when my HRV is well below baseline there's a number telling me to back off, and a number is much easier to accept than a vague sense that maybe I'm tired.
The second is route variety. I had years of rides sitting in Strava and was cycling through the same handful of routes out of habit. Being able to ask what I haven't ridden lately, and build something new against the terrain and distance I actually want, has made the riding itself more interesting.
A Saturday in May is the one I point to. I'd had a normal week, my form numbers said I was fresh, and the plan called for a couple of hours on the road on a weekend. My HRV that morning came in at 21, against 48, 54 and 56 the three days before. Resting heart rate was rising. Nothing obviously wrong, I just felt a bit flat, and in any other year I'd have ridden anyway and called it a bad day in the saddle. Instead I did an hour of yoga and nothing else. The next morning HRV was back to 42 and I rode out to Horseshoe Bay (a beautiful ride!), three and a half hours, one of the best rides I've had this year. That ride does not happen if I ride through the Saturday.
What makes that day stick with me is that the two data sources disagreed. My form numbers said go. My recovery numbers said don't. Knowing which one to listen to is the entire value of having both.
What It Adds Up To
None of this made me faster, riding does that. But it changed how I make decisions, and at 42 with a demanding job and two kids, decisions are most of the game. The hard part of training isn't the hard days. It's knowing which days are supposed to be hard.
And none of it works because the AI is clever. It works because the data underneath is clean and the platforms let me at it. Swap any piece for something closed or messy and the whole thing falls over, no matter what model you point at it. Same lesson I run into at work every week, just with better scenery.
I'm sure I'll keep tinkering with it. That does seem to be how all of these go!