My first message to Claude Code:
and also make the car game need for speed like super fast fire stuff
The first version it built had no physics, and the 3, 2, 1 countdown ended on a black screen.
By the end of the evening it was Kartit Nitro: a neon racing game in the browser with real physics, nitro, drifting, four cameras and six AI rivals.
Here's the full build, every prompt on screen:
Race it yourself. The AI driver's best lap is 33.3 seconds. Good luck.
Below: what I typed, what broke, and what it cost.
One sentence in, a brief out
Before writing any code, Claude turned my sentence into a short brief of its own: a three.js track, nitro flames, handbrake drifting, and a chase camera that lags a little more the faster you go.
Twenty minutes later I had a neon city, a car and six rivals on the grid. It was not perfect: no physics, a black screen where the countdown should be, no music, and a car that turned way too much.
My whole job was complaining
Claude wrote the code. I drove, got annoyed, and typed whatever annoyed me. These are real messages from that session, 21:01 to 22:18 UTC on 23 September 2026:
- "car game lack physics"
- "cannon js?"
- "we need glowing car lights"
- "where is speeding game and nitro"
- "3 2 1 screen become black why"
- "no music is blayed ... press to start"
- "we need to show keyboard"
- "is till hit wall"
- "wait turns too much now"
I asked for physics, lights, nitro and keyboard controls, then kept reporting whatever broke next. The physics ended up on cannon-es, a JavaScript physics engine.
The steering took the most rounds. My last message of the session, at 22:18, wasn't a two-word complaint anymore. It was a whole paragraph about how the car should turn.
What's in the game now
- Physics with cannon-es
- Nitro
- Handbrake drifting
- Four cameras
- A "SUPER NEON" ghost mode, with its own meter
- Six AI rivals
- An online leaderboard
There's also an AI driver that does laps on its own. Every gameplay shot in the video is the AI driving, not me.
The game is 5.77 MB of static files and loads instantly on a phone.
Under the hood: two fixes worth stealing
I didn't write this code, but I did read it afterwards, and two of the fixes are worth knowing about if you ever build a driving game.
"wait turns too much now"
The steering in vehicle.js doesn't use a fixed angle. The faster you go, the less the front wheels are allowed to turn:
// full lock asks the front tyres for lockGrip x their grip at the current speed
// (never more than steerMax), so a tap at 250 km/h turns in cleanly
function lockAt(vf, hand, sup) {
const L = VT.rearZ - VT.frontZ; // wheelbase
const grip = VT.frictionFront * (sup ? VT.superGrip : 1) * (VT.g + VT.downforce * vf * vf);
return Math.min(VT.steerMax, L * grip * VT.lockGrip / Math.max(vf * vf, 1)) * (hand ? VT.handLock : 1);
}
The angle drops with the square of the speed (vf * vf), which is how cornering grip works on a real car. At low speed you get the full steerMax of 0.55 radians, about 31 degrees. At high speed a small tap stays a small tap. Pull the handbrake and you get 1.6 times more lock, which is what makes drifting possible.
Underneath, it's a 1,200 kg body on a cannon-es RaycastVehicle: four wheels with springs and dampers, plus a few assists, like a yaw limiter so normal steering can't spin you out.
"no music is blayed ... press to start"
This one wasn't a bug in the game. Browsers don't let a page play sound until you click or press a key. The fix in music.js waits for your first input and starts the music then (slightly simplified):
// first gesture anywhere starts the menu theme (autoplay policy needs a gesture)
const kick = () => {
if (!started) play(game.state === 'title' ? 'intro' : 'menu', 1500);
removeEventListener('pointerdown', kick);
removeEventListener('keydown', kick);
};
addEventListener('pointerdown', kick);
addEventListener('keydown', kick);
If you've ever wondered why so many web games open with "press any key", now you know.
The car: one picture, one free GPU
I didn't model the car. I asked Codex's image generation for a picture:
A single small red sports car, stylized clean 3D render, three-quarter front view from slightly above, the whole car fully visible and centered with space around it, all four wheels clearly visible with black tires and silver rims, pure white background, soft even studio lighting, no ground shadow, no reflections of other objects, no text, no logo, no license plate text. This image will be converted into a 3D model, so keep the shape clear and the edges clean.
The last sentence is there on purpose. It pushes the image toward a clean shape, and image-to-3D models rebuild clean shapes much better.
Then TRELLIS, an open model that turns one picture into a 3D model with colour, did the conversion. On a free Tesla T4 GPU from Kaggle, this car took 39.4 seconds and came out with 12,444 faces. I run it through localfit, a small open source tool of mine:
localfit 3d generate car.png --model trellis --backend kaggle --quality standard --out car.glb
I tried four free image-to-3D models on the same picture and the same GPU first:
| Model | What came out |
|---|---|
| TRELLIS | textured mesh, 12,444 faces, 39.4 s |
| TripoSR | 93,368 faces, blurry colours |
| TripoSG | 1,696,424 faces, no colour at all |
| Hunyuan3D-2mini | textured, but its licence excludes the EU |
The first run also needed 676.5 seconds just to install TRELLIS. Plan a coffee.
One more problem: the model comes out as one solid piece, wheels included. A script in Blender, the free 3D editor, finds the four wheels from the car's shape and cuts them off the body, so they can spin and steer:
blender -b --factory-startup --python car_anim.py -- car.glb out/
The cut takes about 4 seconds, 42 with a test render.
Music and sound from Lyria 3 Pro
For the music, I asked for no intro, no breakdown and no ending, so the track could loop:
Instrumental only, no vocals. Driving synthwave / outrun night-drive racing track: pulsing 16th-note analog bass, gated reverb drums, bright saw-lead arpeggios, neon 80s retro-futuristic energy, 124 BPM, minor key, relentless forward momentum. Constant full-energy groove from the first second to the last with no intro, no breakdown and no ending, so it loops seamlessly. About 90 seconds.
For sound effects, I asked for several variations of the same sound with silence between them, then cut them apart:
Sound effects library recording for a video game. No music, no melody, no rhythm, no vocals, no background ambience. Six isolated variations of the same sound effect, each separated by three seconds of total silence: a bright electronic synthwave lap-complete jingle, a quick rising synth arpeggio chime, about one second each.
The race announcer is Gemini 3.8 Flash text to speech: 14 short lines.
What I can account for
- Lyria: 13 calls at $0.08 each, $1.04 in total. Eight of them made the audio that's in the game ($0.64). Five were discarded, and two of those came back empty.
- The 3D car: generated on Kaggle's free GPU hours.
- The code: Claude Opus 5.5 in Claude Code, 11 files and 2,506 lines.
- The announcer: 14 lines. Its cost wasn't logged, so it's missing from my total.
Not included: my subscriptions and my Mac.
Next up
Every prompt and command is also written out in the companion post on my blog, and the full video is here.
The next build is FAST CHEF, a cooking game in the spirit of Hell's Kitchen. Its 3D chef is animated from a video of real movement. The full tutorial is planned for 11 October 2026. Subscribe on YouTube if you want to follow that one.
What broke first in your AI-built game? And if you beat 33.3 seconds in mine, post your time.
Top comments (0)