A kart laid sideways on a cobbled village street at sunset, orange sparks off the rear wheels and an orange mini-turbo ring flaring around it.

Arcade kart racer

Kart Royale

Eight karts, three laps of Sunset Bay, and a drift ladder that pays you for holding the angle longer than is sensible.

Free · No install · Runs on a phone

CircuitSunset Bay
Lap~1,600 m
Grid8 karts
Race3 laps
Mini-turbo3 tiers
Art assets0

The game

SPD 000 KM/H

Everything good
happens sideways.

A lap you can learn in one go and spend a week shaving. Five things hold it up, and every one of them is a number in the source.

01 — The circuit

Sixteen legs.
Sixteen hundred metres.

A harbour sweep along glass-calm water. Terraced village esses with one corner deliberately off-camber to punish a greedy line. A cliff ledge with no guardrail. A sodium-lit tunnel. A beach descent past parasols. Then a twenty-degree banked 180 with the whole bay underneath you.

  • 32 checkpoints
  • 10 surface zones
  • 5 boost strips
  • +42 m at the cliff apex

16-leg curvature schedule closing to under 5 cm; sea level to +42 m — src/world/TrackLayout.ts

02 — Mini-turbo

A drift ladder that pays

Hop, commit, hold the angle. Blue at 0.55 seconds, orange at 0.95, purple at 1.9 — and the payouts stretch as you climb, from a 0.95-second nudge to a full three seconds at 1.36× top speed.

  • Tier 1 · 0.55 s
  • Tier 2 · 0.95 s
  • Tier 3 · 1.90 s

DRIFT_TIERS = [0.55, 0.95, 1.9] s — src/kart/Kart.ts

03 — The field

Rivals that actually drive

The racing line is solved once at boot: a minimum-curvature path through the corridor, biased to a late apex, every braking zone baked in by a backward pass. The field lifts before the corner instead of discovering it mid-entry. Each driver carries its own steering noise, its own speed ceiling, and the occasional honest mistake.

320 relaxation passes, 4 m node spacing, apex pushed 13 m late — src/game/AI.ts

04 — Items

The table knows where you are

The leader gets armed to defend: bananas and green shells, both genuinely useful held behind you. The back of the field gets armed to close: triple mushrooms, the star, the bolt. Every position between is a smooth blend, so a comeback is always live and first place is never defenceless.

8 kinds weighted across leader/midfield/last and lerped per place; 10 box rows a lap — src/game/Items.ts

05 — The world

Nothing is downloaded

Every kerb stripe, every roof tile, every grain of sand in Sunset Bay is written into a canvas the moment the page loads. Thirty-one procedural material families, each built at three scales — millimetre grain, metre-wide weathering, rock strata above that. The music is sequenced, not streamed.

31 named materials; no image, audio, mesh or font file anywhere in src/ or public/

Two karts crossing a cobbled bridge above the bay, a jetty and moored boats below and terracotta cliffs across the water.

The bay bridgeCobble · lap 1 · 98 km/h

Sunset Bay

SPD 000 KM/H

The sun sits fourteen degrees above the water and it stays there.

Amalfi cliffs in a Nintendo palette. The lap starts on a harbour-front boulevard under a banner arch, grandstand left, moored boats right, then runs a long left-hander along water that never moves.

It climbs through terraced pastel houses strung with laundry lines and flower boxes, out onto a narrow ledge with a sheer drop to the sea and the low sun directly ahead. A tunnel cut through the rock. A beach descent past palms and parasols. Then the banked coastal curve, the money shot, with the whole bay visible below — and an arched stone bridge home past the windmill on the headland.

One lap, in order

  1. 000 mHarbour boulevard, banner arch
  2. 190 mMarina sweep, left, 190 m long
  3. 480 mVillage terraces and the esses
  4. 670 mCliff ledge, no guardrail
  5. 900 mTunnel, sodium light, boost strip
  6. 990 mBeach descent, palms, parasols
  7. 1250 mThe banked 180, twenty degrees
  8. 1600 mStone bridge, windmill, home

Distances rounded from the lap parameter; the banked 180 is the lap’s maximum curvature at 0.0153 rad/m with 0.36 rad of bank.

Two karts on a cliff road cut through pale rock, a SUNSET sign at the roadside and the sun low over the headlands beyond.
Cliff road · 90 km/h
Two karts on the harbour boulevard at sunset, grandstand crowd on the left and the bay opening on the right.
Harbour boulevard · 88 km/h

The drift ladder

SPD 000 KM/H

Blue. Orange. Purple.

Hop, and the kart commits. The charge runs for as long as you keep it sideways, and it pays out in three steps — the last of which is worth more than three times the first. It runs as you scroll; take the handle if you want to stop it somewhere.

Held 2.20s

Release now 3.00 s boost · ×1.36

  1. Tier 1 · Blue

    Hold 0.55 s

    0.95 s of boost ×1.12

    Cheap, constant, and the one you bank in traffic.

  2. Tier 2 · Orange

    Hold 0.95 s

    1.80 s of boost ×1.25

    Four tenths more holding, for nearly double the exit.

  3. Tier 3 · Purple

    Hold 1.90 s

    3.00 s of boost ×1.36

    Needs a corner long enough to hold it. Sunset Bay has two.

A kart drifting through the marina left-hander with a blue mini-turbo ring flaring around it and blue sparks off the rear wheels, a dropped banana on the tarmac ahead.
Tier 1 banked · the blue ring is the tell

Carry Let go for half a beat mid-corner and the charge does not reset. It waits 0.8 seconds for you to come back, which is exactly long enough to straighten over a kerb and lay it back down.

Why it matters Purple is not a reward for skill in the abstract. It is a bet: two seconds of commitment against a corner that might not be long enough. Sunset Bay has exactly two corners that are.

DRIFT_TIERS = [0.55, 0.95, 1.9] s  /  DRIFT_BOOST_TIME = [0.95, 1.8, 3.0] s  /  DRIFT_BOOST_STRENGTH = [1.12, 1.25, 1.36]  /  DRIFT_CARRY_TIME = 0.8 s

Frames

SPD 000 KM/H

The build

SPD 000 KM/H
64,999Lines of TypeScript under src/
31Procedural material families
1.79 MBThe entire shipped script
4Runtime dependencies

Sixty-five thousand lines and no asset folder.

Kart Royale ships as one HTML file, one script, one stylesheet and a manifest. There is no directory of textures because the textures do not exist until the page loads: every material is generated at boot as albedo, normal and packed ORM, at a fine tile plus a 128² world-space macro map so roughness varies across the road instead of reading as plastic.

The numbers below were counted, not estimated. Where the README disagrees with the working tree, the working tree wins.

Controls Arrows or WASD to steer, accelerate and brake. Shift to hop and drift. Space, Enter or E to fire an item. Q to look behind. Esc or P to pause — or a four-scheme virtual pad on touch.

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.

Sunset Bay is open

Three laps. No install.

It runs in the tab you already have open, and on the phone in your pocket. Nothing to download, because there is nothing to download.