Connect your smart trainer over Bluetooth, run .zwo
workouts in ERG mode, and review every session. No account, no
subscription.
Windows & Linux desktop · free & open-source (GPL v3)
OpenCycling does one thing and does it well: it drives your smart trainer's target power through a structured workout, samples every second, and lets you review the result. No avatars, no virtual worlds, no monthly fee — and everything stays on your machine.
ERG mode only — no SIM / free-ride / manual resistanceAnd nothing you don't.
Everything an indoor session needs, on by default.
Scans on launch with separate status for the trainer and the heart-rate monitor. The trainer is required to start; the HRM is optional.
.zwo workoutsReads workouts from a folder you choose. Supports Warmup, SteadyState, IntervalsT and Cooldown blocks, with target watts computed from your FTP.
Sends each block's target power every second and follows linear ramps for warmups and cooldowns. A keep-alive resends the target so the trainer never drops resistance.
A built-in ramp test that rises every minute in ERG and watches for exhaustion: when you can no longer hold the target it counts down and prompts you to stop, then estimates your new FTP from your best 1-minute power and applies it in one click.
Power, heart rate and cadence stored every second in a local SQLite database. Browse past sessions for stats, a power graph and zone breakdowns.
Off by default, enable what you want.
A webcam tells aero from upright. A live indicator shows your position during the session and your time in aero is saved with it. Runs fully offline and is off until you enable it.
Export sessions as TCX and push them to Strava as Virtual Rides. No shared account: you bring your own free Strava app and run a small auth proxy (about two minutes, see the setup guide).
Light, fast, and out of your way.
OpenCycling speaks standard FTMS (trainers) and HRS (heart rate), so any compliant device should work. Only the hardware below has been verified.
| Device | Type | Protocol | Status |
|---|---|---|---|
| Decathlon D500 | Smart trainer | FTMS (0x2AD2) | ✓ Tested |
| Polar (H9 / H10 / OH1…) | Heart rate monitor | HRS (0x2A37) | ✓ Tested |
| Other FTMS trainers | Smart trainer | FTMS (0x2AD2) | ○ Should work |
| Other HRS straps | Heart rate monitor | HRS (0x2A37) | ○ Should work |
Download, set your .zwo folder and FTP, connect your trainer, and pedal.
On macOS? Build it from source with pnpm tauri build.