Train together, not alone.
Discord for indoor cycling — structured workouts your whole crew rides at once, with voice, camera, game modes and a shared jukebox. No virtual world: your watts are the game.
Architecture · Spec · Founding doc · Contributing · built by Natron
⭐ Like the idea? Star the repo — it helps other pain-cave dwellers find it.
Six riders, one timeline. Every target scales to the rider's own FTP, so the crew rides together whatever their numbers are.
Indoor training is boring alone. Zwift fixes that with a game world; WattRoom fixes it with presence — you hop into a room with your training buddies, everyone rides the same workout scaled to their own FTP, you talk, you see each other, you share music. A group ride for pain caves.
| 🚴 Rooms — live watts, HR and cadence on one dashboard, voice & camera always there | 📈 Structured workouts — curated library + editor, precise ERG control over BLE FTMS |
| 🎮 Seven game modes — sprint klaxons, eliminations, Watt Golf, Backyard Ramp, … | 🎵 Shared jukebox — one synced YouTube soundtrack per room |
🏅 Rides that count — every session saved, .fit export, Strava upload, XP & trophies |
🔒 Private by default — metrics room-scoped, AV never recorded |
| The sprint moment | The workout library |
|---|---|
![]() |
![]() |
The way in — on a desk, and on the phone that lives on the bars:
Requirements: Go 1.26+, Node 22+, pnpm, Docker.
make infra # Postgres + LiveKit (dev mode) in containers
make dev-server # terminal 1: Go server with hot reload on :8080
make dev-web # terminal 2: Vite dev server on :5174 (proxies /api + /ws)No smart trainer needed — the simulated trainer covers development, and
/dev/room is a full mock room. See CONTRIBUTING.md.
A smart trainer speaking BLE FTMS (plus Wahoo legacy), talked to directly from the browser via Web Bluetooth — which is Chromium-only: Chrome/Edge on desktop and Android. No iOS path (Safari won't implement Web Bluetooth — a researched decision, not an oversight); the read-only spectator view works in any browser.
Go server (in-memory room hub, one goroutine per room) · SvelteKit SPA · PostgreSQL · self-hosted LiveKit · single binary with embedded frontend, deployed as one compose stack on a single VM. Every product and architecture decision is recorded in WATTROOM.md and docs/decisions/; the research behind them in docs/RESEARCH.md.



