37.8478° N
119.4207° W
CATHEDRAL LAKES
ELEV 9288 FT
SHEET 05 / 06
2
Products from one datasetcompetitive + wellness
0
AI-generated numbersengine computes, AI explains
112
Regression testsworked from the papers
100%
Metrics with a citationDOI on a “show your math” page
05
Case_Study CONQUER

Where I'd take the analytics next

The_opportunity

I've used Strava for a decade and love it, so this started as a fan's question: if I were on the team, where would I take the analytics next? Strava is excellent at the competitive, social side of the sport. The opportunity I kept seeing was to add a layer that helps an athlete decide what's next, not just review what already happened, and to bring along the returning or more casual athlete who wants to get healthier at their own pace. Same data, second audience.

Key_decisions

One dataset, two experiences. Rather than build one more dashboard, I treated the same underlying metrics as raw material for two distinct experiences, each with its own AI interpretation. The serious athlete gets the training-load and fitness metrics this audience already expects, presented with extra rigor and transparency. The wellness athlete gets overtraining detection and gentler guardrails, built for returning or casual riders and runners.

Heart-rate only, no power meter. I scoped to heart rate on purpose: power-based metrics would exclude the runner, hiker, and casual athlete the wellness view is for. Sticking to heart rate keeps that second experience open to everyone rather than narrowing it back to dedicated cyclists.

The AI never generates a number. A metrics engine computes everything in Python from established exercise-science formulas; the Claude layer only interprets the resulting numbers in plain language. A hallucinated metric isn't something I prompt against; there's no path for one to exist. Any simplification is labeled as one.

The_conquer_feature

With “Conquer” you enter a free-text goal, “a 60-mile ride in 14 weeks”, and get back a transparent go / caution / no-go verdict built from your fitness, your recent training capacity, and the weather and elevation the goal implies. It's decision support: the point is to help you commit or adjust, then get out and ride.

Under_the_hood

Training load is built from heart-rate training stress (hrTSS and TRIMP, Banister and Edwards methods), aggregated into Chronic and Acute Training Load and their balance (fitness, fatigue, and form). Injury risk uses the Acute:Chronic Workload Ratio as both a rolling average and an EWMA; other models cover aerobic decoupling and race prediction (Riegel, VDOT). I validated every formula against published literature with a DOI citation on a “Show Your Math” page, and 112 regression tests encode worked examples straight from the papers. Raw activity streams are stored so metrics recompute when a user corrects their Max HR, Resting HR, or LTHR.

There's a full PRD and competitive analysis behind it. It started as interview prep; building the feature turned out to be a better pitch than a slide deck.

Stack
Python / FlaskStrava OAuthOpenWeather APIClaude API