Type
Case study
Timeframe
1 week of logic + 3 days of build
Toolkit
Claude · Lovable · Three.js · Tone.js
Year
2026
Problem
Training in a heart rate zone works, but it asks runners to do something unnatural: check a number on their wrist, in the middle of an effort, and translate it into a decision. Voice coaches solve this by talking over the music. Music apps go the other way: they match the tempo to your pace and stop there. The music follows the body. It never helps it.
Solution
Ritmo turns the music into the coach. Your steps set the tempo, so the beat stays locked to your stride. Your heart sets the direction: when it drifts out of the target zone, the tempo moves by 2%, below the threshold most people notice. Follow the beat and you drift back into your zone, without a single word or number to manage. On screen, one object tells you where you are: a planet eclipsing a light, readable from the corner of your eye.
Role: Product Designer, self-initiated solo project. Positioning, adaptation logic, state machine, sensory charter, interface and motion design, copy, build with AI, testing and deployment.

Context
Ritmo was first the name of a fitness app I designed as a study project at Ironhack. That project later pivoted into something else, and I kept the name for this one. It fits better here: the rhythm of the heart and the rhythm of the music.
The market review set the direction. Weav Run, RockMyRun and Endel all make mirror music: the tempo follows the runner. None of them uses the music to steer the effort.
The project statement: invert the direction of control. The music guides the body toward its target zone, instead of following it.
Role of the music. Mirror apps: follows the runner. Ritmo: guides the runner.
Heart rate. Mirror apps: drives the tempo, with a delay. Ritmo: drives the direction, through the gap to the zone.
Early signal. Mirror apps: none. Ritmo: heart rate slope, to act before the zone exit.
Coaching. Mirror apps: voice, or nothing. Ritmo: the tempo itself.
A deliberately narrow scope
One session, one zone. A five-minute test session, walking or running, with one target zone. Going deep on one loop mattered more than covering training plans.
No voice, no beep. The music is the interface. Everything else stays silent unless the state changes.
Real steps, simulated heart. Cadence comes from the phone's accelerometer. Heart rate is simulated from your steps, because a continuous heart rate stream from the Apple Watch requires a native watchOS workout session. The prototype says so openly.
No streaming catalog. Tempo cannot be stretched on protected streaming tracks. The music is generated live, which is also what makes it steerable.
Three decisions
1. Two loops, two jobs
The problem. Heart rate lags behind effort by several seconds. Cadence changes the moment you change pace. A system that lets heart rate drive the tempo directly is always late, and one that reacts to every heartbeat is nervous.
The call. Two loops with separate jobs. The fast loop locks the tempo to your cadence, one beat per step. The slow loop reads your heart rate and, more importantly, its slope. A state machine with five states (under zone, in zone, drifting up, over zone, safety) decides the direction, then nudges the tempo up or down.
The rules. A 5 bpm hysteresis and a 5 second minimum hold prevent the music from switching back and forth. Safety overrides everything: it triggers with no delay, and its limit never moves.

The result. Before any screen existed, I validated the logic in a simulation harness across 8 scenarios: zero false alerts for a steady walker, safety triggered on a sprint. That harness also caught what intuition missed: the drift alert fired 71% of the time at rest in the first version, and my own demo scenario was physically impossible, since the simulated heart could never return to the zone at that effort level.
2. A nudge you follow without hearing it
The problem. My first nudge was ±3%. It felt like a reasonable number. It was a guess.
The call. I checked the research on how runners synchronise with music. Small, unnoticed tempo shifts do change the cadence of amateur runners without any instruction, but synchronisation drops clearly beyond 2.5% (Van Dyck et al., 2015). Slowing a runner down also works better than speeding one up (Buhmann et al., 2018). I moved the nudge to ±2%. Both studies also start by measuring each runner's comfortable cadence, which confirmed the 40 second calibration at the start of every session.
You keep control. If you resist the music for 40 seconds, Ritmo stops insisting and offers to keep your current pace. The zone resets around your effort, within a fixed safety limit. A coach that never lets go becomes a coach you switch off.
The tension I kept. The onboarding tells users to match their steps to the beat. It makes the effect stronger, but less invisible. That is a design trade-off, and I chose it on purpose for a five-minute test.
3. A screen you read from the corner of your eye
The problem. The first screen showed state colours, numbers and labels. When I tested it myself on an iPhone, my reaction was: "I'm watching a demo." Too much information, nothing to feel.
The call. One object. A dark planet moves in front of a fixed light: left when you are under the zone, a total eclipse when you are in it, right when you are above. The light carries the state, the planet carries the effort. The heart rate is engraved into the planet's surface, with a thin line of sunlight at the bottom of the digits. One sentence explains why the music changed ("You're speeding up: the music follows your steps"). A thin intensity thread at the bottom draws the session as it goes and doubles as a timer.
The palette. A first version used too many colours. I rebuilt the palette from a sunrise sky: deep blue below the zone, moon blue inside it, then yellow, orange and dusk red above. No green. Each colour keeps its meaning everywhere, from the planet to the end-of-session chart.
One interface. The phone and the watch share the same composition. I designed for the watch first, because that is where a runner actually looks.

