# Quickstart

English · Deutsch · 日本語

Run the full product locally. ## Environment requirements - **Node.js:** `~24` (Node 24.x). The repo enforces this through `package.json#engines`. - **pnpm:** `10.33.x`. The repo pins `pnpm@10.33.2` through `packageManager`; 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, 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: ```bash # nvm nvm install 24 nvm use 24 # fnm fnm install 24 fnm use 24 ``` Then enable Corepack and let the repo select pnpm: ```bash corepack enable corepack pnpm --version # should print 10.33.2 ``` ## One-shot (dev mode) ```bash corepack enable pnpm install pnpm tools-dev run web # starts daemon + web in the foreground # open the web URL printed by tools-dev ``` For the desktop shell and all managed sidecars in the background: ```bash pnpm tools-dev # starts daemon + web + desktop in the background ``` On first load, the app detects your installed code-agent CLI (Claude Code / Codex / Devin for Terminal / Gemini / OpenCode / Cursor Agent / Qwen), 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 `` 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/-/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`](https://github.com/bergside/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) and `magazine-web-ppt` (the `guizang-ppt` bundle from [`op7418/guizang-ppt-skill`](https://github.com/op7418/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 resolve `assets/template.html` and `references/*.md` against 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. ## Other scripts ```bash 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 build # production build + static export to apps/web/out/ pnpm typecheck # workspace typecheck ``` `pnpm 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. ## Media generation / agent dispatcher checks 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 to `apps/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: ```bash 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/health ``` Then 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: ```bash 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`. ```nginx 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; } ``` ## Two execution modes | Mode | Picker value | How a request flows | |---|---|---| | **Local CLI** (default when daemon detects an agent) | "Local CLI" | Frontend → daemon `/api/chat` → `spawn(, ...)` → stdout → SSE → artifact parser → preview | | **Anthropic API** (fallback / no CLI) | "Anthropic API · BYOK" | Frontend → `@anthropic-ai/sdk` direct (`dangerouslyAllowBrowser`) → artifact parser → preview | Both modes feed the **same** `` 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). ## Prompt composition 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 , 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. ## File map ``` 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/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 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// # per-project working dir + agent cwd ├── pnpm-workspace.yaml # apps/* + packages/* + tools/* + e2e └── package.json # root quality scripts + `od` bin ``` ## Troubleshooting - **"no agents found on PATH"** — install one of: `claude`, `codex`, `devin`, `gemini`, `opencode`, `cursor-agent`, `qwen`, `copilot`. Or switch to "Anthropic API · BYOK" in the top bar and paste a key in **Settings**. - **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.ts` `buildArgs` if you need to tweak. - **media generation says `OD_BIN` is 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 fresh `OD_*` variables. - **Codex loads too much plugin context** — start Open Design with `OD_CODEX_DISABLE_PLUGINS=1 pnpm tools-dev` to make daemon-spawned Codex processes run with `--disable plugins`. - **artifact never renders** — the model produced text without wrapping in ``. Confirm the system prompt is going through (check daemon log) and consider switching to a more capable model or a stricter skill. ## Mapping back to the vision This Quickstart is the runnable seed of the spec in [`docs/`](docs/). The spec describes where this grows (see [`docs/roadmap.md`](docs/roadmap.md)). Highlights: - `docs/architecture.md` describes the shipped stack: Next.js 16 App Router in front, local daemon behind it, and `apps/web/next.config.ts` rewrites in dev to keep the browser talking to the same `/api` surface. - `docs/skills-protocol.md` describes the full `od:` frontmatter (typed inputs, sliders, capability gating). This MVP reads `name` / `description` / `triggers` / `od.mode` / `od.design_system.requires` only — extend `apps/daemon/src/skills.ts` to add the rest. - `docs/agent-adapters.md` foresees richer dispatch (capability detection, streaming tool-calls). Our `apps/daemon/src/agents.ts` is a minimal dispatcher — enough to prove the wiring. - `docs/modes.md` lists four modes: prototype / deck / template / design-system. We ship skills for the first two; the picker already filters by `mode`.