Free, open-source indoor cycling for Android

Your smart trainer.
Your phone.
Nothing in between.

Ride structured workouts, real-world routes, or just ride. Workouts and routes come from repositories that riders maintain, and the app itself asks for nothing: no account, no subscription, no Google.

  • Free forever
  • No account
  • No Google services
  • GPLv3

Three ways to ride

Pick the kind of ride. The trainer does the rest.

Every ride connects to your trainer over standard Bluetooth (FTMS), saves to your phone as a file, and counts towards your streaks and rider level.

Workout

Structured intervals in ERG mode. The app drives the trainer to each step's wattage against your FTP; you hold the cadence. Sweet Spot, Threshold, VO2, or anything you build.

Route

A real GPX road in simulation mode. The trainer sets resistance from the gradient, your watts set your speed, and virtual gears shift without touching the bike. Map, elevation profile and live gradient on the HUD.

Just ride

No plan. Start at 40% of your FTP, dial the power up or down with the buttons or a Zwift Click, stop when you're done. Saved and counted like any other ride.

Community repositories

Workouts and routes, maintained by riders. Not by us.

There is no central catalogue to gatekeep. A repository is a folder of plain JSON files and a small manifest.json, hosted on any HTTPS web space: Codeberg, GitHub Pages, your own site. Coaches publish plans, clubs share their winter block, tinkerers curate the intervals they swear by.

In the app you browse a repository, keep the workouts and routes you want, and each one becomes a local file on your phone. Follow a repository and the home screen tells you when it publishes something new.

Maintainerpublishes JSON
Any web hostmanifest.json
Your phonelocal copy, yours

In the registry today

  • Loading the registry…

Editor & tools

Build in the browser. Beam it to the phone.

Both tools run on this site with no install and no sign-up. What you make travels to the app as a QR code or a URL; no cloud sits in between.

Workout editor

Draw intervals, scan, ride.

Durations, %FTP and repeat groups as coloured blocks. Tap “Send to phone” and scan from the app. Tools can also open the editor pre-loaded with one URL, no API key required.

Open the editor

Route tool

Drop a GPX. Copy the JSON.

Turn any GPX track into a route the app can ride, ready to add to your own repository or send straight to your phone.

Open the route tool

Any Android

No Google Play Services. Not optional, structural.

The app uses standard Android Bluetooth APIs and nothing proprietary: no Firebase, no crash reporters, no analytics. So it runs on phones that have no Google on them at all.

  • Murena /e/OS
  • GrapheneOS
  • Huawei and other GApps-free phones
  • Stock Android, of course

Install

Three ways to get it.

New to ObtainX? Install it, tap Add App, and paste https://codefloe.com/SnappTechnology/IndoorCyclingApp

The deal

Free. No asterisk.

No price, no premium tier, no ads, no trial. Everything you record stays on your phone unless you choose to send it somewhere: Intervals.icu and FitTrackee sync exist, off by default. Even this page loads no third-party resources.

Privacy policy
  • Local-first. FTP, weight, devices and every ride are files on your phone. FIT and TCX export any time.
  • No account. Fully functional offline with zero sign-up.
  • Open source, GPLv3. Kotlin Multiplatform core, Jetpack Compose UI. Read it, fork it, build it.
  • Open formats. Workouts and routes are readable JSON you can edit by hand.

Questions

Good to know.

Which trainers work?

Any smart trainer that speaks the standard Bluetooth LE FTMS profile. The Wahoo Kickr Core is the first-class target; Tacx, Saris, Elite and other FTMS trainers should work. Heart-rate straps and the Zwift Click v1 pair the same way.

Do I need an account or Google Play?

No. The app is fully functional offline with no sign-up, and it uses no Google Play Services, so it runs on /e/OS, GrapheneOS and other de-Googled phones. A Play Store listing is coming for convenience only.

Where do workouts and routes come from?

From community repositories: static JSON files a maintainer hosts anywhere. Browse the in-app registry, paste a manifest URL, scan a QR from the editor, or import a file. Everything you add becomes a local copy.

How do I publish my own repository?

Write a small manifest.json pointing at your workout and route files and host both on any HTTPS web space. Riders add it by URL or QR; open a pull request to appear in the registry. The publishing guide walks through it.

Can my tool integrate with Indoor Bike?

Yes. Encode a workout in an editor URL and show it to your user. No registration, no keys, no server calls. See the Editor API quick start and the machine-readable llms.txt.

Can my game drive the trainer?

Yes. Your program decides what road the rider is on and the phone decides what that road feels like, over a WebSocket on the local network. No account, no SDK, and nothing to sign up for. There is a packaged skill for building one with a coding agent. See the Companion API.

Is iOS supported?

Not yet. The shared core is Kotlin Multiplatform, so a port is planned once the Android release is polished.

Ready when you are.

Install, set your FTP and weight, pair the trainer, ride. About a minute, no sign-up screens.