by kgoedecke
The open-source alternative to Paper.design. A multiplayer design canvas where humans and AI agents design together, live. MCP built in.
# Add to your Claude Code skills
git clone https://github.com/kgoedecke/doopLast scanned: 8/24/2026
{
"issues": [
{
"type": "npm-audit",
"message": "esbuild: esbuild enables any website to send any requests to the development server and read the response",
"severity": "medium"
},
{
"type": "npm-audit",
"message": "nanoid: nanoid: custom generators can loop indefinitely when size is zero",
"severity": "high"
},
{
"type": "npm-audit",
"message": "vite: Vite Vulnerable to Path Traversal in Optimized Deps `.map` Handling",
"severity": "high"
}
],
"status": "WARNING",
"scannedAt": "2026-08-24T04:42:51.625Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}doop is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by kgoedecke. The open-source alternative to Paper.design. A multiplayer design canvas where humans and AI agents design together, live. MCP built in. It has 630 GitHub stars.
doop returned warnings in SkillsLLM's automated security scan. It has no critical vulnerabilities, but review the flagged issues in the Security Report section before adding it to your workflow.
Clone the repository with "git clone https://github.com/kgoedecke/doop" and add it to your Claude Code skills directory (see the Installation section above).
doop is primarily written in TypeScript. It is open-source under kgoedecke on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh doop against similar tools.
No comments yet. Be the first to share your thoughts!
Requires a passing catalog security scan. Resolve the flagged issues and resubmit to enable featuring.
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
Doop is the open-source alternative to Paper.design — a multiplayer
design canvas for humans and AI agents. Every design lives on a shareable Canvas
(/c/<id>) holding Frames — artboards that render real HTML in sandboxed iframes. People edit
in the browser; AI agents edit through the built-in MCP server, streaming their designs in
live. Everyone sees everything as it happens: cursors, presence, frame edits, agent status, and an
activity feed.
ANTHROPIC_API_KEY for a handful of free tasks, then on the
ChatGPT subscription (or OpenAI key) each user connects (setup); the
first-canvas welcome performance is scripted and runs without any of it.docker compose up, or bun run dev with zero configuration
(embedded Postgres, no external services required).git clone https://github.com/kgoedecke/doop && cd doop
bun install
bun run dev
Doop builds and installs with bun (bun.lock is the only
lockfile); the server itself runs on Node.
/api, /ws, /mcp to it)Everything works with no configuration: data persists to an embedded Postgres (PGlite) in data/pg,
and every optional integration (SMTP, stock photos, object storage, analytics) degrades gracefully
until its variable in .env.example is set. The one you will most likely want is
ANTHROPIC_API_KEY, which turns on the built-in Doop Agent — agents you connect
yourself over MCP need no key.
Or self-host the production build with Docker:
BETTER_AUTH_SECRET=$(openssl rand -hex 32) docker compose up -d # app + Postgres on :4400
Production build without Docker: bun run build && bun run start (single server on :4400 serving
everything). Set DATABASE_URL to use a real Postgres — same code path as PGlite.
Prefer not to run anything? doop.design is the hosted version.
One command connects Claude Code (or any MCP client) to your canvas:
claude mcp add --transport http doop http://localhost:4300/mcp
That triggers the standard MCP OAuth flow — a browser window opens, you approve, and from then on
the agent works as you. Ask it to design something on your canvas id and watch it happen live.
Everything in this shot is the real flow: Claude Code announced itself with set_status, created a
frame, and is streaming the pricing section in — presence avatar, "for Kai Moreno" attribution,
the frame chip, the working strip, and the task in the Agents panel.
The first canvas after signup comes with a performance: the Doop Agent streams a welcome design in while you watch — status in the working strip, a task in the panel, a pulsing border on the frame it's building.
That welcome performance is scripted (server/demo.ts) — a pre-authored frame replayed through
the same machinery real agents use, so it runs with no configuration at all. The Doop Agent proper
needs a key.
Doop ships a built-in design team that lives in the server and picks work up on its own: queue a
board card, @mention a role on an element comment, or leave feedback on a task, and it runs
without a human in the loop. Roles (Doop builds; specialists own one pass each — UX, copy, brand,
accessibility) are defined in shared/agents.ts, and a card can be routed
through several in order.
The server pays for the free tier, on Anthropic by default:
ANTHROPIC_API_KEY=sk-ant-... # in .env, or the environment of your deployment
Same key gates the guideline distiller (server/distill.ts), which proposes
durable style rules from your canvas.
The free tier can run on Azure OpenAI instead — useful when your organisation's credits or compliance rules live there:
DOOP_AGENT_PROVIDER=azure
AZURE_OPENAI_ENDPOINT=https://my-resource.openai.azure.com
AZURE_OPENAI_API_KEY=...
AZURE_OPENAI_DEPLOYMENT=my-deployment
The distiller stays on ANTHROPIC_API_KEY either way and quietly turns off without it.
When a user's RESIDENT_TASK_LIMIT free tasks are gone, they don't lose the agent — they connect a
model account and the Doop Agent keeps running on it. A connected account takes over immediately,
from the very next task: the free tier is a trial that gets people here, not a balance to spend down
first, and connecting stops costing the server anything from that moment. The connection is
account-level, so it lives at /settings (Home → Settings); the free-tier wall links there rather
than carrying its own copy, and "Connect an AI agent" on a canvas stays about MCP clients only. Two
kinds of account:
auth.openai.com, then inference through the Codex
backend that Plus/Pro/Business plans include. Tokens live in model_accounts and never reach a
browser.Azure OpenAI is deliberately not a connectable account kind: a user-supplied endpoint would be a URL the server fetches with the run's full context — an SSRF vector — so Azure stays a server-level provider only.
Either way the user picks their model tier in Settings — gpt-5.6-sol (flagship),
gpt-5.6-terra (the default workhorse) or gpt-5.6-luna (cheap and fast). They are paying for it,
so the choice is theirs; DOOP_AGENT_OPENAI_MODEL only sets the default they start on. Note that
gpt-5.4 and gpt-5.4-mini retire from ChatGPT-authenticated Codex on 31 August 2026, so
pinning a 5.4 id via that env var will break the subscription path after that date.
OpenAI registers no redirect URI for a hosted app, so connecting ChatGPT takes one of three shapes and Doop picks the cheapest one available:
| Where Doop runs | Flow | What the user does |
|---|---|---|
| Same machine as the browser (dev, self-host) | Loopback catch — Doop holds 127.0.0.1:1455 |
Approve in the OpenAI tab. Nothing to copy, no setup |
| Hosted (doop.design) | Device code (/api/accounts/deviceauth/*) |
Type a short code at auth.openai.com/codex/device |
| Device codes disallowed | Browser redirect + paste | Paste the dead localhost:1455 page's address back into Doop |
The device flow needs device code authorization switched on in ChatGPT → Settings → Security (workspace members need an admin to allow it) — that is why the loopback flow, which needs no setting at all, stays the default when Doop is local. All three end at the same server-side PKCE exchange.
Before you turn this on for real users: driving a ChatGPT subscription from a third-party server is not something OpenAI's terms sanction, and heavy use can get an account rate-limited or suspended. The API-key path is the fully supported alternative and shares all the same code.
CHATGPT_CONNECT_DISABLED=1switches the subscription path off and leaves the key path.
Runs are attributed to the human whose card, comment or feedback they picked up, so the person who asked for the work is the person whose account runs it. The translation bet