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.
-
01
2:16 34
-
02
3:24 3
-
03
2:11 7
-
04
3:40 49
-
05
1:56 12
-
06
3:32 6
-
07
3:41 14
-
08
4:42 16
-
09
4:45 20
-
10
4:43 21
-
11
2:11 28
-
12
2:51 29
-
13
3:13 30
-
14
2:28 31
-
15
2:39 36
-
16
4:59 42
-
17
5:22 44
-
18
4:01 49
-
19
6:08 51
-
20
5:12 52
-
21
2:48 54
-
22
4:39 56
-
23
2:25 59
-
24
2:34 61
-
25
4:34 62
-
26
2:17 67
-
27
2:53 70
-
28
2:10 75
-
29
2:53 75
-
30
2:09 78
-
31
3:44 79
-
32
4:52 82
-
33
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.