📘 User Guide

Everything you need to start training — from connecting your first sensor to uploading your finished ride.

🚴 Overview

Maximum Trainer is a free, open-source indoor cycling and rowing training application. It connects to smart trainers, power meters, heart rate monitors, and cadence sensors over Bluetooth LE (BLE), runs structured interval workouts in automatic ERG mode, and exports completed activities to the Garmin FIT format for upload to Strava, TrainingPeaks, and SelfLoops.

📡

BLE Sensors

Heart rate, power, cadence, speed, and muscle oxygen via standard BLE profiles.

ERG Mode

Automatic resistance control — just pedal at the right cadence and hit your target power.

📋

Workout Library

Sync structured workouts from Intervals.icu, plus import your own .erg / .mrc / .zwo files.

☁️

Activity Upload

Post-workout upload to Strava, TrainingPeaks, and SelfLoops — directly from the app.

This guide assumes Maximum Trainer is already installed on your computer. If you need installation instructions, see the README on GitHub.

Browser version available: Maximum Trainer also runs directly in Chrome or Edge via WebAssembly (WASM) — no installation required. Open Try in Browser to launch it. The browser version supports BLE sensor connections via the Web Bluetooth API, but has no access to local files, no internet radio, and no video playback. The browser must be served over HTTPS and the device must be paired via a user gesture (clicking Start Workout).

🚀 First Launch & Login

On first launch, Maximum Trainer displays a login screen. You can connect with your Intervals.icu account via OAuth, or choose Offline Mode to train without an internet connection. Your Intervals.icu credentials are stored securely in the platform keychain — you will not need to log in again on the same machine.

Option A — Sign in with Intervals.icu (recommended)

  1. Launch MaximumTrainer from your Start Menu, Applications folder, or desktop shortcut.
  2. On the login screen, click Connect with Intervals.icu.
  3. An embedded browser window opens showing the Intervals.icu authorisation page. Log in with your Intervals.icu credentials and click Authorise.
  4. Maximum Trainer exchanges the authorisation code for an access token and stores your credentials securely. The Main Window opens immediately.

Option B — Offline Mode

  1. Launch MaximumTrainer.
  2. On the login screen, click Continue Offline.
  3. The Main Window opens. All core features — ERG control, sensor recording, and workout playback from your local library — work without an internet connection. Intervals.icu calendar sync and cloud upload are not available in offline mode.
Tip: You only need to authorise once. Maximum Trainer stores your Intervals.icu credentials securely in your operating system's keychain (Windows Credential Manager, macOS Keychain, or the Linux Secret Service). On subsequent launches the app opens directly to the Main Window without requiring a second authorisation.

👤 User Profile & FTP

Maximum Trainer uses your Functional Threshold Power (FTP) and body weight to calculate training zones and relative power (W/kg). Setting these values correctly ensures ERG targets and zone boundaries are accurate.

  1. Open Preferences → Preferences & Profile from the menu bar (or the gear icon in the toolbar).
  2. Select the User Profile tab.
  3. Enter your FTP (in watts). If you don't know your FTP, a value of 200 W is a reasonable starting point.
  4. Enter your body weight (in kg).
  5. Adjust heart rate zones if desired (default zones are percentage-based on your max HR).
  6. Click Save.
Tip: After completing a ramp test or FTP test, remember to update your FTP in the profile so that all future workout targets and difficulty adjustments scale correctly.

📡 Connecting Your Sensors

Maximum Trainer communicates with cycling hardware over Bluetooth Low Energy (BLE). Before connecting, make sure your devices are awake and within range (typically 10 m).

Waking up your devices

DeviceHow to wake it
Smart trainerStart pedalling for a few seconds
Power meterStart pedalling
Heart rate strapMoisten the electrode contacts and put it on
Speed / cadence sensorSpin the crank or wheel
Moxy muscle-oxygen sensorPress the activation button or begin exercise

