English ยท Portuguรชs (Brasil) ยท Deutsch ยท Franรงais ยท ๆฅๆฌ่ช ยท ็ฎไฝไธญๆ
Run the full product locally.
- Node.js:
~24(Node 24.x). The repo enforces this throughpackage.json#engines. - pnpm:
10.33.x. The repo pinspnpm@10.33.2throughpackageManager; use Corepack so the pinned version is selected automatically. - OS: macOS, Linux, and WSL2 are the primary paths. Windows native should work for most flows, but WSL2 is the safer baseline.
- Optional local agent CLI: Claude Code, Codex, Devin for Terminal, Gemini CLI, OpenCode, Cursor Agent, Qwen, Qoder CLI, GitHub Copilot CLI, etc. If none are installed, use the BYOK API mode from Settings.
nvm / fnm are optional convenience tools, not required project setup. If you use one, install/select Node 24 before running pnpm:
# nvm
nvm install 24
nvm use 24
# fnm
fnm install 24
fnm use 24Then enable Corepack and let the repo select pnpm:
corepack enable
corepack pnpm --version # should print 10.33.2corepack enable
pnpm install
pnpm tools-dev run web # starts daemon + web in the foreground
# open the web URL printed by tools-devFor the desktop shell and all managed sidecars in the background:
pnpm tools-dev # starts daemon + web + desktop in the backgroundOn first load, the app detects your installed code-agent CLI (Claude Code / Codex / Devin for Terminal / Gemini / OpenCode / Cursor Agent / Qwen / Qoder CLI), picks it automatically, and defaults to web-prototype skill + Neutral Modern design system. Type a prompt and hit Send. The agent streams into the left pane; the <artifact> tag is parsed out and the HTML renders live on the right. When it finishes, click Save to disk to persist the artifact under ./.od/artifacts/<timestamp>-<slug>/index.html.
The Design system dropdown ships with 129 design systems โ 2 hand-authored starters (Neutral Modern, Warm Editorial), 70 bundled product systems, and 57 design skills sourced from awesome-design-skills. Pick one to skin every prototype in that brand's aesthetic.
The Skill dropdown groups by mode (Prototype / Deck / Template / Design system) and shows the default skill per mode with a ยท default suffix. Bundled skills:
- Prototype โ
web-prototype(generic),saas-landing,dashboard,pricing-page,docs-page,blog-post,mobile-app. - Deck / PPT โ
simple-deck(single-file horizontal swipe) andmagazine-web-ppt(theguizang-pptbundle fromop7418/guizang-ppt-skillโ default for deck mode, ships its own assets/template + 4 references). Skills with side files get an automatic "Skill root (absolute)" preamble so the agent can resolveassets/template.htmlandreferences/*.mdagainst the real on-disk path instead of its CWD.
Pair a skill with a design system and a single prompt produces a layout-appropriate prototype or deck in the chosen visual language.
pnpm tools-dev # daemon + web + desktop in the background
pnpm tools-dev start web # daemon + web in the background
pnpm tools-dev run web # daemon + web in the foreground (e2e/dev server)
pnpm tools-dev restart # restart daemon + web + desktop
pnpm tools-dev restart --daemon-port 7457 --web-port 5175
pnpm tools-dev status # inspect managed runtimes
pnpm tools-dev logs # show daemon/web/desktop logs
pnpm tools-dev check # status + recent logs + common diagnostics
pnpm tools-dev stop # stop managed runtimes
pnpm --filter @open-design/daemon build # build apps/daemon/dist/cli.js for `od`
pnpm --filter @open-design/web build # build the web package when needed
pnpm typecheck # workspace typecheckpnpm tools-dev is the only local lifecycle entry point. Do not use the removed legacy root aliases (pnpm dev, pnpm dev:all, pnpm daemon, pnpm preview, pnpm start).
During local development, tools-dev starts the daemon first, passes its port into apps/web, and apps/web/next.config.ts rewrites /api/*, /artifacts/*, and /frames/* to that daemon port so the App Router app can talk to the sibling Express process without CORS setup.
Image, video, audio, and HyperFrames skills call the local od CLI through environment variables injected by the daemon when it spawns an agent:
OD_BINโ absolute path toapps/daemon/dist/cli.js.OD_DAEMON_URLโ the running daemon URL.OD_PROJECT_IDโ the active project id.OD_PROJECT_DIRโ the active project's file directory.
If media generation fails with OD_BIN: parameter not set, apps/daemon/dist/cli.js missing, or failed to reach daemon at http://127.0.0.1:0, rebuild the daemon CLI and restart the managed runtime:
pnpm --filter @open-design/daemon build
pnpm tools-dev restart --daemon-port 7457 --web-port 5175
ls -la apps/daemon/dist/cli.js
curl -s http://127.0.0.1:7457/api/healthThen open the project from the Open Design app again instead of resuming an old terminal agent session. A daemon-spawned agent should see values like:
echo "OD_BIN=$OD_BIN"
echo "OD_PROJECT_ID=$OD_PROJECT_ID"
echo "OD_PROJECT_DIR=$OD_PROJECT_DIR"
echo "OD_DAEMON_URL=$OD_DAEMON_URL"
ls -la "$OD_BIN"OD_DAEMON_URL must be a real daemon port such as http://127.0.0.1:7457, not http://127.0.0.1:0. The :0 value is only an internal "pick a free port" launch hint and should not leak into agent sessions.
For the daemon-only production mode, the daemon serves the static Next.js export itself at http://localhost:7456, so no reverse proxy is involved.
If you place nginx in front of the daemon, keep SSE routes unbuffered and uncompressed. A common failure is the browser console showing net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK) after 80-90 seconds because nginx gzip on buffers chunked SSE responses even when the daemon sends X-Accel-Buffering: no.
location /api/ {
proxy_pass http://127.0.0.1:7456;
proxy_buffering off;
gzip off;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}| Mode | Picker value | How a request flows |
|---|---|---|
| Local CLI (default when daemon detects an agent) | "Local CLI" | Frontend โ daemon /api/chat โ spawn(<agent>, ...) โ stdout โ SSE โ artifact parser โ preview |
| API mode (fallback / no CLI) | "Anthropic API" / "OpenAI API" / "Azure OpenAI" / "Google Gemini" | Frontend โ daemon /api/proxy/{provider}/stream โ provider SSE normalized to delta/end/error โ artifact parser โ preview |
Both modes feed the same <artifact> parser and the same sandboxed iframe. The only thing that differs is the transport and the system-prompt delivery (local CLIs have no separate system channel, so the composed prompt is folded into the user message).
For every send, the app builds a system prompt from three layers and sends it to the provider:
BASE_SYSTEM_PROMPT (output contract: wrap in <artifact>, no code fences)
+ active design system body (DESIGN.md โ palette/type/layout)
+ active skill body (SKILL.md โ workflow and output rules)
Swap the skill or the design system in the top bar and the next send uses the new stack. Bodies are cached in-memory per session so this is a single daemon fetch per pick.
open-design/
โโโ apps/
โ โโโ daemon/ # Node/Express โ spawns local agents + serves APIs
โ โ โโโ src/
โ โ โโโ cli.ts # `od` bin entry
โ โ โโโ server.ts # /api/* + static serving
โ โ โโโ agents.ts # PATH scanner for claude/codex/devin/gemini/opencode/cursor-agent/qwen/qoder/copilot
โ โ โโโ skills.ts # SKILL.md loader (frontmatter parser)
โ โ โโโ design-systems.ts # DESIGN.md loader
โ โ โโโ sidecar/ # tools-dev daemon sidecar wrapper
โ โ โโโ tests/ # daemon package tests
โ โโโ web/ # Next.js 16 App Router + React client
โ โโโ app/ # App Router entrypoints
โ โโโ src/ # React + TypeScript client/runtime modules
โ โ โโโ App.tsx # orchestrates mode / skill / DS pickers + send
โ โ โโโ providers/ # daemon + BYOK API transports
โ โ โโโ prompts/ # system, discovery, directions, deck framework
โ โ โโโ artifacts/ # streaming <artifact> parser + manifests
โ โ โโโ runtime/ # iframe srcdoc, markdown, export helpers
โ โ โโโ state/ # localStorage + daemon-backed project state
โ โโโ sidecar/ # tools-dev web sidecar wrapper
โ โโโ next.config.ts # tools-dev rewrites + prod apps/web/out export config
โ โโโ desktop/ # Electron runtime, launched/inspected by tools-dev
โโโ packages/
โ โโโ contracts/ # shared web/daemon app contracts
โ โโโ sidecar-proto/ # Open Design sidecar protocol contract
โ โโโ sidecar/ # generic sidecar runtime primitives
โ โโโ platform/ # generic process/platform primitives
โโโ tools/dev/ # `pnpm tools-dev` lifecycle and inspect CLI
โโโ e2e/ # Playwright UI + external integration/Vitest harness
โโโ skills/ # SKILL.md โ drops in from any Claude Code skill repo
โ โโโ web-prototype/ # generic single-screen prototype (default for prototype mode)
โ โโโ saas-landing/ # marketing page (hero / features / pricing / CTA)
โ โโโ dashboard/ # admin / analytics dashboard
โ โโโ pricing-page/ # standalone pricing + comparison
โ โโโ docs-page/ # 3-column documentation layout
โ โโโ blog-post/ # editorial long-form
โ โโโ mobile-app/ # phone-frame single screen
โ โโโ simple-deck/ # minimal horizontal-swipe deck
โ โโโ guizang-ppt/ # magazine-web-ppt โ bundled deck/PPT default
โ โโโ SKILL.md
โ โโโ assets/template.html
โ โโโ references/{themes,layouts,components,checklist}.md
โโโ design-systems/ # DESIGN.md โ 9-section schema (awesome-claude-design)
โ โโโ default/ # Neutral Modern (starter)
โ โโโ warm-editorial/ # Warm Editorial (starter)
โ โโโ README.md # catalog overview
โ โโโ โฆ129 systems # 2 starters ยท 70 product systems ยท 57 design skills
โโโ scripts/sync-design-systems.ts # re-import from upstream getdesign tarball
โโโ docs/ # product vision + spec
โโโ .od/ # runtime data (gitignored, auto-created)
โ โโโ app.sqlite # projects / conversations / messages / tabs
โ โโโ artifacts/ # one-off "Save to disk" renders
โ โโโ projects/<id>/ # per-project working dir + agent cwd
โโโ pnpm-workspace.yaml # apps/* + packages/* + tools/* + e2e
โโโ package.json # root quality scripts + `od` bin
- "no agents found on PATH" โ install one of:
claude,codex,devin,gemini,opencode,cursor-agent,qwen,qodercli,copilot. Or switch to API mode in Settings and paste a provider key. - daemon 500 on /api/chat โ check the daemon terminal for the stderr tail; usually the CLI rejected its args. Different CLIs take different argv shapes; see
apps/daemon/src/agents.tsbuildArgsif you need to tweak. - media generation says
OD_BINis missing or daemon URL is:0โ run the media dispatcher checks above. Do not resume the old CLI session; reopen the project from the Open Design app so the daemon can inject freshOD_*variables. - Codex loads too much plugin context โ start Open Design with
OD_CODEX_DISABLE_PLUGINS=1 pnpm tools-devto make daemon-spawned Codex processes run with--disable plugins. - artifact never renders โ the model produced text without wrapping in
<artifact>. Confirm the system prompt is going through (check daemon log) and consider switching to a more capable model or a stricter skill.
This Quickstart is the runnable seed of the spec in docs/. The spec describes where this grows (see docs/roadmap.md). Highlights:
docs/architecture.mddescribes the shipped stack: Next.js 16 App Router in front, local daemon behind it, andapps/web/next.config.tsrewrites in dev to keep the browser talking to the same/apisurface.docs/skills-protocol.mddescribes the fullod:frontmatter (typed inputs, sliders, capability gating). This MVP readsname/description/triggers/od.mode/od.design_system.requiresonly โ extendapps/daemon/src/skills.tsto add the rest.docs/agent-adapters.mdforesees richer dispatch (capability detection, streaming tool-calls). Ourapps/daemon/src/agents.tsis a minimal dispatcher โ enough to prove the wiring.docs/modes.mdlists four modes: prototype / deck / template / design-system. We ship skills for the first two; the picker already filters bymode.