Noureddine RAMDI / Auuki: a browser-based indoor cycling app using Web Bluetooth and .FIT recording

Created Sat, 23 May 2026 20:41:14 +0000 Modified Sat, 23 May 2026 20:41:27 +0000

dvmarinoff/Auuki

Auuki offers a unique take on structured indoor cycling workouts by running entirely in the browser as a progressive web app (PWA). It uses the Web Bluetooth API to connect directly to smart trainers and sensors without any native app installation or backend dependencies. This approach is fairly unusual — controlling cycling trainers over BLE from a web environment with ERG mode and grade simulation is a challenging technical feat.

What Auuki does and its architecture

Auuki is a browser-based PWA designed for indoor cycling enthusiasts who want to run structured workouts with smart trainer control. It supports connecting to smart trainers and sensors via the Web Bluetooth API using the FTMS (Fitness Machine Service) and FE-C (Fitness Equipment Control) protocols over BLE. This enables key workout modes like ERG mode, where the trainer automatically adjusts resistance to hit target power, as well as grade simulation.

The app can load Zwift .ZWO workout files, a widely used XML format for structured cycling workouts. It also records completed workout data in industry-standard .FIT files, including native RR interval data, which is valuable for advanced heart rate variability analysis.

One interesting architectural aspect is that Auuki keeps all user data on the device, with no backend storage, enhancing privacy and reducing dependencies. Integration with popular cycling platforms Intervals.icu and Strava is built-in, allowing seamless workout upload once the session is complete.

Under the hood, Auuki is built entirely with web technologies — JavaScript, HTML, and CSS — and leverages modern browser APIs. The Web Bluetooth API is central to its device communication, which is still a relatively niche but powerful browser feature.

The repo also mentions a suite of native Apple platform apps (iOS, iPadOS, tvOS, watchOS) in development, but the core experience currently revolves around the PWA.

Technical strengths and design tradeoffs

Auuki’s standout technical strength is its use of the Web Bluetooth API to directly communicate with smart cycling trainers and sensors. This opens up a zero-install, zero-dependency user experience running fully in-browser, which is rare among cycling software.

Implementing FTMS and FE-C protocols over BLE in JavaScript requires careful handling of asynchronous device interactions, protocol parsing, and real-time state updates. Supporting ERG mode and grade simulation means the app must send control commands reliably and respond to trainer state changes efficiently.

Recording workout data in the .FIT format with native RR intervals is another technically notable feature. The .FIT file format is complex and widely used in the fitness industry, so correctly generating these files client-side and including precise RR timing data adds significant value.

The choice to keep all data local on the device trades off convenience for privacy and simplicity. There’s no cloud storage, so users retain control over their data, but this also means syncing requires explicit upload to services like Intervals.icu or Strava.

On the flip side, relying on the Web Bluetooth API comes with limitations. Browser support for BLE is uneven, with the best support currently in Chromium-based browsers and some mobile platforms. This restricts the user base somewhat and requires users to run the app in compatible environments.

Building a PWA means the app cannot access some lower-level device features or background execution capabilities that native apps enjoy. Responsiveness and stability depend on the browser and device performance.

The repo’s architecture, using purely web tech and no native code, keeps the footprint small and development relatively straightforward, but some advanced trainer features might be harder to implement or optimize compared to native apps.

Explore the project

The repo’s README and documentation provide an overview of the supported devices, protocols, and workout file formats. Since there are no explicit installation or quickstart commands, the best way to try Auuki is to visit its hosted PWA URL (typically linked in the README or project homepage) using a compatible Chromium-based browser with Bluetooth enabled.

Developers interested in the codebase can explore the JavaScript source focusing on the modules handling BLE communication, workout parsing (.ZWO), and .FIT file generation. The integration with Intervals.icu and Strava appears to be handled client-side through their respective APIs.

Key resources in the repo include documentation on supported trainer models and Bluetooth characteristics, which are crucial to understanding how the app controls resistance and captures workout data.

Verdict

Auuki is a practical solution for indoor cycling enthusiasts who want a no-install, privacy-conscious workout app that runs fully in the browser. It handles structured workouts with smart trainer control via Web Bluetooth, supports standard workout files, and records detailed workout metrics in industry-standard formats.

Its main limitations stem from browser BLE support and the inherent constraints of a PWA versus native apps. Users on non-Chromium browsers or platforms with limited Web Bluetooth support might face issues.

For developers, Auuki is an interesting example of pushing web technologies to interface with physical fitness hardware in real-time, showing how far the Web Bluetooth API can be taken in a demanding use case.

Overall, Auuki is worth exploring if you value zero-install convenience, privacy, and open web standards in your indoor cycling workflow.


→ GitHub Repo: dvmarinoff/Auuki ⭐ 878 · JavaScript