Pairing sensors in the app

  1. From the main window, open Preferences → Device Connections (or the Bluetooth icon in the toolbar).
  2. Click Scan / Add Devices. The BLE scanner lists every nearby Bluetooth LE device.
  3. Select the correct BLE profile for each device from the list below.
  4. Click Connect. A green indicator confirms the sensor is active.
  5. Repeat for additional sensors. You can pair multiple devices simultaneously (e.g. an FTMS smart trainer and a heart rate strap).
Profile BLE UUID Data provided ERG control
Fitness Machine (FTMS) 0x1826 Speed · Cadence · Power ✅ Yes — automatic resistance
Cycling Power 0x1818 Power (W) · L/R Balance ❌ No
Heart Rate Monitor 0x180D Heart rate (bpm) ❌ No
Cycling Speed & Cadence 0x1816 Speed (km/h) · Cadence (rpm) ❌ No
Moxy Muscle Oxygen 0xAAB0 SmO₂ (%) · tHb (g/dL) ❌ No
Important: Select the Fitness Machine (FTMS / 0x1826) profile for your smart trainer to enable automatic ERG resistance control. Choosing a plain Power or Speed profile disables ERG.
Linux users: If the scanner returns an empty list, make sure your user account is in the bluetooth group and the BlueZ daemon is running. See the Linux Bluetooth Setup section of the README.

🎮 Simulation Mode

If you have no Bluetooth hardware available — or simply want to preview a new workout — choose Simulation in the connection dialog. The built-in simulator generates realistic, gently drifting sensor values and responds to ERG load commands, giving you a full end-to-end test of the training logic without any physical devices.

  1. When the connection method dialog appears, select Simulation instead of BTLE Device.
  2. Choose a workout and press Start.
  3. The simulator immediately begins emitting data — no hardware required.
ChannelBase valueRange
Heart rate140 bpm125–165 bpm
Cadence90 rpm80–100 rpm
Speed28 km/h23–33 km/h
Power200 W170–260 W
Good to know: The simulator responds to ERG load commands. When an interval target changes, the simulated power output adjusts accordingly — letting you verify the full workout flow before your first real ride.

🔍 Finding Workouts

Main window — workout list with structured interval plans
Main window — workout library with the Intervals.icu calendar sync in the sidebar

Option A — Intervals.icu calendar sync

Maximum Trainer integrates directly with Intervals.icu — the popular free training platform — to pull your scheduled workouts into the app.

  1. Open Preferences → Preferences & Profile and go to the Connections tab.
  2. Enter your Intervals.icu API key and Athlete ID (found at intervals.icu → Settings → API), then click Save.
  3. Click the Intervals.icu tab in the left sidebar of the main window.
  4. Use Refresh to load your planned workouts for the current week.
  5. Select a workout and click Load Selected Workout to download it to your local library.
  6. The workout appears in your library list immediately, ready to start.
Auto-upload: Enable Auto-upload to Intervals.icu in the Connections tab to have completed activities posted to Intervals.icu automatically when you save a workout. An internet connection is required for sync and upload. The WASM (browser) version operates in offline mode only and does not support Intervals.icu sync.

Option B — Browse existing library

Previously downloaded workouts are listed in the Workouts tab of the main window. Use the search/filter bar at the top to quickly find a specific session by name, duration, or workout type.

📂 Importing Workouts

If you already have workout files from another application (TrainerRoad, Zwift Companion, Intervals.icu, etc.), you can import them directly into Maximum Trainer.

Supported import formats

FormatExtensionSource applications
CyclingPeaks / TrainerRoad ERG.ergTrainerRoad, custom scripts
CyclingPeaks MRC.mrcTrainerRoad, PerfPro, various

Importing a single workout file

  1. Go to File → Import Workout in the menu bar.
  2. Navigate to your .erg or .mrc file and click Open.
  3. Maximum Trainer converts the file to its native XML format and adds it to your library.

Importing a folder of workout files

  1. Go to File → Import Course Folder.
  2. Select the folder containing your .erg / .mrc files.
  3. All compatible files in the folder are batch-imported at once.

