Vibecoder Days

Unreal Engine 5.8, PS5 as the targetproject closedUpdated:

🏍️ Enduro

A hard enduro game where the terrain is the opponent. Sixteen days on Unreal with two AI agents. The project is closed; the story stays.

Where it came from

I ride enduro. And it has bugged me for years that motorcycle games are all about the timer and the track, while the most interesting thing in real enduro is the slope you look at and think: “can this even be ridden?”. You try, you fall, you look for another line, you make it. That's what I want to turn into a game.

I wrote down the principles right away so I wouldn't argue with myself later:

  • Difficulty lives in the terrain. Next to a hard climb there is always a “chicken way”: it still takes technique, but it forgives more.
  • An open world, not races. Multiplayer is about riding together: finding a line, waiting at the top, helping lift a bike.
  • Realism over graphics. A two-stroke and a four-stroke must feel different. Simple visuals, but living weather, sound and physics.
  • Techniques come from control, not from buttons. Clutch dumps, double blips and lifting the front wheel come from throttle, clutch and body weight.
  • The clutch on the DualSense adaptive trigger: the effort and the bite point should be felt with a finger.
  • Fall, pick it up, ride on. A broken plastic piece is a story, not a trip to the workshop.

Installing the engine

We picked Unreal Engine 5.8: from this version the editor has a built-in server through which an AI can place objects in the scene, start the game and read the logs. For me that meant Claude could work inside the editor without my hands.

Installation is a genre of its own. First it turned out my Xcode version was officially unsupported, and Claude suggested installing a second Xcode next to it. Then we downloaded a 700 MB Metal Toolchain and I asked whether we had just cluttered the disk for nothing. We hadn't: without it the editor crashes on startup. Then the Epic launcher refused to update because of “not enough space”, since I had run it straight from the disk image rather than from Applications. Then the engine itself, tens of gigabytes. The evening's result: the project compiled in 21 seconds, the editor opened after four minutes of shader compilation, and the second Xcode was never needed.

The dream team

This is where it got interesting, and there is a separate post about it, in Russian for now. In short: I wanted two AIs, Claude and GPT, to work on the game and talk to each other without me. I asked them to agree on roles and send me a summary.

They agreed in two rounds. Nobody claimed to be better at C++. GPT took the independent physics core: engine, clutch, gearbox, tyre, suspension, plain code with tests. Claude took the engine side: architecture, builds, the editor, the world, sound, the repository. Reviews are always done by someone other than the author. Disputes are settled by measurement in the game. Only questions about how riding feels come to me.

The gamepad

The project's main risk was the triggers. The feel of the clutch is built on the DualSense adaptive triggers, and I didn't know whether they work on a Mac. I plugged the gamepad in over USB, the editor picked it up right away, and the engine's source turned out to contain a full Mac implementation of the triggers: resistance, feedback stop, vibration. The same mechanism as on PS5. Risk gone in ten minutes.

First test

There's no bike yet, there's a cube. A grey cube on a white floor, that's our graphics.

The Unreal editor: a grey cube instead of a bike, but the triggers already work
The Unreal editor: a grey cube instead of a bike, but the triggers already work

But the cube has throttle on the right trigger and a clutch on the left, with resistance. A button toggles a “light lever” and a “heavy lever”. I picked up the gamepad and said: I feel no difference, the resistance is tiny. Turned out to be a scaling bug: both presets produced three percent of the force. Fixed, and now the light lever is a third of the force with a bit of free play, and the heavy one is full force from the very start.

Engine vibration appeared at the same time. The gamepad body shakes with the “engine”: weakly and unevenly at idle, harder under throttle, and the throttle trigger vibrates at the engine's frequency. A button toggles two-stroke and four-stroke: the 2T fires every revolution with a buzzing vibration, the 4T half as often, with separate dull thumps at idle. The Mac has a single vibration channel, so at high revs the thumps blur into a hum; PS5 will be more precise.

Meanwhile GPT delivered its first task: the clutch specification and core, twenty-odd tests, all passing. Its sandbox couldn't commit, so Claude committed on its behalf with proper authorship. Our project history now has two AI authors, and that's not a joke.

Day two: the bike

The cube lived for one day. The next day Codex wrote a script that builds the bike model in Blender, I rendered it and sent the pictures back, it fixed the script, four iterations. That's how the orange KTM-style enduro appeared. Then the rider the same way: a seventeen-bone skeleton, jersey, helmet, boots, three iterations. Claude assembled a bike with physics out of it, put the rider on and drove the poses from the sticks. The details, traps included, are in the day-two post, in Russian for now.

The orange enduro bike with a rider on the test pad
The orange enduro bike with a rider on the test pad
Leaning into a turn
Leaning into a turn
A wheelie
A wheelie

Along the way we turned from a simulator to an arcade: of everything riding needs, we need motocross physics, and logs, rocks and trials tricks come later. Right stick steers, left stick is the body, triggers are throttle and clutch. It rides, jumps, wheelies, and all of that is checked by an automated test without me.

Day two, evening: physics and a repaint

The first ride with a gamepad showed the bike shaking in place and drifting sideways. Claude tried seven fixes, then handed the task to Codex with the full picture, and Codex diagnosed it on the first attempt: the lateral friction impulse was computed for a time step four times shorter than the physics step. After the fix the bike stands rock still. Then Codex read the entire codebase and returned 25 findings, from a brake that spins the wheel up to a bug in the documentation. Details are in the 25 bugs post, in Russian for now.

The bike was also repainted after photos of my own: white and blue with a yellow plate, the rider in navy and orange. Hands are on the bars now, and a foot goes down when we stop.

Render: the white-and-blue enduro bike and rider
Render: the white-and-blue enduro bike and rider
In game: standing, foot on the ground
In game: standing, foot on the ground
In game: leaning into a turn
In game: leaning into a turn

Track, sound and forest

Over the next three days Codex's main findings were fixed and the bike started riding properly: 94 km/h instead of 130, and the nose comes down by itself after a jump. Along the way we found a frame the size of a bus: the engine's inertia setting scaled the body's dimensions, so physics treated the bike as a box almost seventeen metres long. Then came a motocross track with berms and props, three bikes to choose from, a synthesised engine sound and dirt flying from the wheels.

The track
The track
Roost from the rear wheel
Roost from the rear wheel
The third bike
The third bike

On 17 September we went back to enduro: a square kilometre of terrain, a three-kilometre forest trail, eight thousand trees, and logs you cross the way you do in real life: roll over, double blip, or over the bars.

The autopilot versus a 1.2 m log. I asked for big logs; the autopilot disagrees so far

How it ended

On 29 September 2026 I closed the project. It lived for sixteen days: from a grey cube to three bikes, a motocross track and a square kilometre of forest with logs. It never got to PS5, or to “a track that's fun for half an hour”.

The game is no longer developed and can't be downloaded or tried. This page and the posts remain. The most valuable part of them isn't even the bike but how two AIs split the work: one writes, the other reviews, disputes are settled by measurement. I took that method with me to other projects.