English ยท Portuguรชs (Brasil) ยท Deutsch ยท Franรงais ยท ๆฅๆฌ่ช ยท ็ฎไฝไธญๆ ยท ็น้ซไธญๆ ยท ํ๊ตญ์ด
์ ํ ์ ์ฒด๋ฅผ ๋ก์ปฌ์์ ์คํํด ๋ณด์ธ์.
- Node.js:
~24(Node 24.x).package.json#engines๋ก ๋ฒ์ ์ ๊ฐ์ ํฉ๋๋ค. - pnpm:
10.33.x.packageManager์pnpm@10.33.2๋ฅผ ๊ณ ์ ํด ๋์์ผ๋, Corepack์ ์ฐ๋ฉด ๊ณ ์ ๋ ๋ฒ์ ์ด ์๋์ผ๋ก ์ ํ๋ฉ๋๋ค. - OS: macOS, Linux, WSL2๊ฐ ์ฃผ์ ์ง์ ํ๊ฒฝ์
๋๋ค. Windows ๋ค์ดํฐ๋ธ๋ ์ง์ํฉ๋๋ค. ์์ฃผ ๊ฒช๋ ์ค์น ๋ฌธ์ ๋
docs/windows-troubleshooting.md๋ฅผ ์ฐธ๊ณ ํ์ธ์. - ์ ํ: ๋ก์ปฌ ์์ด์ ํธ CLI: Claude Code, Codex, Devin for Terminal, Gemini CLI, OpenCode, Cursor Agent, Qwen, Qoder CLI, GitHub Copilot CLI ๋ฑ. ์ค์น๋ CLI๊ฐ ์์ผ๋ฉด Settings์์ BYOK API ๋ชจ๋๋ฅผ ์ฐ๋ฉด ๋ฉ๋๋ค.
daemon์ PATH(์ฌ๊ธฐ์ ๋ํด ์์ฃผ ์ฐ์ด๋ ์ฌ์ฉ์ ํด์ฒด์ธ ๋๋ ํฐ๋ฆฌ)๋ฅผ ์ค์บํฉ๋๋ค. **npm install -g**๋ Homebrew๋ก CLI๋ฅผ ์ค์นํ๋๋ฐ๋ Open Design์ด not installed๋ก ํ์ํ๋ค๋ฉด, GUI๊ฐ ์ต์ํ์ PATH๋ก ์์ํ๋ฉด์ ์ ์ญ npm์ด๋ Homebrew์ bin ๋๋ ํฐ๋ฆฌ๋ฅผ ํฌํจํ์ง ๋ชปํ ๊ฒฝ์ฐ์
๋๋ค(์ฑ์ด ์ ์ฒด ๋ก๊ทธ์ธ ์
ธ์์ ์คํ๋์ง ์์ macOS์์ ํํ ๋ฐ์). daemon์ ์คํํ๋ ํ๋ก์ธ์ค์ PATH์ ์คํ ํ์ผ ๋๋ ํฐ๋ฆฌ๊ฐ ๋ค์ด ์๋์ง ํ์ธํ ๋ค, Settings โ Execution mode์์ Rescan์ ๋๋ฅด์ธ์.
nvm / fnm์ ํธ์๋ฅผ ์ํ ์ ํ ๋๊ตฌ์ผ ๋ฟ, ํ๋ก์ ํธ ์ค์ ์ ๊ผญ ํ์ํ ๊ฒ์ ์๋๋๋ค. ๋ ์ค ํ๋๋ฅผ ์ด๋ค๋ฉด pnpm์ ์คํํ๊ธฐ ์ ์ Node 24๋ฅผ ์ค์นํ๊ณ ์ ํํ์ธ์.
# nvm
nvm install 24
nvm use 24
# fnm
fnm install 24
fnm use 24๊ทธ๋ค์ Corepack์ ์ผ๊ณ ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ pnpm์ ์ ํํ๋๋ก ํฉ๋๋ค.
corepack enable
corepack pnpm --version # 10.33.2๊ฐ ์ถ๋ ฅ๋์ด์ผ ํฉ๋๋คNode.js๋ pnpm์ ๋ก์ปฌ์ ์ค์นํ์ง ์๊ณ ๋, ์์ ํ ์ปจํ ์ด๋ํ๋ ํ๊ฒฝ์์ Open Design์ ์คํํ ์ ์์ต๋๋ค.
- Docker Desktop
- Docker Compose v2
Docker๊ฐ ์ ๋๋ก ์ค์น๋๋์ง ํ์ธํ์ธ์.
docker compose version๋ฆฌํฌ์งํ ๋ฆฌ ๋ฃจํธ์์ ์งํํฉ๋๋ค.
-
deploy ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ ๋ค ํ๊ฒฝ ๋ณ์ ํ ํ๋ฆฟ์ ๋ณต์ฌํฉ๋๋ค.
cd deploy cp .env.example .env -
์์ ํ ํ ํฐ์ ์์ฑํฉ๋๋ค.
openssl rand -hex 32
-
์๋ํฐ์์
.env๋ฅผ ์ด๊ณOD_API_TOKEN=์ ์ฐพ์, ๋ฐฉ๊ธ ์์ฑํ ํ ํฐ์ ๋ถ์ฌ ๋ฃ์ต๋๋ค.
์ด์ ์๋น์ค๋ฅผ ์์ํฉ๋๋ค.
docker compose up -d๋ธ๋ผ์ฐ์ ์์ ์ฑ์ ์ฝ๋๋ค.
http://localhost:7456
์ฒ์ ์์ํ ๋๋ Docker๊ฐ ์ต์ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์ค๋๋ผ ๋ช ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
docker compose logs -fdocker compose restartdocker compose downdocker compose pull
docker compose up -ddocker compose down -v๊ธฐ๋ณธ ์ค์ ์ ๋ฎ์ด์ฐ๋ ค๋ฉด deploy/.env ํ์ผ์ ๋ง๋์ธ์. ์ ๊ณต๋ ์์์์ ์์ํ๋ฉด ๋ฉ๋๋ค.
cp deploy/.env.example deploy/.envdeploy/.env๋ฅผ ํธ์งํด ์ง์ ๋ง๋ ํ ํฐ์ ๋ฃ๊ณ , ๋๋จธ์ง ๊ฐ๋ ํ์์ ๋ง๊ฒ ์กฐ์ ํฉ๋๋ค.
# ํธ์คํธ์ ๋
ธ์ถํ ํฌํธ
OPEN_DESIGN_PORT=7456
# ์ปจํ
์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ ํ
OPEN_DESIGN_MEM_LIMIT=384m
# ํ์ฉํ CORS origin
OPEN_DESIGN_ALLOWED_ORIGINS=https://yourdomain.com
# Docker ์ด๋ฏธ์ง ํ๊ทธ
OPEN_DESIGN_IMAGE=ghcr.io/nexu-io/od:latest
# daemon ๋ณด์์ ํ์ํ API ํ ํฐ
# ์์ฑ ๋ฐฉ๋ฒ: openssl rand -hex 32
OD_API_TOKEN=์๊ตฌ daemon ์ ์ฅ ๊ฒฝ๋ก๋ฅผ ๋ฌธ์ํํ๊ฑฐ๋, ๋ณ๊ฒฝํ๊ฑฐ๋, ์ ํํ๊ธฐ ์ ์
๋ฐ๋์ ๋ฃจํธ AGENTS.md์ Daemon data directory contract๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค.
์ด Quickstart๋ ๊ทธ ๊ณ์ฝ์ ๋ค์ ์์ ํ๊ฑฐ๋ ์ ์ฅ ๊ฒฝ๋ก๋ฅผ ์ ์ํด์๋ ์ ๋ฉ๋๋ค.
- Docker ๋ชจ๋๋ ๋ก์ปฌ์ Node.js๋ pnpm์ ์ค์นํ๊ณ ์ถ์ง ์์ ๊ธฐ์ฌ์์๊ฒ ์ ํฉํฉ๋๋ค.
- ์ปจํ
์ด๋๋ ํ๋ก๋์
daemon ๋น๋๋ฅผ
7456ํฌํธ์ ์ง์ ๋ ธ์ถํฉ๋๋ค. - ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ๋ ๊น์ ๋ก์ปฌ ์ค์ ์ ์ด ๋น ๋ฅธ ์์ ๊ฐ์ด๋์ ๋๋จธ์ง ๋ถ๋ถ์ ์ฐธ๊ณ ํ์ธ์.
corepack enable
pnpm install
pnpm tools-dev run web # daemon + web์ ํฌ๊ทธ๋ผ์ด๋๋ก ์์ํฉ๋๋ค
# tools-dev๊ฐ ์ถ๋ ฅํ web URL์ ์ฝ๋๋ค๋ฐ์คํฌํฑ ์ ธ๊ณผ ๊ด๋ฆฌ ๋์ sidecar ์ ๋ถ๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ๋ ค๋ฉด:
pnpm tools-dev # daemon + web + desktop์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์์ํฉ๋๋ค์ฒ์ ๋ก๋ํ ๋ ์ฑ์ ์ค์น๋ ์ฝ๋ ์์ด์ ํธ CLI(Claude Code / Codex / Gemini / OpenCode / Cursor Agent / Qwen)๋ฅผ ๊ฐ์งํด ์๋์ผ๋ก ์ ํํ๊ณ , ๊ธฐ๋ณธ๊ฐ์ผ๋ก web-prototype skill๊ณผ Neutral Modern design system์ ์ฌ์ฉํฉ๋๋ค. ํ๋กฌํํธ๋ฅผ ์
๋ ฅํ๊ณ Send๋ฅผ ๋๋ฅด์ธ์. ์์ด์ ํธ ์ถ๋ ฅ์ ์ผ์ชฝ ํจ๋์ ์คํธ๋ฆฌ๋ฐ๋๊ณ , <artifact> ํ๊ทธ๊ฐ ํ์ฑ๋์ด HTML์ด ์ค๋ฅธ์ชฝ์ ์ค์๊ฐ์ผ๋ก ๋ ๋๋ง๋ฉ๋๋ค. ์๋ฃ๋๋ฉด Save to disk๋ก artifact๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. artifact ์ ์ฅ ๊ฒฝ๋ก๋ฅผ ๋ฌธ์ํํ๊ฑฐ๋ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ๋ฐ๋์ ๋ฃจํธ AGENTS.md์ Daemon data directory contract๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค.
Design system ๋๋กญ๋ค์ด์๋ 71๊ฐ์ ๋ด์ฅ ์์คํ
์ด ๋ค์ด ์์ต๋๋ค. ์ง์ ์์ฑํ ์คํํฐ 2๊ฐ(Neutral Modern, Warm Editorial)์ awesome-design-md์์ ๊ฐ์ ธ์จ 69๊ฐ์ ์ ํ ์์คํ
์ผ๋ก, ์นดํ
๊ณ ๋ฆฌ๋ณ(AI & LLM, Developer Tools, Productivity, Backend, Design Tools, Fintech, E-Commerce, Media, Automotive)๋ก ๋ฌถ์ฌ ์์ต๋๋ค. ํ๋๋ฅผ ๊ณ ๋ฅด๋ฉด ๋ชจ๋ ํ๋กํ ํ์
์ด ๊ทธ ๋ธ๋๋์ ๋ฏธ๊ฐ์ผ๋ก ์
ํ์ง๋๋ค. ์ฌ๊ธฐ์ awesome-design-skills์์ ๊ฐ์ ธ์จ 57๊ฐ์ ๋์์ธ skill๋ ํจ๊ป ์ ๊ณต๋ฉ๋๋ค.
Skill ๋๋กญ๋ค์ด์ ๋ชจ๋๋ณ(Prototype / Deck / Template / Design system)๋ก ๋ฌถ์ด๋ฉฐ, ๊ฐ ๋ชจ๋์ ๊ธฐ๋ณธ skill์๋ ยท default ์ ๋ฏธ์ฌ๊ฐ ๋ถ์ต๋๋ค. ํจ๊ป ์ ๊ณต๋๋ skill์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Prototype โ
web-prototype(๋ฒ์ฉ),saas-landing,dashboard,pricing-page,docs-page,blog-post,mobile-app. - Deck / PPT โ
simple-deck(๋จ์ผ ํ์ผ ๊ฐ๋ก ์ค์์ดํ)๊ณผmagazine-web-ppt(op7418/guizang-ppt-skill์์ ๊ฐ์ ธ์จguizang-ppt๋ฒ๋ค. deck ๋ชจ๋์ ๊ธฐ๋ณธ๊ฐ์ด๋ฉฐ, ์์ฒด ์์ /ํ ํ๋ฆฟ๊ณผ ๋ ํผ๋ฐ์ค 4๊ฐ๋ฅผ ํจ๊ป ์ ๊ณต). ์ฌ์ด๋ ํ์ผ์ด ์๋ skill์๋ "Skill root (absolute)" ๋จธ๋ฆฌ๋ง์ด ์๋์ผ๋ก ๋ถ์ด, ์์ด์ ํธ๊ฐassets/template.html์ด๋references/*.md๋ฅผ CWD๊ฐ ์๋๋ผ ์ค์ ๋์คํฌ ๊ฒฝ๋ก ๊ธฐ์ค์ผ๋ก ํด์ํ ์ ์์ต๋๋ค.
skill๊ณผ ๋์์ธ ์์คํ ์ ์ง์ง์ผ๋ฉด, ํ๋กฌํํธ ํ๋๋ก ์ ํํ ์๊ฐ ์ธ์ด์ ๋ง๋ ํ๋กํ ํ์ ์ด๋ deck์ด ๋ ์ด์์์ ๋ง๊ฒ ์์ฑ๋ฉ๋๋ค.
pnpm tools-dev # daemon + web + desktop์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก
pnpm tools-dev start web # daemon + web์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก
pnpm tools-dev run web # daemon + web์ ํฌ๊ทธ๋ผ์ด๋๋ก (e2e/dev ์๋ฒ)
pnpm tools-dev restart # daemon + web + desktop ์ฌ์์
pnpm tools-dev restart --daemon-port 7457 --web-port 5175
pnpm tools-dev status # ๊ด๋ฆฌ ์ค์ธ ๋ฐํ์ ํ์ธ
pnpm tools-dev logs # daemon/web/desktop ๋ก๊ทธ ๋ณด๊ธฐ
pnpm tools-dev check # ์ํ + ์ต๊ทผ ๋ก๊ทธ + ์ผ๋ฐ ์ง๋จ
pnpm tools-dev stop # ๊ด๋ฆฌ ์ค์ธ ๋ฐํ์ ์ค์ง
pnpm --filter @open-design/daemon build # `od`์ฉ apps/daemon/dist/cli.js ๋น๋
pnpm --filter @open-design/web build # ํ์ํ ๋ web ํจํค์ง ๋น๋
pnpm typecheck # ์ํฌ์คํ์ด์ค ํ์
์ฒดํฌ๋ก์ปฌ ๋ผ์ดํ์ฌ์ดํด์ ์ง์
์ ์ pnpm tools-dev ํ๋๋ฟ์
๋๋ค. ์ญ์ ๋ ์ ๋ฃจํธ alias(pnpm dev, pnpm dev:all, pnpm daemon, pnpm preview, pnpm start)๋ ์ฐ์ง ๋ง์ธ์.
๋ก์ปฌ ๊ฐ๋ฐ ์ค์๋ tools-dev๊ฐ daemon์ ๋จผ์ ๋์ฐ๊ณ ๊ทธ ํฌํธ๋ฅผ apps/web์ ๋๊น๋๋ค. apps/web/next.config.ts๋ /api/*, /artifacts/*, /frames/*๋ฅผ ๊ทธ daemon ํฌํธ๋ก ๋ค์ ๋งคํํ๋ฏ๋ก, App Router ์ฑ์ด CORS ์ค์ ์์ด๋ ์์์ ๋๋ Express ํ๋ก์ธ์ค์ ํต์ ํ ์ ์์ต๋๋ค.
์ด๋ฏธ์ง, ๋น๋์ค, ์ค๋์ค, HyperFrames skill์ daemon์ด ์์ด์ ํธ๋ฅผ spawnํ ๋ ์ฃผ์
ํ๋ ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ๋ก์ปฌ od CLI๋ฅผ ํธ์ถํฉ๋๋ค.
OD_BINโapps/daemon/dist/cli.js์ ์ ๋ ๊ฒฝ๋ก.OD_DAEMON_URLโ ์คํ ์ค์ธ daemon URL.OD_PROJECT_IDโ ํ์ฑ ํ๋ก์ ํธ id.OD_PROJECT_DIRโ ํ์ฑ ํ๋ก์ ํธ์ ํ์ผ ๋๋ ํฐ๋ฆฌ.
๋ฏธ๋์ด ์์ฑ์ด OD_BIN: parameter not set, apps/daemon/dist/cli.js ๋๋ฝ, failed to reach daemon at http://127.0.0.1:0 ๊ฐ์ ๋ฉ์์ง๋ก ์คํจํ๋ฉด, daemon CLI๋ฅผ ๋ค์ ๋น๋ํ๊ณ ๊ด๋ฆฌ ์ค์ธ ๋ฐํ์์ ์ฌ์์ํ์ธ์.
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๊ทธ๋ค์ ์ค๋๋ ํฐ๋ฏธ๋ ์์ด์ ํธ ์ธ์ ์ ์ด์ด ๊ฐ์ง ๋ง๊ณ , Open Design ์ฑ์์ ํ๋ก์ ํธ๋ฅผ ๋ค์ ์ฌ์ธ์. daemon์ด spawnํ ์์ด์ ํธ๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ด ๋ณด์ฌ์ผ ํฉ๋๋ค.
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์ http://127.0.0.1:7457์ฒ๋ผ ์ค์ daemon ํฌํธ์ฌ์ผ ํ๋ฉฐ, http://127.0.0.1:0์ด์ด์๋ ์ ๋ฉ๋๋ค. :0 ๊ฐ์ "๋น ํฌํธ๋ฅผ ๊ณจ๋ผ๋ผ"๋ผ๋ ๋ด๋ถ ์คํ ํํธ์ผ ๋ฟ์ด๋ผ, ์์ด์ ํธ ์ธ์
์ผ๋ก ์์ด ๋๊ฐ๋ฉด ์ ๋ฉ๋๋ค.
daemon ๋จ๋
ํ๋ก๋์
๋ชจ๋์์๋ daemon์ด ์ ์ Next.js export๋ฅผ http://localhost:7456์์ ์ง์ ์๋นํ๋ฏ๋ก, reverse proxy๊ฐ ๋ผ์ด๋ค์ง ์์ต๋๋ค.
daemon ์์ nginx๋ฅผ ๋๋ค๋ฉด, SSE ๊ฒฝ๋ก๋ ๋ฒํผ๋ง๊ณผ ์์ถ์ ๋์ธ์. ํํ ์คํจ๋ 80~90์ด ๋ค ๋ธ๋ผ์ฐ์ ์ฝ์์ net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)๊ฐ ๋จ๋ ๊ฒฝ์ฐ์
๋๋ค. daemon์ด X-Accel-Buffering: no๋ฅผ ๋ณด๋ด๋ nginx์ gzip on์ด ์ฒญํฌ SSE ์๋ต์ ๋ฒํผ๋งํ๊ธฐ ๋๋ฌธ์
๋๋ค.
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;
}| ๋ชจ๋ | ์ ํ๊ฐ | ์์ฒญ์ด ํ๋ฅด๋ ๊ฒฝ๋ก |
|---|---|---|
| Local CLI (daemon์ด ์์ด์ ํธ๋ฅผ ๊ฐ์งํ๋ฉด ๊ธฐ๋ณธ๊ฐ) | "Local CLI" | ํ๋ก ํธ์๋ โ daemon /api/chat โ spawn(<agent>, ...) โ stdout โ SSE โ artifact ํ์ โ ๋ฏธ๋ฆฌ๋ณด๊ธฐ |
| API ๋ชจ๋ (๋์ฒด ์๋จ / CLI ์์) | "Anthropic API" / "OpenAI API" / "Azure OpenAI" / "Google Gemini" | ํ๋ก ํธ์๋ โ daemon /api/proxy/{provider}/stream โ ํ๋ก๋ฐ์ด๋ SSE๋ฅผ delta/end/error๋ก ์ ๊ทํ โ artifact ํ์ โ ๋ฏธ๋ฆฌ๋ณด๊ธฐ |
๋ ๋ชจ๋ ๋ชจ๋ ๊ฐ์ <artifact> ํ์์ ๊ฐ์ ์๋๋ฐ์ค iframe์ผ๋ก ๋ค์ด๊ฐ๋๋ค. ๋ค๋ฅธ ์ ์ ์ ์ก ๋ฐฉ์๊ณผ ์์คํ
ํ๋กฌํํธ ์ ๋ฌ ๋ฐฉ์๋ฟ์
๋๋ค(๋ก์ปฌ CLI๋ ๋ณ๋์ ์์คํ
์ฑ๋์ด ์์ด์, ์กฐํฉ๋ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉ์ ๋ฉ์์ง ์์ ์ ์ด ๋ฃ์ต๋๋ค).
์ ์กํ ๋๋ง๋ค ์ฑ์ ์ธ ๊ฐ์ ๋ ์ด์ด๋ก ์์คํ ํ๋กฌํํธ๋ฅผ ๋ง๋ค์ด ํ๋ก๋ฐ์ด๋์ ๋ณด๋ ๋๋ค.
BASE_SYSTEM_PROMPT (์ถ๋ ฅ ๊ท์ฝ: <artifact>๋ก ๊ฐ์ธ๊ณ , ์ฝ๋ ํ์ค๋ ์ฐ์ง ์๋๋ค)
+ ํ์ฑ ๋์์ธ ์์คํ
๋ณธ๋ฌธ (DESIGN.md โ ํ๋ ํธ/ํ์
/๋ ์ด์์)
+ ํ์ฑ skill ๋ณธ๋ฌธ (SKILL.md โ ์ํฌํ๋ก์ฐ์ ์ถ๋ ฅ ๊ท์น)
์๋จ ๋ฐ์์ skill์ด๋ ๋์์ธ ์์คํ ์ ๋ฐ๊พธ๋ฉด, ๋ค์ ์ ์ก๋ถํฐ ์ ์กฐํฉ์ด ์ ์ฉ๋ฉ๋๋ค. ๋ณธ๋ฌธ์ ์ธ์ ๋ณ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์บ์๋๋ฏ๋ก, ํ ๋ฒ ์ ํํ ๋ daemon์ ํ ๋ฒ๋ง ์์ฒญํฉ๋๋ค.
open-design/
โโโ apps/
โ โโโ daemon/ # Node/Express โ ๋ก์ปฌ ์์ด์ ํธ spawn + API ์๋น
โ โ โโโ src/
โ โ โโโ cli.ts # `od` bin ์ง์
์
โ โ โโโ server.ts # /api/* + ์ ์ ์๋น
โ โ โโโ agents.ts # claude/codex/devin/gemini/opencode/cursor-agent/qwen/qoder/copilot์ฉ PATH ์ค์บ๋
โ โ โโโ skills.ts # SKILL.md ๋ก๋ (frontmatter ํ์)
โ โ โโโ design-systems.ts # DESIGN.md ๋ก๋
โ โ โโโ sidecar/ # tools-dev daemon sidecar ๋ํผ
โ โ โโโ tests/ # daemon ํจํค์ง ํ
์คํธ
โ โโโ web/ # Next.js 16 App Router + React ํด๋ผ์ด์ธํธ
โ โโโ app/ # App Router ์ง์
์
โ โโโ src/ # React + TypeScript ํด๋ผ์ด์ธํธ/๋ฐํ์ ๋ชจ๋
โ โ โโโ App.tsx # ๋ชจ๋ / skill / DS ์ ํ๊ธฐ + ์ ์ก ์กฐ์จ
โ โ โโโ providers/ # daemon + BYOK API ์ ์ก ๊ณ์ธต
โ โ โโโ prompts/ # system, discovery, directions, deck framework
โ โ โโโ artifacts/ # ์คํธ๋ฆฌ๋ฐ <artifact> ํ์ + manifest
โ โ โโโ runtime/ # iframe srcdoc, markdown, export ํฌํผ
โ โ โโโ state/ # localStorage + daemon ๊ธฐ๋ฐ ํ๋ก์ ํธ ์ํ
โ โโโ sidecar/ # tools-dev web sidecar ๋ํผ
โ โโโ next.config.ts # tools-dev rewrite + prod apps/web/out export ์ค์
โ โโโ desktop/ # tools-dev๊ฐ ์คํ/์ ๊ฒํ๋ Electron ๋ฐํ์
โโโ packages/
โ โโโ contracts/ # ๊ณต์ web/daemon ์ฑ contract
โ โโโ sidecar-proto/ # Open Design sidecar ํ๋กํ ์ฝ contract
โ โโโ sidecar/ # ๋ฒ์ฉ sidecar ๋ฐํ์ ํ๋ฆฌ๋ฏธํฐ๋ธ
โ โโโ platform/ # ๋ฒ์ฉ process/platform ํ๋ฆฌ๋ฏธํฐ๋ธ
โโโ tools/dev/ # `pnpm tools-dev` ๋ผ์ดํ์ฌ์ดํด ๋ฐ inspect CLI
โโโ e2e/ # Playwright UI + ์ธ๋ถ ํตํฉ/Vitest ํ๋ค์ค
โโโ skills/ # SKILL.md โ ์ด๋ค Claude Code skill ๋ฆฌํฌ์งํ ๋ฆฌ์์๋ ๊ทธ๋๋ก ๋ฃ์ ์ ์์
โ โโโ web-prototype/ # ๋ฒ์ฉ ๋จ์ผ ํ๋ฉด ํ๋กํ ํ์
(prototype ๋ชจ๋ ๊ธฐ๋ณธ๊ฐ)
โ โโโ saas-landing/ # ๋ง์ผํ
ํ์ด์ง (hero / features / pricing / CTA)
โ โโโ dashboard/ # ๊ด๋ฆฌ์ / ๋ถ์ ๋์๋ณด๋
โ โโโ pricing-page/ # ๋จ๋
๊ฐ๊ฒฉ + ๋น๊ต
โ โโโ docs-page/ # 3๋จ ๋ฌธ์ ๋ ์ด์์
โ โโโ blog-post/ # ์๋ํ ๋ฆฌ์ผ ๋กฑํผ
โ โโโ mobile-app/ # ํด๋ํฐ ํ๋ ์ ๋จ์ผ ํ๋ฉด
โ โโโ simple-deck/ # ๋ฏธ๋๋ฉ ๊ฐ๋ก ์ค์์ดํ deck
โ โโโ guizang-ppt/ # magazine-web-ppt โ ๋ฒ๋ค๋ deck/PPT ๊ธฐ๋ณธ๊ฐ
โ โโโ SKILL.md
โ โโโ assets/template.html
โ โโโ references/{themes,layouts,components,checklist}.md
โโโ design-systems/ # DESIGN.md โ 9๊ฐ ์น์
์คํค๋ง (awesome-claude-design)
โ โโโ default/ # Neutral Modern (์คํํฐ)
โ โโโ warm-editorial/ # Warm Editorial (์คํํฐ)
โ โโโ README.md # ์นดํ๋ก๊ทธ ๊ฐ์
โ โโโ โฆ129๊ฐ ์์คํ
# ์คํํฐ 2๊ฐ ยท ์ ํ ์์คํ
70๊ฐ ยท ๋์์ธ skill 57๊ฐ
โโโ scripts/sync-design-systems.ts # ์
์คํธ๋ฆผ getdesign tarball์์ ๋ค์ import
โโโ docs/ # ์ ํ ๋น์ + ์คํ
โโโ pnpm-workspace.yaml # apps/* + packages/* + tools/* + e2e
โโโ package.json # ๋ฃจํธ ํ์ง ์คํฌ๋ฆฝํธ + `od` bin
- Node.js ๋ฒ์ ์ ๋ฐ๊พผ ๋ค
better-sqlite3๊ฐ ๋ก๋๋์ง ์๊ฑฐ๋ ABI๊ฐ ๋ง์ง ์์ ๋ โpnpm install์ดpostinstall์ ์๋์ผ๋ก ๋ค์ ๋๋ ค ํ์ฌ Node.js์ ๋ง๊ฒ ๋ค์ดํฐ๋ธ ์ ๋์จ์ ๋ฆฌ๋น๋ํฉ๋๋ค. ์ง์ ๋ฆฌ๋น๋ํ๊ฑฐ๋ ์์ ์ ํ์ธํ๋ ค๋ฉดpnpm --filter @open-design/daemon rebuild better-sqlite3๋ฅผ ์คํํ ๋คpnpm --filter @open-design/daemon exec node -e "require('better-sqlite3')"๋ฅผ ๋๋ฆฌ์ธ์. ๋น๋ ๋๊ตฌpython3,make,g++(๋๋clang++)๊ฐ ํ์ํฉ๋๋ค..npmrc์ignore-scripts=true๊ฐ ์๋ค๋ฉด,pnpm installํnode scripts/postinstall.mjs๋ฅผ ์คํํ์ธ์. - "no agents found on PATH" โ
claude,codex,devin,gemini,opencode,cursor-agent,qwen,qodercli,copilot์ค ํ๋๋ฅผ ์ค์นํ์ธ์. ์๋๋ฉด Settings์์ API ๋ชจ๋๋ก ๋ฐ๊พธ๊ณ ํ๋ก๋ฐ์ด๋ ํค๋ฅผ ๋ถ์ฌ ๋ฃ์ผ์ธ์. - Claude Code๊ฐ ์ฝ๋ 1๋ก ์ข
๋ฃ๋ ๋ โ Open Design์ด
claude๋ฅผ ์์ํ๊ธด ํ์ง๋ง, spawn๋ ๋น๋ํํ ์คํ์ด ์๋ต์ ๋ด๊ธฐ ์ ์ ์คํจํ ๊ฒฝ์ฐ์ ๋๋ค. Open Design์ ์์ํ๋ ์ ธ์ด๋ ์ฑ ํ๊ฒฝ๊ณผ ๊ฐ์ ๊ณณ์์ ๋ค์์ ํ์ธํ์ธ์.์ค๋ชจํฌ ํ ์คํธ๊ฐ ์ปค์คํ ์๋ํฌ์ธํธ ์์ดclaude --version claude auth status --text printf 'hello' | claude -p --output-format stream-json --verbose --permission-mode bypassPermissions
401,apiKeySource: "none", ๋๋ ๋ค๋ฅธ ์ธ์ฆ ์ค๋ฅ๋ฅผ ๋ธ๋ค๋ฉด,claude๋ฅผ ์คํํด/loginํ ๋ค Claude๋ฅผ ์ข ๋ฃํ๊ณ Open Design์ ๋ค์ ์๋ํ์ธ์. Claude ํ๋กํ์ ์ฌ๋ฌ ๊ฐ ์ด๋ค๋ฉด Settings -> Execution mode -> Claude Code config directory๋ฅผ~/.claude-2๊ฐ์ ํ๋กํ ๊ฒฝ๋ก๋ก ์ง์ ํ์ธ์.ANTHROPIC_BASE_URL์ด๋ ํ๋ก์๊ฐ ์ค์ ๋ผ ์๋ค๋ฉด ์๋ํฌ์ธํธ URL, ํ๋ก์ ์๊ฒฉ ์ฆ๋ช , ์๋ํฌ์ธํธ ์ธ์ฆ ํ๊ฒฝ, ๋ชจ๋ธ ์ ๊ทผ ๊ถํ์ ํ์ธํ์ธ์. ํ์ค Claude Code ์ธ์ฆ์ผ๋ก ๋ค์ ์๋ํ๋ ค๋ ๊ฒ ์๋๋ผ๋ฉด ์ปค์คํ ์๋ํฌ์ธํธ๋ ๊ทธ๋๋ก ๋์ธ์. Windows์์๋ ๋ค์ดํฐ๋ธ PowerShell๊ณผ WSL์ด ์๋ก ๋ค๋ฅธ Claude ์ค์น๋ณธ๊ณผ ์๊ฒฉ ์ฆ๋ช ์ ์ฅ์๋ฅผ ์ฐ๋ฏ๋ก, Open Design์ด ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ํ๊ฒฝ์์ ๋ค์ ์ธ์ฆํ๊ณ ,/login์ผ๋ก๋ ๋ค์ดํฐ๋ธ Windows ์๊ฒฉ ์ฆ๋ช ์ด ๋ณต๊ตฌ๋์ง ์์ผ๋ฉด Windows ์๊ฒฉ ์ฆ๋ช ๊ด๋ฆฌ์๋ฅผ ํ์ธํ์ธ์. /api/chat์์ daemon 500 โ daemon ํฐ๋ฏธ๋์ stderr ๋๋ถ๋ถ์ ํ์ธํ์ธ์. ๋๊ฐ CLI๊ฐ ์์ ์ ์ธ์๋ฅผ ๊ฑฐ๋ถํ ๊ฒฝ์ฐ์ ๋๋ค. CLI๋ง๋ค ๋ฐ๋ argv ํํ๊ฐ ๋ค๋ฆ ๋๋ค. ์๋ด์ผ ํ๋ค๋ฉดapps/daemon/src/agents.ts์buildArgs๋ฅผ ๋ณด์ธ์.- ๋ฏธ๋์ด ์์ฑ์ด
OD_BIN๋๋ฝ ๋๋ daemon URL์ด:0์ด๋ผ๊ณ ํ ๋ โ ์์ ๋ฏธ๋์ด dispatcher ์ ๊ฒ์ ์คํํ์ธ์. ์ CLI ์ธ์ ์ ์ด์ด ๊ฐ์ง ๋ง๊ณ , Open Design ์ฑ์์ ํ๋ก์ ํธ๋ฅผ ๋ค์ ์ด์ด daemon์ด ์OD_*๋ณ์๋ฅผ ์ฃผ์ ํ๊ฒ ํ์ธ์. - Codex๊ฐ ํ๋ฌ๊ทธ์ธ ์ปจํ
์คํธ๋ฅผ ๋๋ฌด ๋ง์ด ๋ก๋ํ ๋ โ
OD_CODEX_DISABLE_PLUGINS=1 pnpm tools-dev๋ก Open Design์ ์์ํ๋ฉด, daemon์ด spawnํ๋ Codex ํ๋ก์ธ์ค๊ฐ--disable plugins๋ก ์คํ๋ฉ๋๋ค. - artifact๊ฐ ๋๋ด ๋ ๋๋ง๋์ง ์์ ๋ โ ๋ชจ๋ธ์ด
<artifact>๋ก ๊ฐ์ธ์ง ์์ ํ ์คํธ๋ฅผ ๋ง๋ ๊ฒฝ์ฐ์ ๋๋ค. ์์คํ ํ๋กฌํํธ๊ฐ ์ ๋๋ก ์ ๋ฌ๋๋์ง ํ์ธํ๊ณ (daemon ๋ก๊ทธ ํ์ธ), ๋ ๊ฐ๋ ฅํ ๋ชจ๋ธ์ด๋ ๋ ์๊ฒฉํ skill๋ก ๋ฐ๊ฟ ๋ณด์ธ์.
์ด ๋น ๋ฅธ ์์์ docs/์ ๋ด๊ธด ์คํ์ ์ค์ ๋ก ๋๋ฆด ์ ์๊ฒ ๋ง๋ ์จ์์
๋๋ค. ์คํ์ ์ด๊ฒ์ด ์ด๋๋ก ์๋ผ๋ ์ง ์ค๋ช
ํฉ๋๋ค(docs/roadmap.md ์ฐธ๊ณ ). ํต์ฌ๋ง ์ง์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
docs/architecture.md๋ ์ถ์๋ ์คํ์ ์ค๋ช ํฉ๋๋ค. ์๋จ์ Next.js 16 App Router, ๊ทธ ๋ค์ ๋ก์ปฌ daemon, ๊ทธ๋ฆฌ๊ณ dev์์apps/web/next.config.ts์ rewrite๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ฐ์/apiํ๋ฉด๊ณผ ๊ณ์ ํต์ ํ๊ฒ ์ ์งํ๋ ๊ตฌ์กฐ์ ๋๋ค.docs/skills-protocol.md๋od:frontmatter ์ ์ฒด(ํ์ ์ ๋ ฅ, ์ฌ๋ผ์ด๋, ๊ธฐ๋ฅ ๊ฒ์ดํ )๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ด MVP๋name/description/triggers/od.mode/od.design_system.requires๋ง ์ฝ์ต๋๋ค. ๋๋จธ์ง๋ฅผ ์ถ๊ฐํ๋ ค๋ฉดapps/daemon/src/skills.ts๋ฅผ ํ์ฅํ์ธ์.docs/agent-adapters.md๋ ๋ ํ๋ถํ dispatch(๊ธฐ๋ฅ ๊ฐ์ง, ์คํธ๋ฆฌ๋ฐ tool-call)๋ฅผ ๋ด๋ค๋ด ๋๋ค. ์ฐ๋ฆฌ์apps/daemon/src/agents.ts๋ ๋ฐฐ์ ์ ์ฆ๋ช ํ ๋งํผ๋ง ๊ฐ์ถ ์ต์ dispatcher์ ๋๋ค.docs/modes.md๋ ๋ค ๊ฐ์ง ๋ชจ๋๋ฅผ ๋์ดํฉ๋๋ค. prototype / deck / template / design-system. ์ฐ๋ฆฌ๋ ์์ ๋ ๊ฐ์ง๋ฅผ ์ํ skill์ ์ ๊ณตํ๋ฉฐ, ์ ํ๊ธฐ๋ ์ด๋ฏธmode๋ก ํํฐ๋งํฉ๋๋ค.