A sensory charter
Every state speaks three languages at once: light, sound and vibration.
One curve for sound and light. Both transition over the same 2.4 seconds, so what you see and what you hear never disagree.
Vibration only speaks when the state changes. In the zone, it stays silent.
The harder you push, the leaner the music. Layers are removed before anything is added.
The planet stays rigid. Only the light beats, on the kick. A pulsing shape read as anxiety.
One honest limit: Apple has closed web access to vibration on iPhone. The patterns are documented in the prototype, playable on Android, and specified for the watch.
Music with a style, one beat per step
Runners don't all want the same music. Ritmo offers three generated styles: electro, hip-hop and pop-rock. The real constraint was not generation but the ratio between steps and beats. At running cadence, house music at 166 bpm stops sounding like house.
Electro. Walking (100 to 120 steps/min): house, one beat per step. Running (150 to 180 steps/min): drum and bass, one beat per step.
Hip-hop. Walking (100 to 120 steps/min): boom bap, one beat per step. Running (150 to 180 steps/min): half time, one beat for two steps.
Pop-rock. Walking (100 to 120 steps/min): pop, one beat per step. Running (150 to 180 steps/min): half time, one beat for two steps.
The first pop-rock track sounded cheap. I replaced it with an original composition inspired by 80s synth pop, and added a fade-in during the countdown so the session starts with the music already breathing.
Method
From a dashboard to a loop you feel. The first prototype, built on Lovable in August, was a telemetry dashboard: sliders for effort and cadence, four stems, live graphs. It proved the logic, but nobody runs while watching a dashboard. The pivot came from testing it on my own phone: the steps had to drive the experience.

AI as a build partner. Claude wrote and tested the code with me, in long autonomous loops: build, run the tests, fix, repeat. I kept the product decisions. Ten versions in three days, each one triggered by a test, a piece of research or a self-review.
Bugs became decisions. Twelve bugs were found and fixed by the tests. Three of them shaped the product:
The music froze after 40 seconds of stable tempo, because of an exponential ramp between two almost identical values in the audio clock. Ramps are now linear, with a minimum step.
The heart rate slope reached 149,000 bpm per minute in one test, calculated on a time step assumed to be regular. It now uses real timestamps and a fixed 250 ms step.
Engraving the digits took 226 ms per new number, enough to make the screen stutter. Digits are now engraved once and assembled: 0.34 ms.
Early feedback. An engineer who runs tested it and raised a real gap: holding a tempo is hard to plan on a long run. Session types (5K intervals, long run) are the next step, announced as "coming soon" in the prototype.
How I would measure it
Hypothesis: a ±2% tempo nudge, without voice or instructions, should increase time spent in the target zone.
Test: a pilot with 10 runners, each running the same session with and without Ritmo. Primary metric: time in the target zone. Secondary signals: cadence stability, perceived effort (RPE), and whether runners come back for a second session.
Already in the prototype: a five-question survey at the end of each session (perceived effort, whether the music helped, whether the changes were understood, whether the slowdown was noticed, one open question), plus a local session history.
Limitations
This is a design exploration, not a product. The heart is simulated: one percent more cadence adds about 2 bpm, which is far simpler than a real heart that drifts with fatigue and heat. The demo compresses time: the slow loop decides continuously and the slope uses a 12 second window, against 15 to 30 seconds and 60 seconds in the target logic. The music is synthesised, credible for five minutes, far from a real production; produced stems per style would be the next step. And nothing proves yet that Ritmo improves performance: it guides pace, and the research supports that, but a training gain has to be measured over weeks.
A real app would also require native code: a watchOS workout session for continuous heart rate, the watch's haptic engine for vibrations, and background audio with the screen locked.
Result
A live, playable prototype on a single web page: real step detection, a two-loop adaptation engine, a five-state machine, three generated music styles, a sensory charter, an Apple Watch preview, and an end-of-session survey. No account, no install. A "How it works" screen separates what is real, what is simulated and what will require native code. The visual direction openly credits the Not Boring apps (Weather, Graphite skin) as its inspiration.
Try the demo: ritmo.ibnoudiop.com
Sources
Van Dyck et al., Spontaneous Entrainment of Running Cadence to Music Tempo, Sports Medicine Open, 2015. https://link.springer.com/article/10.1186/s40798-015-0025-9
Buhmann et al., Optimizing beat synchronized running to music, PLOS ONE, 2018. https://journals.plos.org/plosone/article?id=10.1371%2Fjournal.pone.0208702


