Domestique pulls my rides from Garmin Connect and Strava, computes the metrics that decide whether a training block is working (normalized power, IF, TSS, a mean-max power curve, Bannister CTL/ATL/TSB), turns that into an adaptive plan, and drives my smart trainer through the workouts. No social feed, no premium tier, no third-party cloud holding my history.
The name is the idea. A domestique is the rider who does the unglamorous work so the leader can win. That is the job I wanted from my own data.
I have been on a bike most of my life, mountain biking in Idaho and now road riding here in Japan, and I have used most of the big platforms. They are good at the feed and the badges. They are less good at being a quiet, honest tool that lives on my own machine and answers to me. So I built one. It is single-user by design, though the Go backend underneath is multi-athlete-ready for the day that changes.
The dashboard. CTL, ATL, and TSB in one read, with weekly load colored by intensity.
An activity, broken down: route, power and heart rate, the mean-max curve, and time in zone.
Today's prescription. The engine picks the session; one tap starts it on the trainer.
The same interval, rendered as a side-scroller. My power drives the rider up the hill.
The Routes library. Imported GPX, saved rides, and the Mont Ventoux presets.
A route, ready to play back. The elevation profile drives the trainer's gradient.
The updates below are the build log: the foundation wired end to end, a workout game I did not plan to write, a backend of its own, and the day Mont Ventoux showed up on the trainer.