RowPlay
Games you play on a rowing machine: race a glowing ghost of your best row across a 3D lake, hop lily pads with stroke power, battle bosses that call interval challenges, row a Viking longship to a drummer's beat, outrow a horde through a flooded city, fly a cave shooter, or gallop a unicorn through the clouds. The rower's own tablet runs them with nothing else attached.

Problem
A connected rower's workouts all have the same shape: hold a pace and watch a number. Rowing is rhythmic, repetitive and hard, which is exactly the kind of input an arcade game can ride, but the rower's tablet only runs the maker's app.
Approach
- 01
Read the rower directly. The sensor speaks the published WaterRower S4 USB protocol: stroke start and end, plus paddle pulses about forty times a second. Pulses per second become effort, and effort becomes lift and speed.
- 02
Design for a body that is working. Hands never leave the handle, so rowing is the only controller: pull harder to climb, ease off to sink, every stroke fires a burst, and pulling above your hover effort keeps the guns hot. Stop rowing and the game waits.
- 03
Race yourself. Ghost Race turns the rower's own reported boat speed into a 3D single scull on a sunset lake, animated stroke by stroke from the real catch and finish timing. Every best row is saved and comes back as a glowing ghost to beat.
- 04
Fit the game to the player. Ten warm-up strokes measure effort and pick Easy, Medium or Hard. Each level is a set of values for speed, gravity, drag, enemy density and boss toughness, tuned live with sliders mid-row.
- 05
Ship it as a website. The games live at rowplay.net and update without installs. Chrome on the rower's tablet cannot take the sensor from Android's serial driver, so a small Android app opens the site full screen and stands in for WebUSB; the same games run unchanged in either.
Architecture
Rower sensor (USB serial) → a thin Android app that claims the device and hands it to the page as WebUSB → games on rowplay.net read strokes and pulses. In desktop Chrome the same games talk WebUSB directly.
Built with
- Three.js / WebGL
- Canvas 2D
- Web Audio
- WebUSB
- Android WebView
- Vercel
Outcome
Live at rowplay.net with seven games: Ghost Race, a 3D race against your own best row with real-time water, sky and bloom; Stroke Hopper, where each stroke's power sets how far you hop; Boss Rush, five bosses that call rate, power and steady-stroke challenges; Beat Row, a rhythm game with live-generated music and a Fjord Voyage mode that rows a longship through calm water, narrows and a storm; Horde Escape, a night chase through a flooded city that paces itself off your speed; Unicorn Sky, a gentle cloud-hopping game for young riders; and Cave Flyer, an 80s-style cave shooter with a boss every stage, with the original kept as a Classic mode. Playing on a real rower with no computer attached, and on a phone held sideways for anyone without one.
Decisions
A website plus a thin app over a full native game
because games update the moment they deploy; the app only bridges the sensor and rarely changes.
Effort from paddle pulses over counting strokes
because a stroke every two seconds is too slow to steer with; pulses give a continuous signal the ship can follow.
A warm-up that picks the level over a difficulty menu
because the player is already on the handle, and ten strokes say more about their pace than a guess on a screen.
Ziggurat
A habit tracker where every check-in lays a stone. A week of habits becomes a course, courses raise a ziggurat, and everything you finish takes a plot in a city that never resets.