Virtual Shifting (VS) for older Tacx Smart trainers using the LilyGo T-Dongle-S3 and the Tacx-Virtual-Shifting library.
Tacx-Dongle-VS is a self-contained dongle that bridges Zwift’s Virtual Shifting system with older Tacx Smart trainers that never received Garmin’s 2025 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 Tacx trainers implement this natively; older ones cannot — unless a small bridge device translates between Zwift’s BLE protocol and Tacx’s ANT+ FE-C control channel.
The Tacx-Virtual-Shifting Arduino library:
- connects to Zwift via BLE (as a Smart Trainer peripheral)
- connects to a Tacx trainer via ANT+ FE-C
- interprets Zwift’s virtual-gear, target-power, or gradient messages
- sends equivalent ANT+ commands to the older Tacx trainer
The Tacx-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 Tacx VS.
For pricing (in the EU) see for example: TinyTronics
The dongle receives Zwift VS events via BLE, translates them using the Tacx-Virtual-Shifting library, and re-emits trainer-compatible ANT+ commands — effectively adding VS to older hardware.
| Library | Purpose | Source |
|---|---|---|
| Tacx-Virtual-Shifting | BLE ↔ ANT+ 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
Tacx-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
Tacx-Dongle-Virtual-Shifting.inosketch and upload. -
On boot you’ll see:
- a splash screen,
- Tacx 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 Tacx |
| 🟠 Led only | Advertising for Zwift |
Tacx-Dongle-VS shows splash screen (during 3 seconds) and starts scanning (for Tacx trainer), device status Led is turquoise blinking!
Tacx-Dongle-VS shows (after 10 seconds) a scanning-timeout, device status Led is red blinking. Finally it keeps scanning (for Tacx trainer) and starts also 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.








