LiveSpin Spin Revolution
A rhythm game for your spin bike.
- Role
- Founder & Engineer
- Year
- 2026
Where it started
It started as BeatDrop Cycling, a way to turn YouTube playlists into AI-coached spin workouts. But every time I tested it, the part I actually looked forward to was chasing the RPM targets to the music. That was the game. So five days in, I dropped the AI coaching, renamed it Spin Spin Revolution, and built everything around that feeling: hit the right cadence at the right moment in the song and score points.
Reading the bike
Most spin bikes and cadence sensors speak a standard Bluetooth format. The sensor reports how many times the pedals have gone around and when the last turn happened, and the game works out RPM from the difference between readings. If the bike supports the fuller fitness machine format, the game uses that instead to also get power, speed, and heart rate.
The catch: Safari on iPhone doesn't support Web Bluetooth at all. So the iOS version is a native Capacitor app with a Bluetooth plugin, and the web version points iPhone riders to a browser that can connect.
Making it feel fair
Each song is a series of zones, each an RPM range timed to the music. Being within 10 RPM of a zone counts as close, the first five seconds of each zone are forgiving while you speed up or slow down, and you can drift out for two and a half seconds before your streak breaks.
Most of the tuning was about making the score match what riders see. If the curve on screen says you nailed it, the points have to agree, or the game feels like it's cheating you.
Five tries at multiplayer
Head-to-head battles were the hardest part of the whole project. Keeping two riders in sync took five different approaches in about 36 hours, from broadcasting state between players to a heartbeat, to a handshake I ended up reverting.
What finally worked was a single server acting as referee. It owns the countdown and the clock, and if you drop and reconnect, it tells your player exactly where to jump back into the song. If you're gone for a full minute, the match goes to the other rider.
Knowing what to cut
I spent about 20 commits on an Overtime power-up, including a full rewrite, and then removed it before launch. Ads were planned and never shipped. Later I moved the whole app off Supabase to my own Postgres database, which meant rewriting about 50 API routes.
💡 What I learned
When two players have to agree on what's happening, one of them can't be the boss, and neither can both. Give one server the final say, and let everyone else follow it.
I also learned to cut features that aren't earning their place, even after I've put real work into them. The game got better every time I removed something.
Highlights
- Real-time multiplayer battles refereed by a PartyKit server, with reconnect and resync
- Bluetooth Web API integration for cadence sensors
- Beat-synced RPM targets generated from community-created patterns
- Stripe subscriptions with a free tier and a pro plan
- Achievements and streaks for player progression
- Community pattern library with likes, search, and sharing
