Turfboard
Turfboard is one rider app for stock Onewheel boards and custom VESC builds, including Refloat. Connect a board to ride, tune, and diagnose it. The interface follows the board’s capabilities, with native Apple and Android apps sharing one Rust core.
- Status
- In development
- Platforms
- iPhone, Apple Watch, Android
- Core
- Rust
- Interfaces
- SwiftUI, Jetpack Compose
Ride exercising live telemetry from Turfboard’s local board simulator.
Ride, tune, fix
Ride is the dashboard: speed, battery, temperatures, range, warnings, and trip recording. Shapes is where you choose a ride mode or tune the board. Garage is for setup, lights, diagnostics, and maintenance.
Board support lives in Rust
I implemented Onewheel, VESC, and Refloat support from the wire protocol up, all in Rust. The shared core decodes board messages, sends commands, tracks capabilities and configuration, records rides, and powers a simulator.
Stock Onewheel telemetry arrives through Bluetooth notifications. Refloat answers requests, and its replies do not carry one universal request ID. Turfboard polls live fields every 100 milliseconds, serializes requests with ambiguous replies, and checks each response’s precision and field masks. A configuration reply cannot accidentally become the next speed or battery reading.
I built the Apple interface in SwiftUI and the Android interface in Jetpack Compose. Both call the same core. A protocol fix lands once; the interfaces stay native.
Tune the board that is connected
Shapes reads the connected firmware’s configuration and exposes the settings it supports. A rider can preview changes, write them to the board, and read the configuration back. The confirmed values become the displayed state, keeping a successful Bluetooth write distinct from a setting the board actually retained.
The Rust core owns that sequence as well as the configuration model. SwiftUI and Jetpack Compose present the same tuning decisions through their own native controls.
Ride data outside the app
Ride recording follows the active session as the app moves into the background. A Live Activity brings it to the Lock Screen and Dynamic Island; widgets show board state, and Apple Watch puts key telemetry on your wrist. These surfaces consume the same ride state rather than opening competing board connections.