Skip to the content.

Setup

Requirements

Need Check Why
Python 3.9+ python3 --version the engine. No required third-party packages
Chrome or Chromium command -v google-chrome \|\| command -v chromium rasterises drawings, prints the PDF
A render backend see below photoreal views
PyYAML (optional) python3 -c "import yaml" nicer YAML. A built-in mini-parser is used otherwise

Render backends

You need at least one. They are interchangeable — same prompts, same reference drawings.

codex — free, quota-limited. Install the codex CLI and sign in; its built-in image_gen tool (gpt-image-2) is used. Nothing else to configure.

codex --version

openrouter — paid, no quota, about $0.18 per image.

cp .env.example .env      # then set OPENROUTER_API_KEY

.env is gitignored. .env.example is committed and must never contain a real key. Keep OPENROUTER_IMAGE_MODEL at openai/gpt-image-2 unless you have a reason to change it: it is the same model codex uses, which is what keeps every image in a set visually consistent.

First run

./bin/design init my-room
cp ~/photos/*.jpg projects/my-room/refs/
./bin/design check

check will complain until the room model is filled in — that is expected, and the surveyor agent’s job. In Claude Code, run /interior-design and it will walk you through.

Working on several jobs

Each job is a directory under projects/. The tool uses the only one present, or the slug in config/current, or --project <slug>:

./bin/design status --project kitchen-refit
echo kitchen-refit > config/current

Troubleshooting

“BLOCKED — gate X is not approved” — working as intended. Review the work, then ./bin/design approve X.

Drawings are blank or missing — Chrome was not found. Install Chromium.

“quota exhausted” — the codex free quota. Re-run later; finished views are skipped. Or switch to --backend openrouter.

A render shows a door that does not exist — the room model is missing an opening, or has one on the wrong wall. Fix project.yml, run ./bin/design check, regenerate drawings, re-render. Never fix it in the image.