Start here
Getting started
What a run does, what the knobs mean, and how to make a map you actually want.
The problem with tile-by-tile maps
Battle maps need to be big. A single dungeon floor might span 20×20 tiles — that's 400 individual images stitched together. AI image generators can produce stunning individual tiles, but they have no idea what's next to them.
The result: visible seams, colour shifts between neighbours, roads that dead-end at tile borders, lighting that flips direction halfway across the page. The closer your players look, the worse it gets — and patching it by hand can eat a whole evening.
What the painter does about it
The painter generates tiles that see their neighbours. Each new tile receives edge context from already-rendered adjacent tiles, structural constraints from a map-wide layout, and a style reference that locks palette and texture character across the entire grid. A multi-tier validation pipeline catches errors before they propagate; failed tiles are regenerated with tighter constraints.
You get large-scale, stylistically consistent maps that look hand-made — generated tile by tile, with full structural awareness — instead of an obvious patchwork.
Four stages, in order
Seed
The first tile sets the visual baseline — palette, lighting, texture character. Every subsequent tile references it, which is why the painter generates the seed through the same pipeline as the rest of the map.
Deep diveExpand
A wave scheduler fans outward from the seed. Each new tile is generated against a 256-px strip of its already-rendered neighbour (the exterior anchor), so edges line up by construction instead of by luck.
Deep diveValidate
A graduated quality gate runs on every finished tile. Pixel-level checks (ΔE, gradient, palette, pHash) reject ~70% of bad tiles for free. Only the ambiguous ones go to the slower vision-language model. Failed tiles get retried with tighter constraints.
Deep diveBlend
Overlap zones are feathered between neighbouring tiles, then a per-tile palette match against the anchor tile harmonises any remaining colour drift. Sub-100 ms, free win on the seam-quality score.
Deep diveHow to use the painter
- Open the map generator and pick a biome and grid size. Start with 3×3 to see a run end-to-end before scaling up.
- Optionally paint a seam — a river, road, or biome transition — over the canvas. The painter will continue it across tile boundaries instead of treating each tile in isolation.
- Pick a backend (Cloudflare Workers AI for fast/cheap, Modal for higher fidelity) and run.
- Watch the live tile grid: tiles flip from queued → generating → validated as the wave scheduler fans out from the seed.
- If a tile lands in the validation gate, it'll retry with tighter constraints automatically. Successful runs land in Run history.
Suggested reading order
Read these in order if you want to understand what each knob in the UI is doing. None of them are long.