Free, open-source indoor cycling for Android, Sailfish OS and soon iPhone

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. And every mode works on whatever your machine can be told: a trainer with ERG but no road simulation rides routes as the wattage the road asks for, and a smart bike that only takes a resistance level is held on a workout's wattage by the app.

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 like a real bike's: the change you feel is the ratio between the two gears, on the flat and on a climb. 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

Install

Android, Sailfish OS, and soon iPhone.

One shared core and a native app on each platform, free and open source on all of them.

Sailfish OS Testing

Sailfish OS 5.1 on an aarch64 phone, such as the Jolla C2.

Sailfish OS is in early development. Expect bugs and frequent updates, so install it now only if you are happy to put up with teething problems. Eventually it will be in the Jolla Store for everyone. Bug reports are welcome.

New to Harpoon? Install it, tap Add app, and paste https://codefloe.com/SnappTechnology/harbour-indoorbike

iPhone Soon

The same app, on the same shared core.

App Store

Coming soon.

Any Android

No Google Play Services. Not optional, structural.

The Android 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

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, with a native interface on each platform. 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 or smart bike 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, and so do smart bikes and spin bikes that report through FTMS alone. The app asks the machine what it can do and fills the gaps, so every ride mode works even on one that only takes a resistance level; the trainer's settings sheet says how yours is driven. 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. It is also on Google Play, for convenience only: it is the same app.

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 Sailfish OS supported?

Yes, as an early version. It runs the same shared core as the Android app, with a native Silica interface, on Sailfish OS 5.1 phones such as the Jolla C2. It is in early development: bugs are expected and updates are frequent, so install it now only if you are happy to put up with teething problems. It is installed and updated with Harpoon, from the Sailfish releases. Eventually it will be in the Jolla Store for everyone. Bug reports are welcome.

Is iOS supported?

Soon. The iPhone app runs the same Kotlin Multiplatform core as the Android and Sailfish OS apps, and its release is close.

Ready when you are.

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