Scene recipes

Describe a scene. Import a map.

A recipe is a short JSON file of high-level operations. The app expands it into grid-correct geometry: floors tile, walls meet at corners, openings sit on edges. It is how the starter scenes are made, and it is small enough for an AI assistant to write from a sentence.

Castle Gate at Dusk: curtain walls, a gatehouse and a courtyard
Castle Gate at Dusk is a recipe.

How it works

  1. Ask"A roadside shrine in a pine wood at dusk, with a rogue waiting by the road."
  2. The assistant writes a recipeUsing the shipped guides: the recipe schema, a building guide with a QA checklist, and the asset catalog with every id and its footprint.
  3. Import itFile ▸ Import Scene JSON. The models download from the library; the builder reports any warning.
  4. Dress and playIt is a normal scene now: paint, drag, add lights, press Play.

What a recipe looks like

Nine operations make a playable map. Rectangles are in grid cells, assets are library ids, and the builder handles the rest: the perimeter walls get correct corners, the scatter avoids the shrine, the torch lights the altar.

  • floor fills rectangles or follows a path, blending materials and randomising rotation for natural ground.
  • walls runs a wall family around a rectangle with gaps for doorways, or along chosen sides.
  • prop, line, scatter and clutter place things by cell, along a path, or randomly with avoidance.
  • light, effect and mini add torches, fire and smoke, and tokens with HP and rings.

The repository's ai/ folder has the schema, the building guide and the full catalog. With Claude Code the whole flow is one command: /create-scene.

{
  "format": "vtt-recipe",
  "name": "Roadside shrine",
  "grid": { "size": 1 },
  "environment": { "preset": "dusk" },
  "ops": [
    { "op": "floor", "asset": ["realistic-surfaces/grass_floor", "realistic-surfaces/grass_patchy_floor"],
      "rect": [0, 0, 19, 15], "randomYaw": true, "blend": 4 },
    { "op": "floor", "asset": "realistic-surfaces/dirt_floor", "path": [[0, 8], [19, 8]], "width": 2 },
    { "op": "floor", "asset": "realistic-surfaces/flagstone_floor", "rect": [8, 3, 11, 5] },
    { "op": "walls", "asset": "realistic-surfaces/stone_wall", "rect": [8, 3, 11, 5], "sides": "NEW" },
    { "op": "prop", "asset": "realistic-surfaces/stone_altar", "at": [9.5, 3.5] },
    { "op": "scatter", "asset": ["realistic-surfaces/fir_tree", "realistic-surfaces/pine_tree"],
      "area": [0, 0, 19, 6], "count": 14, "avoid": [[7, 2, 12, 6]] },
    { "op": "light", "type": "torch", "at": [9.5, 1.2, 4.5], "intensity": 5, "distance": 6 },
    { "op": "effect", "type": "fire", "at": [9.5, 0.6, 4.5] },
    { "op": "mini", "asset": "characters/rogue", "at": [3, 9], "label": "Pip", "ring": "ally" }
  ]
}

Questions

Which AI does it work with?

Any assistant that can read the guides and write JSON. The guides are written for Claude Code, which has a /create-scene command in the repository, but the format is plain.

What if the AI uses an asset that does not exist?

The builder validates every id against the library and reports what is missing. The starter scenes are tested to zero warnings.

Can I write recipes by hand?

Yes, and it is quicker than it looks: the shrine above is nine lines of intent. The tests in the repository check any recipe you drop into the examples folder.

Import your first recipe

Sign up, open the table, File ▸ Import Scene JSON.