I’ve been wanting to build a game for a long time. Not a big one - just something small and self-contained that I could actually finish. So when I had a few free weekends, I sat down with Three.js and built Tiny Planet.

It’s a short browser game. You’re an astronaut who’s made a bad landing on an uncharted moon. Your communicator is in pieces, scattered across a tiny procedural world, and you need to repair it and call for rescue.

Finding the pieces

You wake up next to a crashed landing pod. You can walk around the planet in a minute or two, so there’s no map, no fast travel, nothing to get lost in. You just explore.

As you wander, you find things: an ancient altar with empty sockets that want to be filled, a still pond with something glinting under the surface, a cave mouth you can’t walk into without waking whatever’s sleeping in there. Each of these is hiding a piece of your broken communicator. Put the pieces back together and you can signal the rescue shuttle.

It takes about fifteen minutes to finish.

Why tiny

Keeping the world small helped me finish the game. I didn’t need quest systems, map UI, save files, or a HUD full of icons. The player can see most of the world from anywhere on the surface, so I could lean on sightlines for storytelling rather than markers or objective text.

It also meant I could afford to be generous with detail: bioluminescent plants, drifting fireflies, footprints that fade behind you, a rescue ship with a working tractor beam. The budget I’d have spent on a large world went into small-world atmosphere instead.

Technically

It’s pure Three.js on top of Vite, no game engine. The planet is a subdivided icosahedron with a noise function driving surface height. Props are placed by raycasting onto the mesh, so trees and rocks sit properly on the curvature. Collision is a cylindrical collider registry that ejects the player horizontally when they walk into something - simple but enough for a game where you don’t jump on things.

Systems communicate through a tiny pub-sub I wrote in about twenty lines. When you pick something up, a pickup.collected event fires, the inventory reacts, the story system reacts, and whatever spawned the pickup cleans itself up. Nothing knows about anything else it doesn’t need to. That meant I could write each puzzle as a self-contained module subscribing to a handful of events.

The atmosphere is a Fresnel shader on a slightly-larger sphere around the planet. The fog blends the horizon into space. The starfield is a single Points mesh with a custom shader for twinkle. Everything renders in one scene.

Controls

W / S        run forward / backward
A / D        turn left / right
Shift        walk (hold while moving)
Space        jump
E            interact / pick up
F            throw held item
I            toggle inventory
Scroll       zoom camera

No mouse required. This was deliberate - I wanted it to feel like an arcade game you could play on a laptop trackpad on a train.

Making time for the footprints

The thing I didn’t expect was how much fun I’d have making it. Nobody was waiting for Tiny Planet. If I wanted to change the colour of the fireflies or spend an evening making footprints fade behind the player, I could. I’d forgotten how much I enjoyed that sort of work.

Play it

tinyplanet.tucker.wales - runs in any modern browser, keyboard only, no install. It takes about fifteen minutes. Headphones recommended.

If you finish it, I’d love to hear what you thought.