✏️ Creating Custom Workouts

The built-in Workout Creator lets you design your own structured interval sessions — specify target power (as absolute watts or % FTP), cadence, or heart rate for every segment, add repeats, and save for immediate use.

Workout editor — build custom interval sessions
Workout Creator — designing a custom interval session with the graphical editor
  1. Click the pencil / Workout Creator icon in the toolbar (or go to File → New Workout).
  2. Enter a name, optional description, and workout type (cycling / rowing).
  3. Add intervals using the Add Interval button:
    • Set the duration (minutes:seconds).
    • Set the target — Power (W or % FTP), Cadence (rpm), or Heart Rate (bpm).
    • Choose Ramp if the power should smoothly transition from the previous segment.
  4. Use Add Repeat Block to wrap a set of intervals in a repeat loop (e.g. 4 × 4 min at 105 % FTP).
  5. Drag rows in the interval table to reorder segments.
  6. The graphical preview at the top updates in real time as you add and edit intervals.
  7. Click Save. The workout is added to your library immediately.
Tip: Click an existing workout in your library and then open the Workout Creator — it will load the selected workout for editing. Click Save as New to keep the original intact.

⚙️ ERG vs Slope Mode

Maximum Trainer supports two resistance modes when connected to a smart trainer. Understanding the difference is key to getting the most out of your sessions.

Mode How it works Best for
ERG The app continuously adjusts trainer resistance so your actual power output matches the interval target. You only need to control cadence. Structured interval workouts with power targets
Slope / Manual The app sends a constant simulated incline (grade %) to the trainer. Resistance increases naturally with speed, just like riding a hill outdoors. Free-riding, ramp tests, courses, race simulations
Note: The workout player switches to Slope mode automatically when the current interval has no power target, or when you press the Increase / Decrease Difficulty buttons to temporarily override ERG.

ERG tips

  • Maintain a smooth, consistent cadence (85–95 rpm is typical). Abrupt cadence changes cause the trainer to momentarily over- or under-correct resistance.
  • When a new interval starts, give the trainer 5–10 seconds to settle at the new target.
  • If a target feels too hard or too easy, use Adjust Difficulty (±5 % FTP per press) to scale the entire session without stopping.

▶️ The Workout Player

Active ERG workout — live power graph and real-time sensor metrics
Workout Player — real-time power graph and live sensor metrics during an active ERG session

The workout player is the central screen during a training session. It combines a real-time power graph, live sensor metrics, interval information, and playback controls all in one view.

Display elements

ElementDescription
Interval graphColoured target-power band with your live wattage overlaid as a line. Each zone has a distinct colour matching standard training zones.
Interval countdownTime remaining in the current interval, displayed prominently at the top.
Workout timeTotal elapsed time and total remaining time for the full session.
PowerLive power output in watts from your trainer or power meter.
Heart rateLive beats per minute from your HR strap, colour-coded by zone.
CadenceLive pedalling cadence in rpm.
SpeedLive speed in km/h.
L/R BalanceLeft/right power split (%) — only shown when a dual-sided power meter is connected.
SmO₂ / tHbMuscle oxygen saturation and total haemoglobin — only shown when a Moxy sensor is connected.
CaloriesEstimated kilojoules / kcal burned, calculated from power data.

🎛️ During a Workout

Starting a workout

  1. Select a workout in the main window and click Start Workout (or double-click the workout).
  2. Choose your connection method: BTLE Device (real hardware) or Simulation.
  3. The workout player opens and begins the pre-ride countdown.
  4. Start pedalling — the ERG controller begins adjusting resistance immediately.

Playback controls

ControlAction
Pause / ResumeTemporarily pauses the workout timer and sets trainer load to 0 W. Press again to resume.
Skip IntervalImmediately jumps to the next interval in the sequence.
+ DifficultyIncreases all remaining interval targets by 5 % of your FTP (stacks).
− DifficultyDecreases all remaining interval targets by 5 % of your FTP (stacks).
LapMarks a manual lap in the recorded data (useful for free-ride segments).
Stop / FinishEnds the session and opens the post-workout save screen.

