How it's made
celworld is a procedural, cel-shaded world engine. Claude writes every model as a small script. A seed grows a person, a tree, a machine or a whole town from it. Nothing here is a mesh file or a texture.
165 models · 178 versions · 6 scenes
Every model is a small script
This is Duck dipper, a machine from Fold-Up Factory. Claude wrote it by hand in .cel, celworld's asset language: 76 lines, 5.0 KB. Shapes, colours, joints and animation states, coarse to fine. Your browser compiles the script into the live mesh you can turn.
Pick a state to play it. The grid button grows seeds 1 to 9 from the same script: every seed is a different, equally good variant.
Seed, spec, geometry, instance
Everything in celworld runs one way. A seed becomes a spec, the spec becomes geometry, and the geometry becomes a live instance. Only the last two steps touch the GPU, so a spec can be computed anywhere and checked by a test.
- Seed32-bit numberSame seed, same thing, forever.
- Specversioned pure dataEvery choice is drawn from tables. No three.js.
- Geometryone mesh per ink classLathes, balls, limbs and boxes merged with vertex colours.
- Instanceshared toon materialsInk outlines, walk cycles, animation states.
Variety is data
A generator never special-cases a look in mesh code. Forms, ranges and palettes live in tables, and the seed draws from them. Here is the built-in tree generator. Change the seed and you get sixteen new trees and a new spec for the first one.
{
"kind": "tree",
"v": 0,
"seed": 3439929727,
"form": "cloud",
"height": 4.34,
"trunk": {
"h": 1.94,
"r0": 0.27,
"lean": [0.01, 0.01],
"color": "#8d5f3c"
},
"branches": 3,
"puffs": 8,
"firstPuff": {
"c": [1.35, 2.93, -0.34],
"rx": 1,
"ry": 0.85,
"color": "#40b15b"
},
"tiers": 0,
"dots": 0
}
Scenes are scripts too
A .scene file names library models and built-in generators, lays them out and gives them something to do. Moonlight Carnival places 159 things from 17 library models with 149 lines.
Templates
A template sets the ground, the sky and the mood: town, carnival, beach, mountain, interior, dungeon.
Layout by footprint
Streets with lots, rows, rings and scatters place things by their real size, so nothing overlaps.
Life loops
Wander, follow and cycle lines keep people walking, rides turning and fireworks going off.
Agents build it with a CLI
No one draws these models. A Claude session follows a written guide and drives the cel command line: check, save, shot, stamp. It looks at its own screenshots and keeps going until the model is right. The output below is this library's, for Duck dipper.
- 1cel checkCompile three seeds, measure them against the budget, list what must be fixed.
- 2cel saveStore a new version in Postgres, tied to the agent run.
- 3cel shotRender it headless and look at the picture. Fix and repeat.
- 4cel stampLog the session as a run: its tokens and time, split across what it saved.
The guide
The whole workflow, the two languages and the engine laws are written down in one guide in the repo (docs/build-on-celworld.md), with a Claude skill that condenses it. Any session can pick it up and make a model, a scene or a game.
Fold-Up Factory
The worked example of a game on the engine: a packing puzzle invented by a 7-year-old. Its machines, toys and cartons were all made this way.
Engine numbers
Static models merge into batches, so a whole town draws in a few hundred calls. Run the showcase scene and these numbers come from your own GPU, measured while it plays.

Ink fins
The outline is the back-face hull trick, which loses its line wherever a hard crease has flat normals. Every kit adds thin ink fins along those creases, so boxes and roofs keep a clean edge. Budgets count only the drawn triangles, not the fins. Toggle ink on the model above to see the difference.
Golden seeds
Nothing in the engine calls Math.random(). Every draw goes through a seeded generator, sub-seeded per section, so a saved seed keeps producing the same thing. Golden tests freeze a whole town's layout to the millimetre. The browser and server digests above are the same check, live.