An open-world game in one HTML file. The world looks like a needle-felted and yarn diorama. You can drive, walk, fly as a felt bird, and dive under the sea in a submarine or as a sea turtle.
Claude Code with the Opus 5.5 model wrote all the code. There are no image files and no audio files. Every texture is drawn on a <canvas> and every sound is made with Web Audio.
Play Felt World in your browser
On a phone, turn the phone sideways. Touch controls show automatically.
The game needs an internet connection at start, because it loads three.js from the jsDelivr CDN and two fonts from Google Fonts.
How the game is built and tested: Tech stack and physics tests (source: tech-stack.html).
The three worlds, on High quality, at 10:00 in the morning.
In the air — the felt bird over meadows, a road with traffic, and a knit-row mountain:

Under water — the submarine in the Deep Felt Sea with a ray, a crab, a fish school, kelp and light patterns on the sea floor:

On land — the car on a knitted town street in Buttonbury, with felt houses, trees and street lamps:

Five more screenshots from a play session in Chrome, in the afternoon (14:17 to 15:45 game time).
Over the town — the felt bird at 73 km/h over the houses, a road, a car and walkers in Buttonbury:

Over the sea — the felt bird at 80 km/h over the Shallows, with the coast and a mountain on the left:

On the sea floor — the sea turtle at a depth of 74 m in the Deep Felt Sea, with fish schools, kelp, crabs and coral:

In the fish schools — the sea turtle between schools of yellow, blue, red and green fish in golden-hour light:


Open the live page: How the felt look is made (source: felt-effects.html)
The felt look comes from seven small layers: a wool palette, a canvas-drawn fibre texture, a 4-step toon ramp, quilt and knit patterns in the shaders, knitted road textures, running-stitch outlines, and a post-process pass that frays edges into fibres. The page explains each layer with its numbers and links to the code lines. It also shows a felt cat that gets one layer more in each section, from a plain three.js cat (step 0) to the fully felted cat (step 7).
GitHub does not run a web page inside a README, so the two pictures below are screenshots of the documentation page. They are not screenshots of the game. Click a picture to open the live page.
The top of the documentation page:
Step 7 of the felt-cat demonstration on that page. The cat is a demonstration scene for the page, drawn in your browser with the game’s felt code. The game has no cat. The teal stitched frame is the same border that the game’s felt pass draws round the screen:
Felt World uses the same class of techniques: a world made from pure functions of (x, z), chunk streaming, instanced props, crowds of agents, and a look-ahead Web Audio scheduler. Paper World has no licence, so no code was copied from it. All the code in this repository is new.
The game was built from a sequence of requests in Claude Code. Each request below changed the game away from Paper World.
| Request | Result in Felt World | Paper World |
|---|---|---|
| “What can be beyond paper and ink but still visually comforting?” → felt and yarn | Toon shading with a soft ramp, running-stitch outlines, wool-fibre fuzz and felt grain in a post shader, a stitched fabric border, pom-pom trees, felt houses with button windows, knitted roads | Ink outlines, watercolour wobble, paper grain, torn-paper frame |
| Add an underwater world with 2 ways to move (A + B) | Deep sea basins, shallows and coasts. A: the car becomes a submarine in deep water and a car again on the shore. B: press T in water to become a sea turtle | No underwater world |
| Make the game playable on a phone | Joystick, action buttons, drag to look, pinch to zoom, Low / Medium / High quality | Has its own touch controls and an installable app (PWA) |
| Fix: diving into water did not go under water | The sea entry was fixed | — |
| Fix pause; add a button to turn off music | P pauses the whole game; a Music button turns the radio off | — |
| “The underwater world needs more living organisms” | Fish schools, jellyfish, rays, sea turtles, crabs, whales, starfish, urchins, kelp, coral, a shipwreck and a treasure chest | Sky whales, land animals |
| “How do I know how deep I am?” | The HUD shows depth N m · floor N m in and on the sea. Whales live only where the floor is deeper than 40 m |
— |
| “Physics is violated” (a van under a floating road, a van inside another van) | A full physics pass for every world, plus an automatic physics test with 150 checks and 9 injected faults. See Physics test | — |
Paper World has more content in some areas. Felt World has 8 landmark types (windmill, lighthouse, barn, clock tower, bandstand, giant yarn ball, shipwreck, treasure chest) where Paper World has 46. Felt World has one flight mode (felt bird) where Paper World has two (paper plane and eagle). Felt World has no rain, no photo mode and no installable app.
| Key | Action |
|---|---|
| W A S D / arrows | Drive, walk, swim, fly |
| Space | Hop (car) / jump (walk) / rise (water) / flap (bird) |
| Q | Dive (submarine, turtle); while swimming, dive under as a turtle |
| Shift | Run (walk) / boost (fly, swim) |
| E | Get out of / into a vehicle |
| F | Turn into a felt bird / land |
| T | Turn into a sea turtle in water / change back |
| C | Cycle camera; drag = orbit, wheel = zoom |
| R / N | Radio on-off / next song |
| P | Pause / play |
| H | Help |
Drive into deep water and the car becomes a submarine. Drive out onto a shore and it becomes a car again. Collect the felt buttons along the roads to play note phrases.
There is no build step. Serve the feltworld/ folder with any static web server:
cd feltworld
python -m http.server 8431
Then open http://localhost:8431/. Opening index.html as a file:// URL does not work, because the page is an ES module.
feltworld/physics-check.js tests the physics inside the running game. It uses the drawn terrain and road meshes as the reference, not the game’s own height code.
const m = await import(new URL('physics-check.js?' + Date.now(), location.href));
fails value must be 0. The run takes 25–45 s and blocks the page.
console.table(await m.run());
caught: true.
console.table(await m.faults());
overlaps and deadlocks must be 0:
m.soak('town');
bad must be 0:
for (const b of ['town', 'field', 'sea']) console.table(m.overlaps(b));
What the test covers, the results, and what is not tested are in tech-stack.html.
| File | What it is |
|---|---|
feltworld/index.html |
The whole game: 3,231 lines, HTML + CSS + one JavaScript module |
feltworld/physics-check.js |
The in-browser physics test |
tech-stack.html |
Tech stack, physics design, and the test report |
felt-effects.html |
How the felt look is made in code |
screenshots/ |
The screenshots in this README: eight of the game (air, underwater, land, bird-*, turtle-*) and two of the documentation page (felt-effects-*) |