Roadmap
The microsite renders this file directly. Keep the format exact (see "Updating the roadmap" in AGENTS.md): ## M<n> · Title \status\` with status done, now, next or later, an optional > goal line, then - [ ] / - [x]` tasks.
M0 · Foundation done
Repo, shared agent instructions, spec, microsite and CI.
- Repo with
AGENTS.mdshared by Codex and Claude - Corrected spec in
docs/spec.mdand decision records indocs/decisions/ - Microsite that reads
ROADMAP.md,PROGRESS.mdand the gallery live - CI runs the tests and the gallery build on every push
M1 · Projection and renderer done
Exact 2:1 projection and a deterministic software renderer that behaves the same in the browser and in Node.
- 2:1 projection with the pivot on an exact pixel (
src/core/projection.js) - Z-buffered triangle rasterizer with no WebGL
- Fixed top-left key light with a top / left / right shading ramp
- Hard cast shadows from a light-space depth map
- 4×4 edge sampling that keeps the dominant face per pixel (no blended edge colours)
- Calibration gate: a flat tile is exactly 64×32 with 2:1 stair-step edges
M2 · Blueprints (Stage 1) done
Describe an asset once, as JSON primitives on a tile footprint.
- Blueprint format with plain-language validation errors
- Primitives: box, pyramid, cylinder, cone, gable
- Four rotations, with the footprint swapped for non-square assets
- Sample blueprints (coaster station, oak tree, cottage, carousel, gift shop, picket fence)
- JSON Schema (
schema/blueprint.schema.json) so editors can autocomplete blueprints - More primitives: wedge, arch, stairs (non-convex shapes are built from convex pieces)
- Custom occupancy masks: the L-shaped gift shop, rotated per view in the manifest
- Reusable part groups with
use, plusrepeatfor rows of posts or pickets
M3 · Cleaner (Stage 3) done
Turn renders into palette-locked pixel art.
- One median-cut palette shared by all four views
- Fixed IGAH-32 palette preset
- Dithered, solid or no shadow, anchored to the pivot so neighbouring tiles line up
- 1px exterior outline, square or soft corners
- Crop that never trims the base diamond
M4 · Packager (Stage 4) done
Sprite sheet plus a manifest an engine can read without guessing.
- Sprite sheet with a frame rectangle per view
- Manifest
igah.sprite/1with pivots, normalized pivots, footprints and occupancy per view - Save the sheet and manifest from the sandbox
- Headless CLI:
npm run buildandnpm run gallery
M5 · Quality gates done
Automate the spec's QA checklist so nothing ships on looks alone.
- Hard alpha, palette limit, four views, integer pivot
- Shadow direction (bottom-right)
- 3×3 tile seam test using pivot placement
- CLI exits non-zero on any failing gate, and CI enforces it
M6 · Sandbox and microsite later
A place to see progress and try changes without installing anything.
- Live blueprint editor that rebuilds as you type
- Rotation, grid preview, gate, sheet and manifest panels
- Microsite with roadmap, gallery and progress log
- Builds run in a Web Worker so typing never stutters (falls back to the page thread)
- Drag-to-orbit shape preview on a 2D canvas, back to the game angle in one click
- Share a blueprint by link (compressed into the
#bp=fragment) - Pin a build and compare it with the next one, side by side
- Publish the microsite on GitHub Pages (needs the repo public)
M7 · Model import next
Bring in real models instead of primitives.
- GLB import with node transforms, vertex colours and material base colours (no dependencies)
-
modelpart type that scales a GLB into a box on the footprint - Drop or open a
.glbin the sandbox to get a starter blueprint - Blender → GLB → sprite proven:
tools/blender/make_statue.pybuilds the monkey statue sample - Base-colour texture sampling with alpha cut-out (PNG in Node, any format in the browser); textured crates sample
- JPEG textures in the Node CLI (the browser already handles them)
- Meshy and Poly Haven GLBs from Agentic_Forge feed straight in
- Model triangle budget warning (dense models slow the build)
M8 · Style depth next
Closer to hand-made pixel art.
- Posterized shading: 6 brightness steps per colour by default (
shadeLevels) - Pixel-scale surface patterns: brick, clapboard, planks, shingles, paving, cobble, foliage, speckle, ripple
- Ambient raised to 0.5 so shaded faces keep their texture
- Brick mortar drawn lighter than the brick, so courses still read on shaded faces
- Ground tile variants (
patternSeed) picked per tile by the scene tool, so large areas don't repeat - Keep parts under 2 px wide readable (the outline currently swallows thin pickets at 64 px)
- Lighting looks:
rich(ambient occlusion, lit convex edges, per-material ramps) andflat - Per-material shading ramps: each surface stays on its own material's ramp
- Interior outlines where depth jumps
- Hue-shifted ramps (renderer support exists; needs a larger palette)
- Ordered dithering option for large faces
- Animation frames (rotating rides, flags) packed per view
M9 · Engine exports later
Drop-in files for the engines people actually use.
- CC World Kit export contract and 48×24 compatibility proof (Codex;
docs/cc-world-kit.md,tests/world-kit.test.js) - Godot 4 TileSet and AtlasTexture resources
- Unity sprite import settings with pivots
- Tiled
.tsxtileset - Multi-asset atlas packing (max-rects)
- Depth-sorting metadata for multi-tile objects: per-pixel ground-depth map (
<id>_ground.png) - Picking metadata: per-pixel part map with named labels (
<id>_parts.png)
M10 · Diffusion styling later
Optional img2img pass on top of the render. Geometry stays locked and the gates still run afterwards.
- Choose a provider and budget (needs an API key and costs per image)
- Condition on the render's edges and depth so shapes cannot drift
- Re-run the Cleaner and every gate on styled output
M11 · Catalog now
A starter set worth building a park with.
- World Kit starter set: original 2×2 studio plus a vegetation family (pine, birch, bush, hedge, flower bed)
- IGAH-32 is the default palette, so every asset in a scene shares colours
- Scene ground tiles: grass, road, road centre line, sidewalk, cobbles, water (no outline, butt-jointed)
- Tiny residents (three scale figures)
- Street kit for the Fight the Buff direction (unbranded): mailbox, dumpster, bin, hydrant, lamp, utility pole, alley wall, alley door, print shop, brewery
- Heritage kit for the Fort Langley direction (original designs): false-front shop, hall, palisade, bastion
- Scene mock-ups composited with ground-depth occlusion (
assets/scenes/,npm run scenes) - Ground transitions: shoreline edge, outer and inner corners (one blueprint, four rotations) and a crosswalk
- Curbed road corners and grass-to-path edges
- Park basics: paths, fences, benches, bins, lamps, trees
- Ride set: stations, track pieces, queue lines
- Curved shapes for track: torus segment and banked curve primitives
- Gallery filters by category and footprint
M12 · Characters now
Customizable walking characters for the games, as a separate
igah.character/1format.
- Posable parts:
pitch,rollandpivotYhinge limbs on any primitive - Character generator: build, height, skin, hair, hat, top, bottoms, shoes, accessory
- Sheets with 8 screen directions × idle + 6-frame walk, one feet pivot, no jitter
- Gates: hard alpha, palette, every frame drawn, feet on the ground (checked with the ground-depth map)
- Eight presets (three residents, street artist, shopkeeper, site worker, elder, skater) at 48 and 96 px
- Character creator page in the sandbox: palette swatches, live 8-direction walk, randomize, share, export
- Scenes can place characters by direction and frame
- More animations: run (with airborne frames), wave, and the sticker-placing reach (Fight the Buff)
- Sit and idle fidgets
- More options: glasses, sunglasses, beards, mustaches, coats, dresses, umbrellas, carried boxes (10 presets)
- Animals: dog (walk, gallop, sniff) and birds (pigeon, sparrow, crow, gull: walk, peck, fly)
- Vehicles in 8 directions: hatchback, sedan, van, pickup, with two-tone paint and roof extras
- Character kinds (person, dog, bird, vehicle) with exact foot planting; the creator switches between kinds
- Build characters in a Web Worker (a 168-frame person takes about 0.5 s on the page thread)
M13 · High detail now
Age of Empires / Warcraft-level detail: richer lighting, layered geometry, bigger tiles.
- Rich lighting look on by default, tested at 48, 96 and 128 px
- Detail kit: windows, shutters, planters, doors, lanterns, hanging signs, barrels, crates, benches, pots, chimneys (
use: "kit/…", withscaleandrecolor) - Brewery, print shop and false-front shop rebuilt with the kit
- High-detail galleries at 96 × 48 and 128 × 64 (
npm run gallery:hd), gated in CI - Kit pass over the remaining buildings (studio, hall, cottage, gift shop, bastion)
- Roof detail: ridge caps, fascia boards, dormers, gutters
- Larger palette for the high-detail tier, then hue-shifted ramps
- Characters at 96 and 128 with more body detail
- Decide with the World Kit lane whether high detail becomes the contract
- Terry stickers locked: the T-face and grin masters, byte-exact with sha256 checks in tests and CI
- Built-in SVG rasterizer, verified against Chrome to within 1 px; exact die-cut renders at 512, 256 and 128
- Pixel candidates at 32, 24, 16 and 12 px (standard and bold), an approval command that locks the chosen one, and 2:1 wall decals that never resample
- Approve the pixel versions at each size (hand-edit where no candidate is good enough)
- Stickers on the street-block walls in the Fight the Buff scene