BLE smart trainer
Standard FTMS over Bluetooth LE. Pair your Wahoo Kickr Core or any FTMS-compatible trainer. No vendor SDK, no Google Play Services.
Indoor cycling · Android · Open source
Structured ERG workouts for your smart trainer, defined as plain JSON, ridden against your FTP, and saved to your phone. No subscriptions, no accounts, no cloud required.
What's inside
Every screen is designed for arm's-length legibility on a sweaty phone. Telemetry first, decoration last.
Standard FTMS over Bluetooth LE. Pair your Wahoo Kickr Core or any FTMS-compatible trainer. No vendor SDK, no Google Play Services.
The app drives your trainer to hit each interval's target wattage automatically. You hold the cadence, it holds the watts.
Z1 recovery through Z7 neuromuscular, calibrated as percentages of your FTP. Visualised on every workout, every interval, every chart.
Every workout is a readable JSON file. Use the bundled library, drop in your own, hand-craft them in a text editor, or build them visually with the workout editor.
Pair a Zwift Click v1 controller to nudge target power up or down mid-interval. On-screen +/- buttons work too. Your handlebar, your call.
Rides, FTP, weight, paired devices: all on your phone. No telemetry leaves the device. Optional sync is opt-in and lazily loaded.
Workout library
Sweet Spot, Threshold, VO2. The same intervals you already know from other training apps, structured against your FTP and ridden in the same colour-coded zones.
Threshold
VO2 Max
Build your own
Lay out intervals as coloured blocks in your browser, tweak the durations and percentages until the shape feels right, and send the result to your phone. No account, no upload - the workout file is yours to keep, ride, or hand around.
Open the editor →Browse community
Coaches and other riders publish packs of structured workouts that anyone can browse. Open a pack, scroll through the rides it contains, and tap to add the ones you want. Each workout becomes a local copy on your phone the moment you add it - yours to ride or edit, and not affected if the original pack changes later.
Browse community →From install to first sprint
Install the APK, pair your trainer, pick a workout, ride. No sign-up screens, no subscription paywalls, no welcome carousels.
Get the app from F-Droid (or sideload the APK from a release). Open it. The first screen asks for your FTP and weight. That's it.
Tap the trainer icon. Power on your Kickr Core, the app discovers it over BLE, and remembers it. Optionally pair a HRM and a Zwift Click.
Browse the workout library. Each card shows the zone profile, duration, TSS, and IF. Pick one that fits your session and your legs.
Hit start. ERG holds the target wattage. The HUD shows zone, power, cadence, HR, and time-in-step. The completed ride saves locally as a file.
F-Droid native
Indoor Bike was designed from day one to ship through F-Droid. That means no proprietary blobs, no Google Play Services, no analytics SDKs, no crash reporters phoning home.
Questions
Any smart trainer that speaks the standard Bluetooth LE FTMS profile. The first-class target is the Wahoo Kickr Core; other FTMS-compatible trainers should work but aren't extensively tested yet.
No. The app is fully functional offline with no sign-up. Optional Auth0 login and CleverCloud sync exist for users who want cross-device backup, but everything works without them.
The app is being prepared for F-Droid. Once published, the install link will appear here. Until then, you can build the Android project from source.
Yes. Workouts are plain JSON files describing a sequence of intervals (duration + power as % of FTP). Drop them into the workouts directory and they show up in the library, or build them visually in the browser editor and send them to the app.
Not yet. The shared core is built with Kotlin Multiplatform Mobile so an iOS port is planned, but the current focus is shipping a polished Android release first.
Standard BLE HRMs (including the Garmin HRM) pair the same way as the trainer. HR shows on the ride HUD and is recorded with the ride file.
Install with Obtainium to get the app and automatic updates straight from our Codeberg releases - no store account, no Google services. An F-Droid release is also in preparation.
New to Obtainium? Install it, tap Add App, and paste
https://codeberg.org/juhanilehtimaki/IndoorCyclingApp.