An infinite-canvas image board that generates through the you already pay for — no API key, no per-image billing, and none of your Codex quota.
Overview
An infinite-canvas image board that generates through the you already pay for — no API key, no per-image billing, and none of your Codex quota.
README
ChatGPT Endless Canvas
🆓 Burns zero Codex / API quota
An infinite-canvas image board that generates through the ChatGPT web app you already pay for — no API key, no per-image billing, and none of your Codex quota.
An infinite-canvas image board powered by the ChatGPT web app — no paid API. It drives your own logged-in chatgpt.com session over Chrome DevTools Protocol (CDP) to generate images, and streams every result onto a local pan/zoom canvas with Lovart-style iteration tools:
- 🎨 Infinite canvas — pan, zoom, drag cards, layouts persist per board
- ✏️ Annotate → Regenerate — draw a box/point on an image, write a revision note, hit regenerate; the server re-prompts ChatGPT with the original attached as reference
- ⭐ Style-reference generation — use any image on the board as a style anchor and generate new subjects in the same look
- 📋 Scheduled batches — submit a prompt list; jobs are queued with a random 30–120 s pause between them (human-ish pacing, avoids rate limiting)
- ⚡ Parallel generation — up to 3 images generate at once (
BOARD_WORKERS), each in its own dedicated ChatGPT tab; every job records its ChatGPT conversation uuid, and interrupted jobs recover their image from that conversation on restart instead of regenerating - 🌳 Lineage tracking — every generated image records its parent and the notes that produced it; the canvas draws the family tree (solid = edit, dashed = style reference)
- 🗂 Multiple boards — each board is a plain, portable directory (images +
layout.json+annotations.json+lineage.json) - 📥 Drag & drop — drop local images onto the canvas to bring them into the workflow
- 🌐 Trilingual UI — switch the board between 中文 / English / 日本語 right from the toolbar (remembered per browser)
- 🤖 Claude Code skill included — let Claude submit prompts, batches, and edits to the board for you
The board server is stdlib-only Python; the generator needs just
pip install playwright (no browser download — it attaches to your Chrome).
How it works
board.html ──► board_server.py ──► generate_chatgpt_image.py ──► Chrome (CDP :9222)
(canvas) (queue, boards, (send prompt + reference, └─ your logged-in
lineage, uploads) wait, download final PNG) chatgpt.com session
No API keys, no cookies to copy: you log into chatgpt.com once in a dedicated Chrome profile; the tool reuses that session. Generated images render in the assistant reply as progressive frames — the script waits until the stored-file URL settles (and excludes any image that existed before the prompt, so stale results from earlier chats can never be grabbed).
Quick start
git clone https://github.com//chatgpt-endless-canvas.git
cd chatgpt-endless-canvas
# 1. one-time: install playwright into a venv (no `playwright install` needed)
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
# 2. launch the debug Chrome, log into chatgpt.com in it, keep it open
bash launch-chrome-debug.sh
# 3. start the board (idempotent; survives the terminal via nohup)
bash start.sh # prints the actual url (8090, or next free port)
Data lives in ~/Documents/chatgpt-endless-image-gen/ — boards.json is the
board registry; each board directory is self-contained and portable.
CLI generation (no board)
.venv/bin/python generate_chatgpt_image.py \
--prompt "a cozy cabin in snow, watercolor" \
--output out.png \
[--reference style.png] [--timeout 240] [--grab-only]
--grab-only re-grabs the newest image already on the ChatGPT page — useful
when generation finished after the script timed out.
HTTP API
| Endpoint | Description |
|---|---|
GET /api/state |
board, images, layout, annotations, lineage, jobs — one call |
POST /api/generate |
{"prompt":"..."} plain generation; add "name":"" to use it as a style reference; "prompts":[...] schedules a batch (≤50, random interval) |
POST /api/regenerate |
{"name":""} — regenerate from its pending annotations |
POST /api/annotations |
write the full annotations object (normalized 0-1 coords) |
POST /api/upload?name=x.png |
raw image bytes → active board |
POST /api/delete |
{"name":""} — remove the image + its board metadata (409 while a job is using it) |
GET /api/health |
identity: app, version, project path, python, pid, port, workers |
GET/POST /api/boards |
list / {"action":"create","name":..,"dir":..} / {"action":"open","id":..} |
POST /api/layout |
persist card positions (?board= guards stale writes) |
Claude Code skill
skills/chatgpt-image/SKILL.md teaches Claude Code to run the whole loop —
check Chrome, start the board, submit prompts/batches/edits via the API, and
report results. Install:
mkdir -p ~/.claude/skills
cp -r skills/chatgpt-image ~/.claude/skills/
If you cloned somewhere other than ~/Workspace/chatgpt-endless-canvas,
set CHATGPT_IMAGE_GEN_HOME=/path/to/clone in your shell profile (the skill
falls back to the default path).
Configuration
| Env | Default | Meaning |
|---|---|---|
BOARD_PORT |
8090 |
board server port (skips ports taken by other programs — see /api/health) |
BOARD_PORT_TRIES |
20 |
how many ports to try upward from BOARD_PORT |
BOARD_WORKERS |
3 |
parallel generation workers, one dedicated ChatGPT tab each |
IMAGE_GEN_DATA |
~/Documents/chatgpt-endless-image-gen |
data root |
CHATGPT_CDP_URL |
http://127.0.0.1:9222 |
Chrome debug endpoint |
BATCH_INTERVAL |
30-120 |
random pause (s) between batch jobs |
BOARD_DIR |
— | single-board mode on exactly this directory |
DEBUG_PORT / PROFILE_DIR / CHROME_BIN |
— | launch-chrome-debug.sh knobs |
Limitations & notes
- ChatGPT’s web UI changes often; selectors in
generate_chatgpt_image.pyare defensive but may need updating after redesigns. - “Edit” is a full re-generation guided by the reference image + zone-worded notes — not true in-place inpainting.
- Back-to-back generations can trip ChatGPT’s silent rate limiting (prompt sent, no reply). The batch scheduler’s random pauses exist for exactly this reason.
- Use with your own account, for personal purposes, at your own risk. Automating the ChatGPT web app may conflict with OpenAI’s Terms of Use.
License
Recommended Tools
Try a different keyword or remove a filter.
Install
npx skillfish add maniacmike/chatgpt-endless-canvas