Before / After — What Changed
With the rebuild done, I put the two screens up side by side.

Movement: from a rail to a run
The gameplay changed the most.
I threw out the rail movement pinned to a fixed point and laid down arcade physics.
Now there's acceleration and deceleration that doesn't stop instantly when you let go of a key, and jumps that fall under artificial gravity.
The rabbit no longer "moves" — it runs.
Speed stopped being fixed too.
It starts at 12 m/s, builds as you descend, and tops out at 30 m/s.
The old version ran at one speed start to finish, so 500m was simply long; now the same inputs mean different difficulty depending on how deep you are.
Structure: failure exists now
Adding failure was huge too.
I introduced a 3-heart system: hit a root and you lose a heart, and when they all run out it's game over.
After a hit you get 1.5 seconds of invincibility, which prevents the unfair case of losing several hearts in a row in the same spot.
To give the carrots — which you used to just pick up — some meaning, I layered on combos: at 5/10/20 consecutive pickups, the score multiplier climbs to ×2/3/5.
export const comboMultiplier = (count: number) =>
count >= 20 ? 5 : count >= 10 ? 3 : count >= 5 ? 2 : 1;
What those three tiers really do is keep asking whether you want to play it safe or push.
As the combo grows, the next carrot is worth more, which gives you a reason to go after the ones in dangerous positions.
Golden carrots turn on a magnet for 8 seconds that sucks in nearby carrots, and grazing an obstacle by a hair earns you a near-miss bonus.
All of it turns "a game where you avoid things" into "a game where avoiding things well pays more."
Visuals: stripping off the gray plastic
For the visuals, I stripped away the gray plastic and switched to toon shading.
Gradient fog and bloom set the twilight-burrow mood.
I didn't make the models more detailed — I went to simpler primitives and changed how they're painted instead.
From 27MB to zero bytes
The number I'm proudest of is a different one.
External assets went from 27MB to 0 bytes.
I deleted the Stanford Bunny model and the PBR textures entirely, and sculpted the rabbit, the tunnel, and the carrots in code alone.
With nothing to download, the first load is that much lighter.
The cost is just as real.
A shape that would take thirty minutes in a modeling tool gets assembled by hand-tuning coordinates, and every new part has to be eyeballed for whether it sank inside the body.
There's also a hard ceiling on the forms you can express.
If I'd wanted a realistic character, this approach was never on the table.
For this game it was still the right trade.
The goal was cuteness rather than realism, and cuteness gets along well with simple shapes.
And because the forms are code, colors and proportions became changeable at runtime — which is what later turned into eleven fur colors and an accessory shop.
With assets, every variant would have needed its own file.
It stopped being the same game
I didn't remake the same game — it effectively became a different one.
What carried over wasn't code, it was one idea: a rabbit runs down a burrow.
Looking back, the part of the rebuild that actually took time wasn't writing the code, it was settling the criteria.
Those few days spent writing the mood as a sentence, cutting the palette down, and deciding not to use an engine are what made every later decision fast.
From the next post on, I'll take this result apart piece by piece.
First up: the rabbit's body, sculpted in code.