Settings during a workout

Press the gear icon within the workout player to open the in-workout settings panel. From here you can adjust display options — which metrics are visible, timer size, font size — without interrupting the session.

Internet radio

Maximum Trainer includes a built-in internet radio player. Open the settings panel during a workout and navigate to the Radio tab to add a stream URL and adjust volume. Radio plays in the background alongside workout audio cues.

Video player

Desktop builds include a built-in video player (powered by Qt's QtMultimedia) so you can play a local video file (training footage, virtual rides) alongside your workout. Right-click the video area in the workout player to open a file or URL and to adjust the volume.

Reconnection: If your BLE device disconnects mid-workout (e.g. low battery), Maximum Trainer automatically attempts to reconnect every 5 seconds, up to 3 times. A notification appears while reconnecting. The workout timer continues so you don't lose data — simply wait a moment and the connection will restore.

In the browser (WASM) version, if automatic reconnection fails a Reconnect overlay appears on screen. Click the Reconnect button to trigger a new Web Bluetooth scan and re-pair your trainer.

💾 Saving Your Activity

When you press Stop / Finish (or the workout ends naturally), the post-workout screen appears.

Intervals.icu integration tab — training calendar and workout sync
Intervals.icu tab — view your training calendar, sync planned workouts, and auto-upload completed activities
  1. Review the activity summary — total time, average and normalised power, average HR, TSS, and interval breakdown.
  2. Edit the activity name if desired (defaults to the workout name + date).
  3. Click Save to write the activity as a .fit file to your configured history folder.
Where are my files? By default, activity files are saved to your system's Documents folder under MaximumTrainer / History. You can change the history folder in Preferences → Folders.

If you choose Discard instead, the raw data is deleted and no file is written. This cannot be undone.

☁️ Uploading to Strava & More

Maximum Trainer can upload completed activities directly to third-party platforms from the post-workout screen — no need to open a web browser or manually transfer files.

Supported platforms

🟠

Strava

Authenticate once via OAuth. Activities appear on your Strava feed automatically after uploading.

📊

TrainingPeaks

Link your TrainingPeaks account for seamless TSS, ATL/CTL tracking integration.

📈

SelfLoops

Upload to the SelfLoops analytics platform for advanced power and performance metrics.

📅

Intervals.icu

Sync your planned workouts and optionally auto-upload completed activities — configure in Preferences → Cloud Sync.

Linking a platform (one-time setup)

  1. Open Preferences → Preferences & Profile.
  2. Select the Connections tab.
  3. Click Connect to Strava (or TrainingPeaks / SelfLoops).
  4. A browser window opens for you to authorise Maximum Trainer. Log in and click Authorise.
  5. Return to Maximum Trainer — the platform now shows as linked with a green tick.

Uploading after a workout

  1. On the post-workout summary screen, click the Upload to Strava (or other platform) button.
  2. Maximum Trainer uploads the .fit file. A confirmation message appears when the upload completes.
Manual upload: You can also upload any saved .fit file from your activity history. Open the History tab in the main window, right-click an activity, and choose Upload.

⚙️ Settings

Open Preferences → Preferences & Profile from the menu bar to access the full settings dialog. Settings are organised into tabs.

Settings dialog — BLE sensor pairing and user profile configuration
Settings dialog — user profile, display options, sensor pairing, and third-party connections
TabWhat you can configure
User Profile FTP (W), body weight (kg), max heart rate, heart rate zones, display name
Display Which metric widgets are visible during workouts (power, HR, cadence, speed, balance, SmO₂, calories), timer style, font size
Trainer Trainer make/model and power curve calibration (for trainers without native FTMS power reporting)
Folders Workout library folder, activity history folder, course file folder
Connections Link/unlink Strava, TrainingPeaks, SelfLoops accounts; configure Intervals.icu API key, Athlete ID, and auto-upload toggle
Radio Add, edit, and reorder internet radio station URLs
Language Switch the UI language (requires a restart)
Logging Set the minimum log level (Verbose / Debug / Info / Warn / Error), enable or disable writing to a log file, choose the log file path, and open the current log file directly from the dialog. See Log Files & Troubleshooting for OS-specific default paths.

🏟️ Studio Mode

Studio Mode allows multiple riders to train simultaneously on a single installation — perfect for spinning studios and group training sessions. Each rider has their own BLE device slot and individual metrics display.

Studio mode — multiple riders training simultaneously
Studio Mode — six riders training simultaneously, each with their own metrics panel

Enabling Studio Mode

  1. Open Preferences → Preferences & Profile.
  2. On the Studio tab, toggle Enable Studio Mode.
  3. Set the number of riders (up to the maximum supported by your hardware).
  4. For each rider, configure their name, FTP, and assign a BLE device.
  5. Click Save. The main window now shows a rider panel for each participant.
Note: In Studio Mode, each rider's power data is recorded separately in the session .fit file. Workout targets are scaled per-rider based on individual FTP values.

🏆 Achievements

Maximum Trainer awards achievements automatically at the end of a workout based on your performance data. Achievements recognise milestones such as personal power records, streak completions, and training volume targets.

After saving an activity, any newly unlocked achievements are displayed on the post-workout screen. You can review all earned achievements at any time in the History tab of the main window.

Motivation tip: Achievements are evaluated against your full activity history, so every completed workout counts — even if you don't hit the power targets perfectly.

🗒️ Log Files & Troubleshooting

Maximum Trainer writes diagnostic messages to a log file whenever file logging is enabled in Preferences → Preferences & Profile → Logging. The log captures all network request errors, BLE connection events, and OAuth login steps, making it the first place to look when something goes wrong.

Enabling the log file

  1. Open Preferences → Preferences & Profile.
  2. Select the Logging tab.
  3. Tick Write log to file.
  4. Optionally change the log file path with the Browse… button.
  5. Click OK — logging starts immediately.

Use the Open log file button to open the current log in your default text editor at any time.

Default log file locations

Platform Default log file path
Windows %APPDATA%\MaximumTrainer\MaximumTrainer.log
e.g. C:\Users\YourName\AppData\Roaming\MaximumTrainer\MaximumTrainer.log
macOS ~/Library/Application Support/MaximumTrainer/MaximumTrainer.log
Hold ⌥ Option and click Go in Finder to reveal the hidden Library folder.
Linux ~/.local/share/MaximumTrainer/MaximumTrainer.log
Follows the XDG Base Directory specification. Override with the $XDG_DATA_HOME environment variable.
Tip: Set the log level to Debug or Verbose before reproducing an issue, then send the log file when reporting a bug. Reset the level back to Info afterwards to keep the file small.

Troubleshooting the Intervals.icu login page

If the Login with Intervals.icu dialog opens but shows a blank white page or an error message, the OAuth authorization page could not load. Common causes and fixes:

SymptomSolution
Blank white page Check your internet connection. The app needs to reach https://intervals.icu. If a proxy or firewall is blocking the domain, add an exception for intervals.icu and maximumtrainer.com.
"Unable to load page" error message The failed URL is shown in the dialog. Copy it and paste it into your browser to test connectivity directly. Check the log file (see paths above) for a [WARN] entry from DialogInfoWebView — it will include the exact network error string.
SSL / certificate error Ensure your system clock is correct — a wrong date/time is the most common cause of SSL failures. On Windows, open Date & Time settings and click Sync now. Check the log file for [WARN] MyQWebEnginePage entries.
Login succeeds but app stays at login screen The token exchange with the MaximumTrainer.com proxy may have failed. Enable Debug logging, reproduce the issue, and attach the log file to a GitHub issue.

💡 Tips & Shortcuts

Keyboard shortcuts

Press ? or F1 at any time during a workout to view the in-app keyboard shortcuts dialog.

Workout Player

KeyAction
SpaceStart / Pause workout
Skip to next interval
+ / =Increase difficulty +5 %
-Decrease difficulty −5 %
LManual lap
F11Toggle fullscreen
F6Radio — previous track
F7Radio — play / pause
F8Radio — next track
? / F1Show keyboard shortcuts
EscapeExit workout (with confirmation)

Main Window

KeyAction
Ctrl+,Open Preferences
Ctrl+NCreate new workout
Ctrl+QQuit application
F1Show keyboard shortcuts

Workout Creator

KeyAction
Ctrl+SSave workout
Ctrl+ZUndo last change
DeleteDelete selected interval

General tips

  • Warm up your trainer before calibrating or doing a serious workout. Most direct-drive trainers need 10–15 minutes of easy riding at 100–150 W to reach operating temperature and produce accurate power readings.
  • Use simulation mode to preview new workouts and verify that the interval structure is what you expect before committing to the real effort.
  • Adjust difficulty on the fly — if a workout is designed at 100 % FTP and you're having a bad day, knock it down by 1–2 presses (−5–10 %) rather than stopping. You'll still get a training benefit and keep the streak alive.
  • Set accurate FTP and weight. Incorrect values shift all zone boundaries and make ERG targets too easy or too hard. Update your FTP after every test or ramp test.
  • Check for updates regularly via Help → Check for Updates in the menu bar. New trainer profiles and BLE improvements are shipped frequently.

Troubleshooting

ProblemSolution
Sensor not appearing in BLE scanner Wake the device (pedal / moisten HR strap), bring it closer, and click Rescan. On Linux, ensure the bluetooth group membership and BlueZ daemon are correct.
ERG resistance not changing Ensure the trainer is connected with the FTMS (0x1826) profile, not a plain Power profile. A plain Power profile provides data but does not accept load commands.
ERG not working in browser (WASM) version The browser version sends an FTMS Request Control handshake automatically after connection. If ERG commands are still ignored, disconnect and reconnect your trainer — some trainers require a fresh GATT connection to accept the control handshake.
Power readings seem inaccurate Spin-down / calibrate the trainer from its own app, then reconnect in Maximum Trainer. If your trainer uses a built-in power curve, verify the correct model is selected in Preferences → Trainer.
App won't connect after a BLE disconnect Maximum Trainer retries automatically (up to 3 times, 5-second intervals). If reconnection fails, toggle Bluetooth off/on in your OS and click Reconnect in the notification bar.
Upload to Strava fails Re-link your Strava account in Preferences → Connections. OAuth tokens expire; re-linking refreshes them.
Need more help? Visit the Community Discussions on GitHub, or open an issue if you believe you've found a bug.

🖥️ Platform Requirements

Maximum Trainer is supported on Windows, macOS, and Linux. The BLE requirements differ slightly per operating system.

Platform Minimum OS Notes
Windows Windows 10 version 1703 (Creators Update) or later Requires a Bluetooth 4.0+ adapter with a WDM-compatible driver. Windows 7, 8, and 8.1 are not supported (missing WinRT BLE APIs). No special permissions or manifest entries are needed.
Linux Ubuntu 20.04+ / kernel 5.x+ Your user account must be in the bluetooth group: sudo usermod -aG bluetooth $USER (log out and back in to apply). The BlueZ daemon must be running: sudo systemctl enable --now bluetooth. See the Linux Bluetooth Setup section of the README for full details.
macOS macOS 10.15 (Catalina) or later On first connection, macOS will prompt for Bluetooth permission (NSBluetoothAlwaysUsageDescription). Click Allow to grant access. This permission can be reviewed in System Settings → Privacy & Security → Bluetooth. Requires a Mac with built-in Bluetooth or a BT 4.0+ adapter.
Browser (WASM) Chrome 85+ or Edge 85+ Requires the Web Bluetooth API — available in Chrome and Edge (not Firefox or Safari). The page must be served over HTTPS. BLE pairing must be triggered by a user gesture (clicking Start Workout). No local file access; activities cannot be exported to a local .fit file in the browser version.