An indoor cycling training app with AI coach designed to work seamlessly with the Gnome Desktop Environment. Build your training plan, ride structured workouts in ERG mode or download GPX files to ride your favorite outdoor route indoors.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗This is my hobby project. I am not a coder, so all the code is written by Claude. Yes, I am one of those disliked vibe coders :-). That said, this app serves my needs and has been developed according to the hardware that I have available. If you would like to use this app you are of course free to do so. If you have any issues with the app, or if your hardware isn't supported or if you have any feature request, you are free to let me know.
Tour du Salon is a native GNOME application for indoor cycling training, built in Rust with GTK4 and libadwaita. It connects to smart trainers and sensors over Bluetooth LE and ANT+, executes structured workouts with automatic resistance control (ERG), records sessions, and integrates with Intervals.icu and the Anthropic Claude API for training analysis and AI-assisted coaching.
The application targets GNOME desktop environments and is distributed as a Flatpak.
Tour du Salon is not on Flathub. It is published from its own Flatpak repository instead, which works exactly the same way — you just have to tell your computer about it once.
What is a Flatpak? It is a way of installing Linux apps that keeps each app and everything it needs in its own box. Nothing it installs can break the rest of your system, and removing it leaves nothing behind. Most Linux systems already have Flatpak; if yours does not, install the flatpak package from your distribution.
A "repository" is just an address your computer checks for the app and its updates. Open a terminal and paste:
flatpak remote-add --if-not-exists cycle https://rorynuijens.github.io/Cycle/cycle.flatpakrepo
Nothing is installed yet — this only saves the address.
flatpak install cycle io.github.rorynuijens.Tour du Salon
The first install also downloads the GNOME runtime (the shared set of libraries every GNOME Flatpak uses), so it may take a few minutes and a few hundred megabytes. Later updates are much smaller. Tour du Salon then appears in your applications menu like any other app.
flatpak update
Run this whenever you like. It updates Tour du Salon along with everything else you installed through Flatpak. There is nothing else to configure.
Every release also has a .flatpak file attached. Download it and run:
flatpak install ./cycle-0.1.0.flatpak
This is handy for a machine that cannot reach the repository, but it is a one-off: flatpak update will not find new versions, so you have to repeat the download for each release. The repository in step 1 is the better option if it works for you.
flatpak uninstall io.github.rorynuijens.Tour du Salon
flatpak remote-delete cycle
Your training data lives outside the app and is not deleted by this. To remove that too, delete ~/.var/app/io.github.rorynuijens.Tour du Salon.
https://rorynuijens.github.io/Cycle/ opens in a browser.flatpak remote-delete cycle and redo step 1 using the full .flatpakrepo URL above, which carries the signing key with it.Tour du Salon communicates with BLE devices using standard GATT profiles:
Trainers that expose no usable BLE interface are supported over ANT+: with a USB ANT+ stick, Tour du Salon drives FE-C trainers with full ERG and SIM control plus power and speed readings.
Devices paired in a previous session are remembered and reconnected automatically on the next launch.
Structured workouts are executed segment by segment. Each segment specifies a target power as a percentage of the athlete's FTP. Ramp segments interpolate linearly between two power values. During execution the player displays elapsed and remaining time, target power in watts, live power, cadence, and heart rate from connected devices, and a colour-coded workout graph with a position cursor.
Workouts can be paused and resumed. Ending a workout early saves the recorded portion as a complete session. At the end of a session the athlete is prompted to record a Rate of Perceived Exertion (RPE) on a 1–10 scale.
GPX routes can be ridden in simulation mode: the trainer's resistance follows the route's gradient, and the rider's measured power is converted to a virtual speed through a road-cycling physics model — ease off on a climb and the climb takes longer. The route player shows live gradient, virtual speed, position on the elevation profile, and distance remaining. Without a controllable trainer, route rides fall back to ERG emulation: power targets computed from the gradient at a fixed assumed speed.
The library holds structured workouts across eight training categories: Recovery, Endurance, Tempo, Sweet Spot, Threshold, VO₂ Max, Anaerobic, and Custom. A built-in workout creator edits workouts segment by segment — steady blocks and ramps with FTP-percentage targets, reorderable by drag and drop — and existing workouts can be opened in the same editor. Workouts can also be imported from .zwo files (Zwift XML format) or .erg files, scheduled to a calendar date, or deleted. GPX files can be loaded to preview a route's elevation profile and ride it in the route player.
A monthly calendar view shows scheduled workouts, completed sessions, and marked time-off periods. FIT files recorded on external devices can be imported directly from the calendar. Time off can be marked for individual dates or date ranges.
All sessions are stored locally in SQLite. The history view shows duration, average power, normalised power, average cadence, average heart rate, power zone distribution, kilojoules, and Training Stress Score. A route map rendered from OpenStreetMap tiles is shown when GPS data is present in the source FIT file. Sessions can be deleted individually or uploaded to Intervals.icu as FIT files.
The fitness page computes and displays:
These metrics are derived from both locally recorded sessions and activities synced from Intervals.icu.
Connecting an Intervals.icu account enables syncing activity history (training load, power, HR, cadence, distance), syncing wellness data (HRV, resting HR, sleep, steps, calories), uploading locally recorded sessions as FIT files, and importing structured workouts from the Intervals.icu workout library. Credentials are stored in the GNOME Secret Service keyring.
Tour du Salon integrates with the Anthropic Claude API to provide:
The Anthropic API key is stored in the GNOME Secret Service keyring.
Tour du Salon is intended for cyclists who train indoors on a smart trainer and want a self-contained GNOME application for session execution and training load management. It is most useful to athletes who already use Intervals.icu to track training history and wellness, prefer a native Linux desktop application over a browser-based or proprietary platform, and want AI-assisted training guidance without sending personal data to a third-party coaching service.
The application assumes familiarity with power-based training concepts: FTP, TSS, CTL, ATL, and power zones.
api.anthropic.com. Despite a reference to OpenAI and compatible APIs in the setup wizard, only the Anthropic API is implemented.~/.var/app/io.github.rorynuijens.Cycle/data/cycle/cycle.db in the Flatpak sandbox). There is no automatic backup or cloud sync of the local database.