Use the IGT Planner with your own AI

The planner's rules are open, and they run without a browser. Bring whatever agent you already use — Claude, ChatGPT, a local model, Claude Code, Codex — and let it design a Snow Peak IGT layout with you. You describe what you want; the agent writes a layout; the planner's own rules say whether it can actually be built, and you open the result in 3D.

There is no AI on our side, no account and no key. The agent does the talking; the rules engine does the geometry.

The idea in one paragraph

A layout is a small JSON document that records intent only: which part, hooked to which other part's which edge, and which slots a module takes. It never needs coordinates for anything that hooks on — the planner works those out from the measured hooks and brackets, exactly as it does when you click. So a language model only has to get the what right, and the part it is worst at, the spatial where, is done for it.

Option A — no tools: your agent writes a link

Paste this to your agent (and describe your setup underneath):

Design a Snow Peak IGT layout for me. The parts catalog is at https://igt.iqis.app/catalog/igt-catalog.json and the layout format is described at https://igt.iqis.app/llms.txt. Write the layout JSON, then give me the link https://igt.iqis.app/web/#layout= followed by the URL-encoded JSON.

Open the link: the design lands as a new page in the planner, where any problem shows in the warnings panel.

Option B — an agent that can run commands

Clone the repository and use the CLI. It runs the same rules engine as the web app, and its output is JSON, made for an agent to read:

git clone https://github.com/iqis/igt-planner && cd igt-planner
node scripts/igt.mjs parts burner             # find parts: sku, name, size, span, weight
node scripts/igt.mjs example > my.json        # a small valid layout to start from
node scripts/igt.mjs evaluate my.json         # buildable? problems, bill, weight, what fits next
node scripts/igt.mjs link my.json             # a planner link that opens it

evaluate is the loop: write a layout, evaluate it, read problems and each node's next (the parts that fit every open edge and free slot run), revise, repeat. When buildable is true, make the link.

Option C — in your own code

web/core.js has no DOM and no three.js; it imports in Node, Deno, Bun or a Worker:

import * as core from "./web/core.js";
core.loadCatalog({ catalog, colors, textures, fittings });   // the four catalog/*.json files
const report = core.evaluate(layout);
// report.buildable, report.problems, report.bill, report.nodes[i].next
core.listParts({ query: "bamboo", role: "extension_table" });

The layout format

{
  "app": "igt-planner", "v": 1,
  "nodes": [
    { "i": 1, "sku": "CK-150", "leg": "CK-114", "x": 0, "z": 0, "rot": 0,
      "placements": [{ "sku": "GS-450R-US", "span": 2, "start": 0 }] },
    { "i": 2, "sku": "CK-116TR", "host": 1, "edge": "end+x" }
  ]
}

That is a four-unit frame on 830mm legs with a Flat Burner in its first unit, and a bamboo table hooked onto its right-hand end.

Nodes. Every node has an id i (any unique integer) and a sku from the catalog.

Edges. What a host offers:

host edges
IGT frame, Entry/Slim IGT end+x, end-x (the short ends) · rail+z, rail-z (the long sides, via rail joints)
a hooked board bracket (its far edge — where the next board hooks on and its legs stand)
Connection Table LV-381 end+x, end-x, side+z, side-z
Jikaro ST-050 jik+x, jik-x, jik+z, jik-z (+ chamfers in the spread form) · opening (the fire hole)

Corners and angle extensions turn the run on their own (±90°, ±60°): chain their bracket edges and the shape closes by itself.

Modules go in a frame's placements. The bay is measured in half-units (125mm): a four-unit frame has 8 half-slots, numbered 0–7 from the end-x end. span is the part's span in the catalog (a one-unit burner is 2); start is the first half-slot it covers. Modules must not overlap or run off the end.

Scene (optional, top level): "scene": "meadow" sets the page in a place — meadow, forest, beach, desert, night — or on a plain ground — grass, wood, gravel, sand. Leave it out for the bare measuring grid. It changes nothing about what is buildable.

You do not add leg sets for hooked boards, rail joints, connection hooks or height adjusters — the bill adds them, because they follow from the layout.

Rules worth knowing before you start

What evaluate returns

buildable   true when no problem is a "warn"
problems    [{level, cat, text}] — level "warn" = will not stand / will not fit / forbidden;
            cat: problem | check (unconfirmed, e.g. a manual that predates the part) |
                 added (a part the bill now carries) | note
extent      overall width and depth in mm
bill        {lines: [{sku, name, qty, weight_g, auto}], total_weight_kg} — auto = added by the rules
nodes       per node: resolved x/z/rotation, top height, footprint, modules, and
            next: {edges: [{edge, fits: [sku…]}], slots: [{start, half_units, fits: [sku…]}]}

Data

The catalog (dimensions, weights, the 250mm unit grid, attachment rules) is compiled from Snow Peak's public product pages and manuals; every derived rule cites its source in catalog/. This is an unofficial, independent project — not affiliated with Snow Peak.