Virtual Shifting (VS) for older KICKR Smart trainers using the LilyGo T-Dongle-S3 and the Kickr-Virtual-Shifting library.
Kickr-Dongle-VS is a self-contained dongle that bridges Zwift’s Virtual Shifting system with older KICKR Smart trainers that never received Wahoo’s 2024 firmware update.
It combines a modern ESP32-S3 microcontroller, a built-in ST7735 IPS display, a status LED and when the project code is uploaded, it delivers plug-and-ride compatibility.
Virtual Shifting lets you change gears digitally while riding indoors and using the Zwift Click device.
Instead of mechanical chain movements, Zwift adjusts resistance and power targets in software, simulating gear ratios.
Recent KICKR trainers implement this natively; older ones cannot — unless a small bridge device translates between Zwift’s BLE protocol and KICKR’s Wahoo-proprietary-CPS control channel.
The Kickr-Virtual-Shifting Arduino library:
- connects to Zwift via BLE (as a Smart Trainer peripheral)
- connects to a KICKR trainer via Wahoo-proprietary-CPS
- interprets Zwift’s virtual-gear, target-power, or gradient messages
- sends equivalent Wahoo-proprietary-CPS commands to the older KICKR trainer
The Kickr-Dongle-VS project wraps this library into a ready-to-use hardware package — the LilyGo T-Dongle-S3.
- ESP32-S3 – dual-core MCU with native BLE and plenty of flash/RAM
- Integrated display – 0.96″ ST7735 IPS panel for connection & error feedback
- APA102 LED – multicolor indicator for connection status
- USB-C – single-cable power + firmware updates
These make the smallest and most affordable all-in-one bridge for KICKR VS.
For pricing (in the EU) see for example: TinyTronics
The dongle receives Zwift VS events via BLE, translates them using the Kickr-Virtual-Shifting library, and re-emits trainer-compatible Wahoo-proprietary-CPS commands — effectively adding VS to older hardware.
| Library | Purpose | Source |
|---|---|---|
| Kickr-Virtual-Shifting | BLE ↔ Wahoo-proprietary-CPS bridge core | GitHub Repo |
| Arduino-GFX | ST7735 display driver | Arduino Library Manager |
| Adafruit_DotStar | APA102 LED control | Arduino Library Manager |
-
Clone or download this repository.
-
Unzip/copy the
Kickr-Dongle-Virtual-Shiftingfolder to your Arduino sketch folder. -
Install all required libraries (see Dependencies).
-
Select Board → ESP32S3 Dev Module.
-
Set all options in
Tools → Menuas shown below: -
Connect the dongle via USB-C.
-
Open the
Kickr-Dongle-Virtual-Shifting.inosketch and upload. -
On boot you’ll see:
- a splash screen,
- KICKR and Zwift connection rows with text + color cues,
- the APA102 LED mirroring the same connection states.
When both devices show Connected (🟢 green), you’re ready to ride!
| Color | Meaning |
|---|---|
| 🟡 Yellow | Scanning & Advertising |
| 🟢 Green | Connected |
| 🔴 Red | Connection Lost |
| 🔵 Led only | Scanning for KICKR |
| 🟠 Led only | Advertising for Zwift |
Kickr-Dongle-VS shows splash screen (during 3 seconds) and starts scanning (for KICKR trainer), device status Led is turquoise blinking!
Kickr-Dongle-VS shows (after 10 seconds) a scanning-timeout, device status Led is red blinking. Finally it keeps scanning (for KICKR trainer) or connects and starts advertising (for notifying Zwift app), device status Led is now yellow blinking!
This project is licensed under the GNU General Public License v3.0 (GPL-3.0).
You may freely use, modify, and distribute this project, provided that any derivative work is also licensed under GPL-3.0.
- OTA (Wi-Fi) firmware updates
- OLED or e-paper variant for low-power builds
- Optional web-UI configuration
This project is just starting! If you’re interested in testing, coding, writing docs, or just giving feedback, contributions are welcome in Discussions.