A web app for the Yosuda rowing machine: live dashboard, guided workouts, history and export.
It connects straight to the rower over Web Bluetooth. Nothing to install, no account.
Rowlink replaces the FED Fitness app for Yosuda rowers (YOSUDA-RM-*). Open it in Chrome or Edge on Android, Windows, macOS, ChromeOS or Linux, wake the rower with a stroke, and tap Connect rower.
It also fixes the jumpy numbers other apps show. The rower's own pace and power readings swing 2× from one stroke to the next, so Rowlink works them out from the rower's distance and stroke counters instead.
Live dashboard
- Pace, time, distance, stroke rate, power, knob level and calories, sized to read from the seat
- Rolling 3-minute chart of pace and stroke rate
- Stroke-rate gauge with the target range marked, and a stroke pacer to follow (optional metronome click)
- Tiles turn green when you're on target and amber when you drift off
- Pauses by itself when you stop rowing, and reconnects by itself if Bluetooth drops
Guided workouts, hands-free
- Intervals, benchmarks (500 m, 2000 m, 20 min), steady rows, a pyramid, and 27 classes modelled on the FED app's rower classes
- A countdown and a big "Set knob to 8" prompt before each resistance change. The app assumes you made the change, so you never have to reach for the phone mid-row
- Pace targets scale to your reference pace: set it in Settings, or row a benchmark
- Copy any workout and edit it, or build your own from row and rest segments
Full screen
- One tap fills the screen with the workout and the numbers. On Android it also turns to landscape, even with rotation locked
History and export
- Every row of 20 m or more is saved in the browser, including sessions cut short by a closed tab or dead battery
- Charts of pace, stroke rate, power and knob, with the workout's target bands, plus how much of each step you spent on target
- Export to FIT (Garmin Connect, Strava), TCX, CSV or JSON. Back up and restore all history as one JSON file
Private
- Sessions, workouts and settings stay in your browser. No account, no tracking
Full screen on a phone in landscape, the way it's meant to be used on a rower mount:
Before each resistance change, a prompt counts you down to it:
Phone in portrait: the live dashboard, and the workouts list with each workout's shape and length.
A saved session, with how closely you hit each step's targets:
Screenshots use the built-in simulator, which the connect screen offers when no rower is nearby.
python3 web/serve.pyThen open http://localhost:8080/web/ in Chrome. On Linux, Web Bluetooth may need chrome://flags/#enable-web-bluetooth. No rower nearby? Use Simulator, or Replay a capture of a real session, on the connect screen.
cd web && npm install && npm test| App | web/: plain HTML/JS, no build step (details) |
| Design notes | PLAN.md: protocol findings, data pipeline, decisions |
| Recordings | captures/: raw Bluetooth sessions from the real rower, used by the tests and the Replay feature |
iOS (no Web Bluetooth in any iOS browser), Firefox and Safari.





