Repository navigation
USE AT YOUR OWN RISK. VeloLauncher / FreeWheel is an unofficial community project, not affiliated with or endorsed by Bowflex, Nautilus, or JRNY. The maintainer no longer owns a Velocore bike, so this release has NOT been tested on real hardware — it is built and unit-tested in CI only. Modifying your bike may void your warranty and could leave it in a state that requires a factory reset. Provided AS IS, without warranty of any kind.
Upgrading from v1.4.0 or older: reinstall with the FreeWheel installer
VeloLauncher is now signed with the same platform certificate as SerialBridge (SHA-256 2d370c21f5dfd553d2a796314b70925fb38adeef90864c920bbbbb12887d3522, see keys/platform.x509.pem). Earlier launcher releases were signed with a different, randomly generated key on every build, so Android will not install v1.5.0 over them in place.
- In-app update from v1.4.0 will not work. v1.4.0 also never detected these release assets as updates, so it will keep reporting "up to date".
- Run FreeWheel installer v2.1.0 or newer on your PC and click Jailbreak/Update. It handles the one-time reinstall.
- From v1.5.0 on, the signing key stays the same, so later in-app updates can install in place. If the key ever doesn't match, the launcher now tells you to use the installer instead of failing with a generic "App not installed".
Ride fixes
- Media rides (ride overlay): no longer stuck on the countdown screen (#5), the ride summary now shows when you return to VeloLauncher (#6), and the pause screen no longer stays on screen after stopping (#7). Thanks to @j26765883-lab for reporting these and for the fixes in #8, which this work builds on.
- A media ride is now saved once. Previously a ride ended from the overlay could be logged twice. A ride shorter than 1 minute ended from the overlay ("NOT TRACKED") is no longer saved.
- Choosing "Keep Riding" in the short-ride dialog no longer closes the overlay.
- "Start with media" now checks the "Display over other apps" permission (#3, a softer take on #4/#8). If it is missing, a dialog offers to open the settings screen (or shows the
adb shell appops set ... SYSTEM_ALERT_WINDOW allowcommand if that screen doesn't exist) or to continue without the overlay. Stats-only rides are never blocked. - If the bike sensors can't be started, the ride still starts and a "Could not start sensors: " message explains why the numbers stay at zero.
Bike link status and diagnostics
- "Connected" now means data is actually arriving from the bike, not just that SerialBridge is running. Settings > Services shows "Service responding" plus the link state, and the ride screen and overlay only show connected when bike frames are arriving.
- Settings > Diagnostics shows the link state, firmware state, serial port and baud, byte/frame/CRC counters, time since the last frame, and any other process holding the serial port. A "Test sensors (30s)" button reports whether sensor data arrives. The raw frame monitor's RX/TX labels were swapped and are fixed.
- SerialBridge logs a
DIAGline every 5 seconds (logcat tagSerialBridge) with serial port state, bytes and frames received, CRC errors, firmware state, and any other process holding the serial device. This helps diagnose "no connection to bike sensors" (freewheel#3). The FreeWheel installer v2.1.0 can collect it. - If a stock
com.nautilus.*process is holding the serial port while the port is open and no valid frames have arrived for 30 seconds, SerialBridge stops it. It never does this right after starting or while frames are arriving. Other processes are only reported. - The serial device and baud rate can be overridden with
settings put global freewheel_serial_dev/freewheel_serial_baud(defaults/dev/ttyS4and 230400). - If the bike's firmware is not in a streaming state when a ride starts, SerialBridge logs a warning. The commands it sends to the bike are unchanged from v1.4.0. As an untested opt-in,
settings put global freewheel_defer_streaming 1makes it re-send the same sensor-streaming request once the firmware reaches workout mode. - On shutdown, SerialBridge stops an active workout, closes the serial port and logs it.
Self-heal
- Self-heal moved from VeloLauncher into SerialBridge, which runs as the system user (the launcher's own attempts silently failed). At boot and whenever VeloLauncher is installed or updated, SerialBridge re-enables Google Play services / Services Framework (GMS/GSF) if something disabled them (disabling them broke WiFi and Bluetooth), and restores VeloLauncher's "Display over other apps" permission. It never disables anything.
- The OTA network block now skips system uids.
CI and build
- Release APKs are platform-signed in CI and checked against the committed public certificate.
- Unit tests run in CI. Removed the stale Windows installer job (the installer now lives in ril3y/freewheel).
What's Changed
- v1.5.0: fix media-ride overlay bugs, sensor diagnostics, stable signing, disclaimers by @ril3y in #9
Full Changelog: v1.4.0...v1.5.0