A Python application that enables virtual shifting on Wahoo Kickr V5 (and older models) using Zwift Click controllers. Works with Zwift, TrainingPeaks, and other training platforms.
This app bridges the gap between Zwift Click controllers and older Kickr trainers that don't have official virtual shifting support. It listens for gear shift commands from Zwift Clicks and automatically adjusts the resistance on your Kickr V5 to simulate different gears.
- ✅ Virtual shifting with Zwift Click controllers
- ✅ Compatible with Kickr V5 (2020) and older models
- ✅ Works with Zwift
- ✅ Works with TrainingPeaks
- ✅ Customizable gear ratios
- ✅ Smooth resistance transitions
- ✅ Bluetooth LE connectivity
- ✅ Cross-platform (Windows, macOS, Linux)
- Connects to your Zwift Click controllers via Bluetooth LE
- Connects to your Wahoo Kickr V5 via Bluetooth LE
- Listens for button presses (gear shifts) from the Click controllers
- Translates gear changes into resistance adjustments
- Sends updated resistance commands to the Kickr
- Works alongside your training app (Zwift, TrainingPeaks, etc.)
- Python 3.8 or higher
- Wahoo Kickr V5 (2020) or older Kickr model
- Zwift Click controllers (or compatible Bluetooth buttons)
- Bluetooth LE adapter (built-in on most modern computers)
# Clone the repository
git clone https://github.com/dadepro/zwift-virtual-shifting.git
cd zwift-virtual-shifting
# Install dependencies
pip install -r requirements.txt# Run the application
python main.pyThe app will:
- Scan for your Zwift Click controllers
- Scan for your Kickr V5
- Start bridging gear shift commands
Edit config.json to customize:
- Gear ratios
- Resistance multipliers
- Bluetooth device names
- Shift timing and smoothness
- Start this app first
- Launch Zwift
- Connect to your Kickr as usual in Zwift
- Use Click controllers to shift gears
- The app will adjust resistance automatically
- Start this app first
- Launch TrainingPeaks
- Connect to your Kickr
- Use Click controllers during workouts
Kickr not found: Make sure your Kickr is powered on and not connected to other apps
Clicks not responding: Ensure Click controllers have fresh batteries
Resistance not changing: Check Bluetooth connections and try restarting the app
This app uses:
bleakfor Bluetooth LE communication- FTMS (Fitness Machine Service) protocol for trainer control
- Custom gear ratio calculations for smooth shifting
Inspired by the QZ app and the community's work on virtual shifting for older trainers.
MIT License - See LICENSE file for details
Contributions welcome! Please open an issue or PR.
For issues, questions, or suggestions, please open a GitHub issue.