Playable now · web, Steam & itch

ZEN RIDE

A music-driven rider. Pick a song and the game builds the whole level out of it — the road's turns follow the downbeats, the orbs sit on the actual kick, snare, hat and melody, and every colour on screen is derived from what the track sounds like.

Started
17 Apr2026 — first commit
Commits
207over 39 working days
Code
43.5klines of TS, 202 files
Soundtrack
1:54hours across 33 tracks
Features
57extracted, 15 shipped
Riders
25unlocked with gold

The song is the level

Nothing about a track is decorative. Before you ride it, the song is analysed offline and that analysis becomes the course: downbeats and structure decide where the road turns, climbs and snaps into a hairpin; onsets decide where every collectible sits.

The orbs are split into four voices, each its own colour and each worth a different amount — kick is the heavy backbeat and scores 4, snare is the snap and scores 3, melodic is pitched content at 2, and hat is the sparkle at 1. Riding a line through a bar is reading the drum kit.

And the colours are the song too

A self-hosted classifier listens to the track and produces a genre plus a fourteen-dimension trait vector — hardness, neon, groove, organic, epic, melancholy, dreamy, retro, tropical and the rest. That vector paints everything: the grass, the canopy (a deliberately different hue from the ground), the sky dome, the time of day, the weather, and the orb accent.

The part that makes it work is that the hue arc is driven per family rather than globally:

A single shared driver collapses the gamut: this library's metal is uniformly fast (bpm useless) but varies in density; electronic varies in brightness. So the driver is per family.

The arc is continuous, never bucketed — that's what stops same-family tracks collapsing onto an identical look.

docs/trait-palette.md

Metal lands on black-violet ground under a storm sky with near-black trees and a blood-red accent. Synthwave gets neon violet fading to red, glowing magenta trees, sunset or night. Every track in the list below has its own scene name because of it — and when two land on the same pool entry the generator just walks on and suffixes a number, which is why the library contains a cobaltDream6.

The soundtrack

Thirty-three original tracks, 1 hour 54 minutes. The order is the campaign: the first five are open from the start, and every track after that unlocks when you finish the one above it on Easy. After those five starters the ladder is strictly ascending by the difficulty score the analysis pipeline bakes for each song — from Strings Of Glass at 3 to Tide Bounce at 93.

Each tile is the game's own thumbnail for that track: an SVG built from the palette the song derives, so the artwork is a miniature of the level it generates. No two are the same picture because no two songs produce the same world.

  1. 01 Recalibrate (1) Synthwave · 62 BPM · cobaltDream2 2:16 34
  2. 02 Strings Of Glass Electronic music · 68 BPM · cobaltDream3 3:24 3
  3. 03 Velvet On The Knife Electronic music · 75 BPM · cobaltDream5 2:11 7
  4. 04 Dance With The Dead Synthwave · 129 BPM · twilightVeil 3:40 49
  5. 05 Wrong Turn Electronic music · 129 BPM · twilightVeil4 1:56 12
  6. 06 To The Bone Acoustic guitar · 71 BPM · greenSprawl 3:32 6
  7. 07 Slow Summer Rhythm and blues · 172 BPM · hushTrail2 3:41 14
  8. 08 Old As The Dust Unclassified · 74 BPM · violetMile2 4:42 16
  9. 09 Empty Paper Skies Rock music · 167 BPM · lavenderPass 4:45 20
  10. 10 Raven Dye Rock music · 162 BPM · violetMile3 4:43 21
  11. 11 Wrong Turn (1) Electronic music · 66 BPM · cobaltDream6 2:11 28
  12. 12 Still Going Strong Ukulele · 118 BPM · shallowBlue 2:51 29
  13. 13 Crownless Heavy metal · 112 BPM · violetMile 3:13 30
  14. 14 We Don’t Forget Electronic music · 132 BPM · indigoHour3 2:28 31
  15. 15 How About Now Electronic music · 66 BPM · indigoHour 2:39 36
  16. 16 Breathe Me Awake Pop music · 191 BPM · pinkDrift 4:59 42
  17. 17 Ashes On The Bay Rock music · 112 BPM · duskHush 5:22 44
  18. 18 Cold Red Clay Hip hop music · 80 BPM · slateSky 4:01 49
  19. 19 The Hall Remembers Rock music · 126 BPM · slateSky3 6:08 51
  20. 20 Take The Long Road Rock music · 118 BPM · violetMile4 5:12 52
  21. 21 Recalibrate Synthwave · 62 BPM · twilightVeil3 2:48 54
  22. 22 When The Lights Were Ours Rock music · 136 BPM · violetMile5 4:39 56
  23. 23 Whole Night Gold Disco · 118 BPM · coralRun 2:25 59
  24. 24 Stars Tonight Electronic music · 103 BPM · indigoHour2 2:34 61
  25. 25 Breaking The Wall Drum and bass · 178 BPM · hushTrail 4:34 62
  26. 26 Burn The Jukebox Down Rock music · 98 BPM · lastLight 2:17 67
  27. 27 Mister Neon Synthwave · 136 BPM · cobaltDream 2:53 70
  28. 28 Glad You’re Fine Rock music · 185 BPM · slateSky2 2:10 75
  29. 29 Neon Velocity Synthwave · 132 BPM · stillwood2 2:53 75
  30. 30 Override Synthwave · 140 BPM · twilightVeil2 2:09 78
  31. 31 Mirage Run Synthwave · 140 BPM · stillwood 3:44 79
  32. 32 Ride Unbroken Heavy metal · 140 BPM · lastLight2 4:52 82
  33. 33 Tide Bounce Unclassified · 65 BPM · cobaltDream4 2:29 93

33 tracks · 1 h 54 m 🔒 unlocks in order · difficulty is baked, not authored

Or bring your own

Upload any song and it gets the same treatment — the analyser runs in the browser on the exact code path that baked the shipped library, so your track produces a real level rather than a generic one.

It is also identified by content rather than filename. The fingerprint is deliberately coarse — duration, tempo, key and mode — chosen so that only values stable across machines and decoders go into it. Rename a file and you get the same level back; upload your own copy of a song that already ships and it resolves to the same scene as the library version.

The road will not tie itself in a knot

When turns follow a song rather than a designer, a dense passage can fold the road back through itself. The steerer that prevents it starts from an observation worth the whole system:

Twistiness and self-intersection are independent: a road can turn as hard and as often as it likes and still be valid as long as no two stretches occupy the same XZ space. So this steerer is the ONLY thing that needs to scale down the road's intent — and only when it's actually about to fold.

src/game/entities/Road/music/buildScript.ts

It engages early, at a comfort radius well above the hard floor, scans headings around the full circle for maximum clearance, and blends by urgency — so the song keeps its shape right up until the geometry would actually break. How far back it looks is derived from the segment spacing rather than being a constant, which closed a blind spot where hairpins folding back about five segments went undetected.

Gold that cannot be corrupted

There is no stored balance to double-spend. Your wallet is earned − spent, recomputed by scanning your best result on every track. Because earned gold comes straight from your medals, improving a medal automatically pays you the difference, and wiping your bests cleanly zeroes the wallet. Twenty-five riders ladder from free up to 6,500.