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 deliberatelydifferent 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 — fromStrings 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. 01Recalibrate (1)Synthwave · 62 BPM · cobaltDream22:1634
  2. 02Strings Of GlassElectronic music · 68 BPM · cobaltDream33:243
  3. 03Velvet On The KnifeElectronic music · 75 BPM · cobaltDream52:117
  4. 04Dance With The DeadSynthwave · 129 BPM · twilightVeil3:4049
  5. 05Wrong TurnElectronic music · 129 BPM · twilightVeil41:5612
  6. 06To The BoneAcoustic guitar · 71 BPM · greenSprawl3:326
  7. 07Slow SummerRhythm and blues · 172 BPM · hushTrail23:4114
  8. 08Old As The DustUnclassified · 74 BPM · violetMile24:4216
  9. 09Empty Paper SkiesRock music · 167 BPM · lavenderPass4:4520
  10. 10Raven DyeRock music · 162 BPM · violetMile34:4321
  11. 11Wrong Turn (1)Electronic music · 66 BPM · cobaltDream62:1128
  12. 12Still Going StrongUkulele · 118 BPM · shallowBlue2:5129
  13. 13CrownlessHeavy metal · 112 BPM · violetMile3:1330
  14. 14We Don’t ForgetElectronic music · 132 BPM · indigoHour32:2831
  15. 15How About NowElectronic music · 66 BPM · indigoHour2:3936
  16. 16Breathe Me AwakePop music · 191 BPM · pinkDrift4:5942
  17. 17Ashes On The BayRock music · 112 BPM · duskHush5:2244
  18. 18Cold Red ClayHip hop music · 80 BPM · slateSky4:0149
  19. 19The Hall RemembersRock music · 126 BPM · slateSky36:0851
  20. 20Take The Long RoadRock music · 118 BPM · violetMile45:1252
  21. 21RecalibrateSynthwave · 62 BPM · twilightVeil32:4854
  22. 22When The Lights Were OursRock music · 136 BPM · violetMile54:3956
  23. 23Whole Night GoldDisco · 118 BPM · coralRun2:2559
  24. 24Stars TonightElectronic music · 103 BPM · indigoHour22:3461
  25. 25Breaking The WallDrum and bass · 178 BPM · hushTrail4:3462
  26. 26Burn The Jukebox DownRock music · 98 BPM · lastLight2:1767
  27. 27Mister NeonSynthwave · 136 BPM · cobaltDream2:5370
  28. 28Glad You’re FineRock music · 185 BPM · slateSky22:1075
  29. 29Neon VelocitySynthwave · 132 BPM · stillwood22:5375
  30. 30OverrideSynthwave · 140 BPM · twilightVeil22:0978
  31. 31Mirage RunSynthwave · 140 BPM · stillwood3:4479
  32. 32Ride UnbrokenHeavy metal · 140 BPM · lastLight24:5282
  33. 33Tide BounceUnclassified · 65 BPM · cobaltDream42:2993

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 isearned − 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.