A whiteboard that actually generates the pictures you scribble about
Local-first AI image workspace built on tldraw, with an Agent that plans multi-image jobs and executes them as dependency graphs.

What it does
GPT Image Canvas is a self-hosted creative workspace where you arrange AI-generated images on an infinite tldraw canvas. You prompt, generate, drag, and connect images; the app stores everything—project state, generation history, assets—in local SQLite. It wraps GPT Image 2 (or any OpenAI-compatible image endpoint) with a Hono API and a Vite React frontend.
The interesting bit
The Agent tab is where it gets weird-in-a-good-way. You describe a multi-image task, the planner LLM builds a DAG of generation jobs, and execution runs independent branches in parallel while dependent jobs wait for their upstream outputs. A single plan caps at 16 images, and you can retry failed nodes without regenerating the whole graph. It’s basically Makefiles for mood boards.
Key highlights
- Reference-image generation: select any canvas image and use it as visual context for the next generation
- Three provider fallbacks:
.envconfig, in-app saved keys (masked in SQLite), or Codex OAuth login - Cloud backup to Tencent COS or S3/R2, with test-upload validation before persisting credentials
- Gallery with rerun, locate, download, and upload-status tracking
- Docker Compose with GHCR prebuilt images; local dev requires Node 24.15.0 and pnpm 9.14.2 exactly
Caveats
- Agent planning messages are not persisted; only the resulting plan nodes survive in canvas snapshots
- The app is explicitly designed for local workstation use—no built-in auth, don’t expose it publicly
- SQLite on Docker bind mounts needs
DELETEjournal mode andEXCLUSIVElocking to avoid corruption; running local dev and Docker against the samedata/directory simultaneously is asking forSQLITE_IOERR_SHMOPEN
Verdict
Worth a spin if you want a private, non-subscription alternative to Midjourney/Leonardo with actual layout tools and batch workflows. Skip it if you need collaboration, cloud-native hosting, or can’t stomach pinning Node to a specific patch version.