# Gymnasticon: bridging proprietary exercise-bike data to standard cycling sensors

> Node.js bridge that reads power and cadence from exercise bikes whose own apps or services are gone or closed, and re-broadcasts them as standard Bluetooth LE Cycling Power and Cycling Speed and Cadence sensors and as an ANT+ bike power profile, so that Zwift, TrainerRoad, bike computers and watches can use the bike. The author's development notes describe working out the Flywheel Home Bike's stats packets on its Bluetooth UART service after the vendor shut its home service down; Peloton support reads the bike's data cable through a USB serial adapter, while the Schwinn IC4 and Keiser M clients parse the standard Fitness Machine Service and Keiser's documented broadcasts. Bike and app compatibility is project-reported.

- Type: Case study
- Targets: Protocol
- Category: Independent reconstruction cases
- Relationship: Independent reconstruction project
- Sources reviewed: 2026-10-20
- Added to the catalog: 2026-11-02
- Original resource: <https://github.com/ptx2/gymnasticon>
- Primary source: <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/README.md>
- Catalog page: <https://awesomerea.org/resources/gymnasticon-exercise-bike-bridge-case/>
- Record JSON: <https://awesomerea.org/resources/gymnasticon-exercise-bike-bridge-case/record.json>
- Chinese version: [简体中文](https://awesomerea.org/zh/resources/gymnasticon-exercise-bike-bridge-case/index.md)

## Requirements & limits

- Latest GitHub release at review: v1.4.0, published 2021-02-21 with a Raspberry Pi SD card image; npm's latest is 1.4.1 from 2021-03-24, and the reviewed main commit of 2021-04-21, which adds autodetection for all supported bikes, is still the newest on main. The README lists the Flywheel, Peloton (with an additional cable), Schwinn IC4/IC8 aka Bowflex C6 and Keiser M3i, M3i-TBT and M3iX bikes as tested and the LifeFitness IC5 as probably working; a simulated bot bike serves testing.
- Needs the user's own supported bike; no vendor app, firmware or account is used. A Raspberry Pi Zero W is recommended, and the tested hosts are Raspbian Buster on Pi Zero W, 3B+ and 4, macOS 10.14+ and Debian Buster on x86-64. BLE bikes need a Bluetooth 4.1+ adapter with multi-role support, or two adapters; ANT+ output needs an ANT+ USB stick, and Peloton bikes need the extra serial cable linked from the README.
- The SD card image is the project's own Raspbian Buster build made with pi-gen scripts in deploy/, with the default pi/raspberry account and SSH disabled; on first boot it switches the root filesystem to an overlay with a read-only boot partition and reads gymnasticon.json from the boot partition. Manual installs use Node.js 12.16.1+ from npm, with libudev-dev on Linux and cap_net_raw or a systemd unit for Bluetooth access, and depend on the abandonware noble and bleno libraries, gd-ant-plus and serialport.
- CI builds the package and runs tape unit tests on Node.js 12 and 14; they cover the Flywheel, IC4, Keiser and Peloton parsers on sample packets, the simulated bike and utilities, not live bikes or training apps. power-scale and power-offset options let riders correct bikes that report inaccurate power.
- MIT. Bike and app names belong to their owners.

## Primary sources

1. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/README.md>
2. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/CHANGELOG.md>
3. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/package.json>
4. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/src/bikes/flywheel.js>
5. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/src/bikes/peloton.js>
6. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/src/bikes/ic4.js>
7. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/src/bikes/keiser.js>
8. <https://github.com/ptx2/gymnasticon/tree/e142f539c518d6d4ced3abdd587a825b918a9367/src/test>
9. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/.github/workflows/node.js.yml>
10. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/deploy/pi-sdcard/build.sh>
11. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/deploy/pi-sdcard/config>
12. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/LICENSE.txt>
13. <https://github.com/ptx2/gymnasticon/releases/tag/v1.4.0>
14. <https://ptx2.net/posts/unbricking-a-bike-with-a-raspberry-pi>

## More in Protocols

- [garmin-ble: a Python client for Garmin's GFDI watch protocol](https://awesomerea.org/resources/garmin-ble-gfdi-protocol-case/index.md) · Case study
- [bosectl: reconstructing Bose’s BMAP headphone protocol](https://awesomerea.org/resources/bosectl-bose-bmap-protocol-case/index.md) · Case study
- [lib-osmo-ble: DJI Osmo Pocket 3 Bluetooth LE protocol library](https://awesomerea.org/resources/osmo-pocket-3-ble-protocol-case/index.md) · Case study
- [DJI MIMO BLE artifacts: reconstructing the DJI Osmo control protocol](https://awesomerea.org/resources/dji-mimo-ble-reveng-case/index.md) · Case study
- [Cat Printer BLE: reconstructing the MXW01 thermal printer protocol](https://awesomerea.org/resources/catprinterble-mxw01-printer-case/index.md) · Case study
- [a0rfid: an open driver for A0-protocol UHF RFID readers](https://awesomerea.org/resources/a0rfid-uhf-reader-protocol-case/index.md) · Case study

## About this entry

The description was reviewed against primary sources.
Original editorial content: MIT. Linked projects, papers and assets retain their own rights and licenses.
