Source
53 TypeScript files + 1 stylesheet
One concern per directory — render, world, kart, game, fx, ui, audio, core — all coding against a single shared contract in src/types.ts.
Assets
0 binary files
A recursive search for images, meshes, audio, fonts, HDRs and data URIs across src/ and public/ returns nothing. The only extensions present are .ts, .css and .webmanifest.
Build
1.79 MB JS + 37 KB CSS
dist/ is index.html, one script, one stylesheet and a web manifest. There is no asset directory to ship.
Draw calls
167–216 per 1080p frame
Down from 259–386. Each kart carries a merged single-material bake of itself that serves as its only shadow caster and its distant LOD, turning fifteen draws into one.
Particles
2 draw calls, whole game
One additive, one lit. Particles are written once into a ring buffer at spawn and integrated analytically in the vertex shader, so a live particle costs the CPU nothing.
Light
4.37:1 key-to-fill (2.13 stops)
Measured on a 0.18 grey card in linear irradiance before tone mapping: lit 1.768 against shadowed 0.405, with the lit patch reading warm and the shadow cool.
Harnesses
34 files, 12,172 lines
Rigs for questions you cannot answer by looking — including whether a drifting lap is genuinely faster than a clean one, and whether the game survives losing its WebGL context.
Deps
three, postprocessing, n8ao, simplex-noise
No asset loader, no physics engine, no audio library. The engine note is six gears from 28 to 310 Hz, and the score is eight bars in A major at 132 BPM.