Do Virtual Gear Shifting (and more) in any rider app with your Zwift Play, Zwift Click, Zwift Ride or any other controller out there!
See the code
With BikeControl you can control your favorite trainer app using your Zwift Click, Zwift Ride, Zwift Play, Shimano Di2, or other similar devices. Here's what you can do with it, depending on your configuration:
You can also connect your smart trainer directly to BikeControl to:
Best follow our landing page and the "Get Started" button: bikecontrol.app to understand on which platform you want to run BikeControl. A testing period is available, allowing you to try out the full functionality of BikeControl:
(or direct download for Windows here)
Support for other devices can be added; check the issues tab here on GitHub.
Follow the "Get Started" button over at bikecontrol.app to understand on which platform you want to run BikeControl. You can even try it out in your Browser, if it supports Bluetooth connections. No controlling possible, though.
Check the troubleshooting guide here.
The app connects to your Controller devices (such as Zwift ones) automatically. BikeControl uses different methods of connecting to the trainer app, depending on the trainer app and operating system:
git clone https://github.com/OpenBikeControl/bikecontrol.git
cd bikecontrol
flutter pub get
# The localization accessors under lib/gen/ are generated, not committed.
flutter pub global activate intl_utils
flutter pub global run intl_utils:generate
flutter build apk --debug # or: flutter run
prop submodule.gitmodules references a private prop repository. You do not need it, and
git submodule update --init is expected to fail for you — leave it
uninitialised.
prop holds the trainer/controller emulator implementations, which are not
open source. If you want to have a look at it, contact me :)
The repository ships prop_public/, an API-compatible stub of the
same package, and pubspec.yaml points at it. A clone therefore builds,
analyzes and runs against the stub without any extra setup.
What that means in practice: the app launches and the UI, settings, localization and non-emulator code are all fully buildable and hackable, but the stubbed calls are inert, so trainer emulation and virtual shifting do not actually do anything in a build made this way. If you need the full implementation, get in touch.
Release APKs are signed with a key that is not in the repository. When
android/keystore.properties is absent the release build falls back to the
debug key, so flutter build apk --release works from a plain clone.
flutter test runs, except for 11 of the 297 test files which exercise the
emulator implementations themselves and import test seams from prop. Those
need the private package; the rest of the suite does not.
1,712 followers · starred Nov 2025
304 followers · starred Mar 2026
223 followers · starred Jan 2026
781 followers · starred Jan 2026
Do Virtual Gear Shifting (and more) in any rider app with your Zwift Play, Zwift Click, Zwift Ride or any other controller out there!
See the code
With BikeControl you can control your favorite trainer app using your Zwift Click, Zwift Ride, Zwift Play, Shimano Di2, or other similar devices. Here's what you can do with it, depending on your configuration:
You can also connect your smart trainer directly to BikeControl to:
Best follow our landing page and the "Get Started" button: bikecontrol.app to understand on which platform you want to run BikeControl. A testing period is available, allowing you to try out the full functionality of BikeControl:
(or direct download for Windows here)
Support for other devices can be added; check the issues tab here on GitHub.
Follow the "Get Started" button over at bikecontrol.app to understand on which platform you want to run BikeControl. You can even try it out in your Browser, if it supports Bluetooth connections. No controlling possible, though.
Check the troubleshooting guide here.
The app connects to your Controller devices (such as Zwift ones) automatically. BikeControl uses different methods of connecting to the trainer app, depending on the trainer app and operating system:
git clone https://github.com/OpenBikeControl/bikecontrol.git
cd bikecontrol
flutter pub get
# The localization accessors under lib/gen/ are generated, not committed.
flutter pub global activate intl_utils
flutter pub global run intl_utils:generate
flutter build apk --debug # or: flutter run
prop submodule.gitmodules references a private prop repository. You do not need it, and
git submodule update --init is expected to fail for you — leave it
uninitialised.
prop holds the trainer/controller emulator implementations, which are not
open source. If you want to have a look at it, contact me :)
The repository ships prop_public/, an API-compatible stub of the
same package, and pubspec.yaml points at it. A clone therefore builds,
analyzes and runs against the stub without any extra setup.
What that means in practice: the app launches and the UI, settings, localization and non-emulator code are all fully buildable and hackable, but the stubbed calls are inert, so trainer emulation and virtual shifting do not actually do anything in a build made this way. If you need the full implementation, get in touch.
Release APKs are signed with a key that is not in the repository. When
android/keystore.properties is absent the release build falls back to the
debug key, so flutter build apk --release works from a plain clone.
flutter test runs, except for 11 of the 297 test files which exercise the
emulator implementations themselves and import test seams from prop. Those
need the private package; the rest of the suite does not.
1,712 followers · starred Nov 2025
304 followers · starred Mar 2026
223 followers · starred Jan 2026
781 followers · starred Jan 2026