About this project
WattRoom is an open-source, self-hostable platform for collaborative indoor cycling, built by Natron and released under AGPL-3.0. Its stated premise is that indoor training is boring alone, and instead of offering a virtual world it leans on presence: riders join a room with their training partners, ride the same workout scaled to each rider's own FTP, and can talk, see each other and share music while they ride.
What it covers
- Rooms: live watts, heart rate and cadence shown together on one dashboard, with a room feed and interval timeline, and voice and camera one tap away.
- Structured workouts: a curated library plus an editor, with precise ERG control over BLE FTMS smart trainers. Targets scale to each rider's FTP, so a crew can ride one session together whatever their numbers are.
- Game modes: seven of them, including sprint klaxons, eliminations, Watt Golf and Backyard Ramp.
- Shared jukebox: one synchronized YouTube soundtrack per room.
- Rides that count: sessions are saved, can be exported as .fit, uploaded to Strava, and earn XP and trophies.
- Privacy: metrics are room-scoped and audio/video is never recorded; rooms are private by default.
Hardware and browsers
A smart trainer speaking BLE FTMS is the target hardware, talked to directly from the browser via Web Bluetooth. That makes the training path Chromium-only today: Chrome and Edge on desktop and Android. Pre-FTMS Wahoo units are listed as an open backlog item. There is no iOS training path, because Safari does not implement Web Bluetooth; the project documents this as a researched decision rather than an oversight. The room itself still opens in any browser, with the affordances that need a trainer gated off instead of a separate read-only page. For development no trainer is required: a simulated trainer and a full mock room at /dev/room are provided.
Stack and deployment
A Go server with an in-memory room hub (one goroutine per room), a SvelteKit single-page app, PostgreSQL and self-hosted LiveKit, shipped as a single binary with an embedded frontend and deployed as one compose stack on a single VM. Development requires Go 1.26+, Node 22+, pnpm and Docker; make targets bring up Postgres and LiveKit in containers, run the hot-reloading server on port 8080, and start the Vite dev server on port 5174 which proxies /api and /ws.
Documentation and releases
Architecture and spec documents sit alongside a founding document that records product and architecture decisions, a research document, and numbered ADRs. Releases are cut several times a day: a release only ever adds a small, already-merged change, and rolling one back means repointing the running image at the previous tag without touching the database.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.