Domestique - a free, open source, science based, self hosted cycling training app

I’ve been building Domestique, a free and open-source cycling training planner, and I’d love feedback or contributions from people who actually train with power.

GitHub: GitHub - platypus45/domestique: Adaptive cycling training planner: 7 science-grounded injury-prevention guardrails close the loop between planned and actual training. 3,054 ZWO workouts, 622 routes, hardware-agnostic. · GitHub

The itch I was scratching: most “smart” planners stop at a dashboard — they show you CTL/ATL/TSB and leave the thinking to you. I wanted something that closes the loop: build the plan, ride it, import the ride, and have it mutate tomorrow’s prescription from what the ride actually showed — TSS overshoot, polarisation breach, DFA α1, aerobic decoupling, monotony, eFTP drift, daily-wellness.

What it does:

- Plans from your goal and your event. Pick an FTP or VO2max focus and it schedules more of the work that actually moves that number (threshold/sweet-spot vs VO2/30-15). Set a target event and it builds backwards from the date — a long-ride progression sized to the event’s distance + elevation, a fitness target that auto-lowers if the date’s too soon (so it never prescribes an impossible ramp), and climbing-specific work for hilly routes.

- ~4,200 structured workouts, copyright-free, content-classified (every file run through a classifier so the type/duration always matches the title), plus 600+ real-world route courses.

- Fully science-based. Every threshold and guardrail traces to the literature (Seiler, Rønnestad, Coggan, Gabbett, Mujika…), cited inline in the README — if you disagree with a number, the paper is right there.

- Computes DFA α1 in-ride — your aerobic threshold (HRVT1) straight from your chest strap’s RR/HRV data, with Malik artifact rejection and a per-ride α1-over-time chart. No lab, no ramp test.

- Reads your physiology, not just TSS: DFA α1 + HRV thresholds, intensity distribution, aerobic decoupling, monotony — and a morning readiness score that folds in your Garmin sleep + overnight HRV (synced through intervals.icu’s wellness).

- Integrated with [intervals.icu](https://intervals.icu) — one API key, no separate account; it pulls your rides, wellness, Garmin sleep + resting HRV automatically.

- Hardware-agnostic. Generate a ZWO or FIT; load it into a trainer app (MyWhoosh / Tacx / Zwift / Golden Cheetah) or push it straight onto a Garmin / Wahoo / Hammerhead; ride; import the FIT back to close the loop.

- Multiple profiles possible, localhost-only. No telemetry, no cloud, no subscription. Your data stays on your machine.

It’s free and open-source (MIT), and I’d genuinely welcome contributors — sports scientists, cyclists, and devs alike. The training logic is grounded in the literature (Seiler, Rønnestad, Coggan, Gabbett…) with inline citations in the README, so if you disagree with a threshold, the receipts are right there to argue with.

Honest disclosure: it’s a personal project, macOS + Windows, and a lot of it was built with heavy AI assistance — so it’s improved fast but I’m sure there are rough edges. That’s exactly what I’m hoping you’ll find.

Happy to answer anything about the methodology or take feature requests / PRs.

Question: suppose I had peak fitness some time in the past with PRs, high FTP test etc. Could it look at the data leading up to that date and replicate the training, rest etc?

Will you post some screenshots of what the UI looks like? It’s hard to get a sense of how one would interact / use this without that.

Sounds insane as a private project! Congrats

Was this vibecoded?

No security policy, no security tests, unsigned and remote access permissions. No thanks.

The Claude folder is a giveaway

Yes fully built using Claude. But dont underestimate the amount of manual work, shaving, re-iterating.

The server binds 127.0.0.1 (localhost-only) at launcher.py:114 and launcher.py:181 — nothing on the network can reach the local API, and there’s no network.server entitlement. What the app does have is outbound access (it calls intervals.icu to sync, using a stored API key). Those are different things.

i added security notes to the readme

what kind of security tests do you want?

there are at least a dozen that have popped up on Intervals.icu since the start of the year. I think because intervals.icu makes their api easily accessible for 3rd party apps and AI has improved enough to allow people to churn out apps and lean on AI for the training methodologies/plans/adaptations.

I think it’s going to take some time to sort out which apps really add value and stick around.