hermes atlas
aprยท2026 155ยทrepos hermesยทv0.10.0 โ˜… star this repo

nexu-io/open-design

๐ŸŽจ Local-first, open-source Claude Design alternative. ๐Ÿ–ฅ๏ธ Native desktop app. โšก 100+ Skills ยท โœจ 100+ Design Systems ๐Ÿ–ผ๏ธ Web ยท desktop ยท mobile prototypes ยท slides ยท images ยท videos ยท HyperFrames ๐Ÿ“ฆ Sandboxed preview ยท HTML/PDF/PPTX/MP4 export ๐Ÿค– Claude Code / OpenClaw / Codex / Cursor / OpenCode / Qwen / Copilot / Hermes / Kimi & 17+ CLIs.

โ˜… 54.5K langTypeScript licenseApache-2.0 updated2026-05-28

Open Design is a local-first, open-source prototyping system designed to replace proprietary cloud-based design tools. It functions by auto-detecting and orchestrating existing coding-agent CLIs on a user's machine to generate design artifacts through a skill-driven workflow. The system integrates 132 composable skills and 150 design systems to produce high-fidelity layouts, pitch decks, and web components. It supports a wide range of agents including Hermes, Claude Code, and DeepSeek TUI via a local daemon and web-deployable interface.

  • Orchestrates 16 coding-agent CLIs including Hermes and Claude Code
  • Features 132 composable skills and 150 brand-grade design systems
  • Provides sandboxed iframe previews with multi-format export capabilities
full readme from github

Open Design โ€” the open-source Claude Design alternative

Open Design is the open-source, local-first alternative to [Claude Design][cd]. Web-deployable, BYOK at every layer โ€” 16 coding-agent CLIs auto-detected on your PATH (Claude Code, Codex, Devin for Terminal, Cursor Agent, Gemini CLI, OpenCode, Qwen, Qoder CLI, GitHub Copilot CLI, Hermes, Kimi, Pi, Kiro, Kilo, Mistral Vibe, DeepSeek TUI) become the design engine, driven by 132 composable Skills and 150 brand-grade Design Systems. No CLI? An OpenAI-compatible BYOK proxy is the same loop minus the spawn.

[!IMPORTANT]

๐Ÿ”ฅ 0.8.0-preview is here. Design's old world ends here.

The open-source alternative to Claude Design / Figma โ€” 40k stars in two weeks got us this far. We need you to push the rest of the way.

Iterating fast on main โ€” 0.8.0 is the next phase of Open Design. Ship a PR, drop a wild idea, file a bug โ€” what you bring is what this movement becomes.

โ†’ Read the announcement, grab the installer, join the movement ยท runs side-by-side with your current 0.7.

Open Design โ€” editorial cover: design with the agent on your laptop

Stars Forks Issues Pull Requests Contributors Commit activity Last commit

Download Latest release License Agents Design systems Skills Discord Follow @nexudotio on X Quickstart

English ยท Espaรฑol ยท Portuguรชs (Brasil) ยท Deutsch ยท Franรงais ยท ็ฎ€ไฝ“ไธญๆ–‡ ยท ็น้ซ”ไธญๆ–‡ ยท ํ•œ๊ตญ์–ด ยท ๆ—ฅๆœฌ่ชž ยท ุงู„ุนุฑุจูŠุฉ ยท ะ ัƒััะบะธะน ยท ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท Tรผrkรงe


Why this exists

Anthropic's [Claude Design][cd] (released 2026-04-17, Opus 4.7) showed what happens when an LLM stops writing prose and starts shipping design artifacts. It went viral โ€” and stayed closed-source, paid-only, cloud-only, locked to Anthropic's model and Anthropic's skills. There is no checkout, no self-host, no Vercel deploy, no swap-in-your-own-agent.

Open Design (OD) is the open-source alternative. Same loop, same artifact-first mental model, none of the lock-in. We don't ship an agent โ€” the strongest coding agents already live on your laptop. We wire them into a skill-driven design workflow that runs locally with pnpm tools-dev, can deploy the web layer to Vercel, and stays BYOK at every layer.

Type make me a magazine-style pitch deck for our seed round. The interactive question form pops up before the model improvises a single pixel. The agent picks one of five curated visual directions. A live TodoWrite plan streams into the UI. The daemon builds a real on-disk project folder with a seed template, layout library, and self-check checklist. The agent reads them โ€” pre-flight enforced โ€” runs a five-dimensional critique against its own output, and emits a single <artifact> that renders in a sandboxed iframe seconds later.

That's not "AI tries to design something". That's an AI that has been trained, by the prompt stack, to behave like a senior designer with a working filesystem, a deterministic palette library, and a checklist culture โ€” exactly the bar Claude Design set, but open and yours.

OD stands on four open-source shoulders:

  • alchaincyf/huashu-design โ€” the design-philosophy compass. Junior-Designer workflow, the 5-step brand-asset protocol, the anti-AI-slop checklist, the 5-dimensional self-critique, and the "5 schools ร— 20 design philosophies" idea behind our direction picker โ€” all distilled into apps/daemon/src/prompts/discovery.ts.
  • op7418/guizang-ppt-skill โ€” the deck mode. Bundled verbatim under skills/guizang-ppt/ with original LICENSE preserved; magazine-style layouts, WebGL hero, P0/P1/P2 checklists.
  • OpenCoworkAI/open-codesign โ€” the UX north star and our closest peer. The first open-source Claude-Design alternative. We borrow its streaming-artifact loop, its sandboxed-iframe preview pattern (vendored React 18 + Babel), its live agent panel (todos + tool calls + interruptible generation), and its five-format export list (HTML / PDF / PPTX / ZIP / Markdown). We deliberately diverge on form factor โ€” they are a desktop Electron app bundling [pi-ai][piai]; we are a web app + local daemon that delegates to your existing CLI.
  • multica-ai/multica โ€” the daemon-and-runtime architecture. PATH-scan agent detection, the local daemon as the only privileged process, the agent-as-teammate worldview.

At a glance

What you get
Coding-agent CLIs (16) Claude Code ยท Codex CLI ยท Devin for Terminal ยท Cursor Agent ยท Gemini CLI ยท OpenCode ยท Qwen Code ยท Qoder CLI ยท GitHub Copilot CLI ยท Hermes (ACP) ยท Kimi CLI (ACP) ยท Pi (RPC) ยท Kiro CLI (ACP) ยท Kilo (ACP) ยท Mistral Vibe CLI (ACP) ยท DeepSeek TUI โ€” auto-detected on PATH, swap with one click
BYOK fallback Protocol-specific API proxy at /api/proxy/{anthropic,openai,azure,google,ollama,senseaudio}/stream โ€” paste baseUrl + apiKey + model, choose Anthropic / OpenAI / Azure OpenAI / Google Gemini / Ollama Cloud / SenseAudio, and the daemon normalizes SSE back to the same chat stream. SenseAudio chat additionally exposes generate_image and generate_video tools so the model can write rendered artifacts straight into the active project's folder. Internal-IP/SSRF blocked at the daemon edge.
Design systems built-in 129 โ€” 2 hand-authored starters + 70 product systems (Linear, Stripe, Vercel, Airbnb, Tesla, Notion, Anthropic, Apple, Cursor, Supabase, Figma, Xiaohongshu, โ€ฆ) from awesome-design-md, plus 57 design skills from awesome-design-skills added directly under design-systems/
Skills built-in 132 โ€” 27 in prototype mode (web-prototype, saas-landing, dashboard, mobile-app, gamified-app, social-carousel, magazine-poster, dating-web, sprite-animation, motion-frames, critique, tweaks, wireframe-sketch, pm-spec, eng-runbook, finance-report, hr-onboarding, invoice, kanban-board, team-okrs, โ€ฆ) + 4 in deck mode (guizang-ppt ยท simple-deck ยท replit-deck ยท weekly-update). Grouped in the picker by scenario: design / marketing / operation / engineering / product / finance / hr / sale / personal.
Media generation Image ยท video ยท audio surfaces ship alongside the design loop. gpt-image-2 (Azure / OpenAI) for posters, avatars, infographics, illustrated maps ยท Seedance 2.0 (ByteDance) for cinematic 15s text-to-video and image-to-video ยท HyperFrames (heygen-com/hyperframes) for HTMLโ†’MP4 motion graphics (product reveals, kinetic typography, data charts, social overlays, logo outros). Other image generators can already plug in through Custom Image API / ImageRouter when they expose an OpenAI-compatible image endpoint; workflow-first local runtimes such as ComfyUI are tracked separately as planned adapters. 93 ready-to-replicate prompts gallery โ€” 43 gpt-image-2 + 39 Seedance + 11 HyperFrames โ€” under prompt-templates/, with preview thumbnails and source attribution. Same chat surface as code; outputs a real .mp4 / .png chip into the project workspace.
Visual directions 5 curated schools (Editorial Monocle ยท Modern Minimal ยท Warm Soft ยท Tech Utility ยท Brutalist Experimental) โ€” each ships a deterministic OKLch palette + font stack (apps/daemon/src/prompts/directions.ts)
Device frames iPhone 15 Pro ยท Pixel ยท iPad Pro ยท MacBook ยท Browser Chrome โ€” pixel-accurate, shared across skills under assets/frames/
Agent runtime Local daemon spawns the CLI in your project folder โ€” agent gets real Read, Write, Bash, WebFetch against a real on-disk environment, with Windows ENAMETOOLONG fallbacks (stdin / prompt-file) on every adapter
Imports Drop a [Claude Design][cd] export ZIP onto the welcome dialog โ€” POST /api/import/claude-design parses it into a real project so your agent can keep editing where Anthropic left off
Persistence SQLite at .od/app.sqlite: projects ยท conversations ยท messages ยท tabs ยท saved templates. Reopen tomorrow, todo card and open files are exactly where you left them.
Lifecycle One entry point: pnpm tools-dev (start / stop / run / status / logs / inspect / check) โ€” boots daemon + web (+ desktop) under typed sidecar stamps
Desktop Optional Electron shell with sandboxed renderer + sidecar IPC (STATUS / EVAL / SCREENSHOT / CONSOLE / CLICK / SHUTDOWN) โ€” drives tools-dev inspect desktop screenshot for E2E
Deployable to Local (pnpm tools-dev) ยท Vercel web layer ยท packaged Electron desktop app for macOS (Apple Silicon, plus Intel x64 ZIP builds verified on Monterey) and Windows (x64) โ€” download from open-design.ai or the latest release
License Apache-2.0

Linux AppImage packaging is available through the optional release lane and is covered by the Linux packaged smoke workflow, but public stable downloads remain gated until the release maintainers enable the Linux stable lane.

Demo

01 ยท Entry view
Entry view โ€” pick a skill, pick a design system, type the brief. The same surface for prototypes, decks, mobile apps, dashboards, and editorial pages.
02 ยท Turn-1 discovery form
Turn-1 discovery form โ€” before the model writes a pixel, OD locks the brief: surface, audience, tone, brand context, scale. 30 seconds of radios beats 30 minutes of redirects.
03 ยท Direction picker
Direction picker โ€” when the user has no brand, the agent emits a second form with 5 curated directions (Monocle / Modern Minimal / Tech Utility / Brutalist / Soft Warm). One radio click โ†’ a deterministic palette + font stack, no model freestyle.
04 ยท Live todo progress
Live todo progress โ€” the agent's plan streams as a live card. in_progress โ†’ completed updates land in real time. The user can redirect cheaply, mid-flight.
05 ยท Sandboxed preview
Sandboxed preview โ€” every <artifact> renders in a clean srcdoc iframe. Editable in place via the file workspace; downloadable as HTML, PDF, ZIP.
06 ยท 150-system library
150-system library โ€” every product system shows its 4-color signature. Click for the full DESIGN.md, swatch grid, and live showcase.
07 ยท Magazine deck
Deck mode (guizang-ppt) โ€” the bundled guizang-ppt-skill drops in unchanged. Magazine layouts, WebGL hero backgrounds, single-file HTML output, PDF export.
08 ยท Mobile prototype
Mobile prototype โ€” pixel-accurate iPhone 15 Pro chrome (Dynamic Island, status bar SVGs, home indicator). Multi-screen prototypes use the shared /frames/ assets so the agent never re-draws a phone.

Skills

132 skills ship in the box. Each is a folder under skills/ following the Claude Code [SKILL.md][skill] convention with an extended od: frontmatter that the daemon parses verbatim โ€” mode, platform, scenario, preview.type, design_system.requires, default_for, featured, fidelity, speaker_notes, animations, example_prompt (apps/daemon/src/skills.ts).

Two modes anchor the interactive catalog: prototype (32 skills โ€” anything that renders as a single-page artifact, from a magazine landing to a phone screen to a PM spec doc) and deck (9 skills โ€” horizontal-swipe presentations with deck-framework chrome). The catalog also ships image, video, audio, template, design-system, and utility modes for media generation, catalog updaters, and post-export audit helpers. The scenario field is what the picker groups them by: design ยท marketing ยท operation ยท engineering ยท product ยท finance ยท hr ยท sale ยท personal.

Showcase examples

The visually distinctive skills you'll most likely run first. Each ships a real example.html you can open straight from the repo to see exactly what the agent will produce โ€” no auth, no setup.

dating-web
dating-web ยท prototype
Consumer dating / matchmaking dashboard โ€” left rail nav, ticker bar, KPIs, 30-day mutual-matches chart, editorial typography.
digital-eguide
digital-eguide ยท template
Two-spread digital e-guide โ€” cover (title, author, TOC teaser) + lesson spread with pull-quote and step list. Creator / lifestyle tone.
email-marketing
email-marketing ยท prototype
Brand product-launch HTML email โ€” masthead, hero image, headline lockup, CTA, specs grid. Centered single-column, table-fallback safe.
gamified-app
gamified-app ยท prototype
Three-frame gamified mobile-app prototype on a dark showcase stage โ€” cover, today's quests with XP ribbons + level bar, quest detail.
mobile-onboarding
mobile-onboarding ยท prototype
Three-frame mobile onboarding flow โ€” splash, value-prop, sign-in. Status bar, swipe dots, primary CTA.
motion-frames
motion-frames ยท prototype
Single-frame motion-design hero with looping CSS animations โ€” rotating type ring, animated globe, ticking timer. Hand-off ready for HyperFrames.
social-carousel
social-carousel ยท prototype
Three-card 1080ร—1080 social-media carousel โ€” cinematic panels with display headlines that connect across the series, brand mark, loop affordance.
sprite-animation
sprite-animation ยท prototype
Pixel / 8-bit animated explainer slide โ€” full-bleed cream stage, animated pixel mascot, kinetic Japanese display type, looping CSS keyframes.

Design & marketing surfaces (prototype mode)

Skill Platform Scenario What it produces
web-prototype desktop design Single-page HTML โ€” landings, marketing, hero pages (default for prototype)
saas-landing desktop marketing Hero / features / pricing / CTA marketing layout
dashboard desktop operation Admin / analytics with sidebar + dense data layout
pricing-page desktop sale Standalone pricing + comparison tables
docs-page desktop engineering 3-column documentation layout
blog-post desktop marketing Editorial long-form
mobile-app mobile design iPhone 15 Pro / Pixel framed app screen(s)
mobile-onboarding mobile design Multi-screen mobile onboarding flow (splash ยท value-prop ยท sign-in)
gamified-app mobile personal Three-frame gamified mobile-app prototype
email-marketing desktop marketing Brand product-launch HTML email (table-fallback safe)
social-carousel desktop marketing 3-card 1080ร—1080 social carousel
magazine-poster desktop marketing Single-page magazine-style poster
motion-frames desktop marketing Motion-design hero with looping CSS animations
sprite-animation desktop marketing Pixel / 8-bit animated explainer slide
dating-web desktop personal Consumer dating dashboard mockup
digital-eguide desktop marketing Two-spread digital e-guide (cover + lesson)
wireframe-sketch desktop design Hand-drawn ideation sketch โ€” for the "show something visible early" pass
critique desktop design Five-dimensional self-critique scoresheet (Philosophy ยท Hierarchy ยท Detail ยท Function ยท Innovation)
tweaks desktop design AI-emitted tweaks panel โ€” the model surfaces the parameters worth nudging

Deck surfaces (deck mode)

Skill Default for What it produces
guizang-ppt default for deck Magazine-style web PPT โ€” bundled verbatim from [op7418/guizang-ppt-skill][guizang], original LICENSE preserved
simple-deck โ€” Minimal horizontal-swipe deck
replit-deck โ€” Product-walkthrough deck (Replit-style)
weekly-update โ€” Team weekly cadence as a swipe deck (progress ยท blockers ยท next)

Office & operations surfaces (prototype mode, document-flavored scenarios)

Skill Scenario What it produces
pm-spec product PM specification doc with TOC + decision log
team-okrs product OKR scoresheet
meeting-notes operation Meeting decision log
kanban-board operation Board snapshot
eng-runbook engineering Incident runbook
finance-report finance Exec finance summary
invoice finance Single-page invoice
hr-onboarding hr Role onboarding plan

Adding a skill takes one folder. Read docs/skills-protocol.md for the extended frontmatter, fork an existing skill, restart the daemon, it appears in the picker. The catalog endpoint is GET /api/skills; per-skill seed assembly (template + side-file references) lives at GET /api/skills/:id/example.

Six load-bearing ideas

1 ยท We don't ship an agent. Yours is good enough.

The daemon scans your PATH for claude, codex, devin, cursor-agent, gemini, opencode, qwen, qodercli, copilot, hermes, kimi, pi, kiro-cli, kilo, vibe-acp, and deepseek on startup. Whichever ones it finds become candidate design engines โ€” driven over stdio with one adapter per CLI, swappable from the model picker. Inspired by multica and cc-switch. No CLI installed? The API mode is the same pipeline minus the spawn โ€” choose Anthropic, OpenAI-compatible, Azure OpenAI, or Google Gemini and the daemon forwards normalized SSE chunks back. Loopback is allowed for local LLM providers such as Ollama and LM Studio; non-loopback private, link-local, CGNAT, multicast, reserved, and redirect targets are rejected at the daemon edge.

2 ยท Skills are files, not plugins.

Following Claude Code's SKILL.md convention, each skill is SKILL.md + assets/ + references/. Drop a folder into skills/, restart the daemon, it appears in the picker. The bundled magazine-web-ppt is op7418/guizang-ppt-skill committed verbatim โ€” original license preserved, attribution preserved.

3 ยท Design Systems are portable Markdown, not theme JSON.

The 9-section DESIGN.md schema from VoltAgent/awesome-design-md โ€” color, typography, spacing, layout, components, motion, voice, brand, anti-patterns. Every artifact reads from the active system. Switch system โ†’ next render uses the new tokens. The dropdown ships with Linear, Stripe, Vercel, Airbnb, Tesla, Notion, Apple, Anthropic, Cursor, Supabase, Figma, Resend, Raycast, Lovable, Cohere, Mistral, ElevenLabs, X.AI, Spotify, Webflow, Sanity, PostHog, Sentry, MongoDB, ClickHouse, Cal, Replicate, Clay, Composio, Xiaohongshuโ€ฆ โ€” plus 57 design skills sourced from awesome-design-skills.

4 ยท The interactive question form prevents 80% of redirects.

OD's prompt stack hard-codes a RULE 1: every fresh design brief begins with a <question-form id="discovery"> instead of code. Surface ยท audience ยท tone ยท brand context ยท scale ยท constraints. A long brief still leaves design decisions open โ€” visual tone, color stance, scale โ€” exactly the things the form locks down in 30 seconds. The cost of a wrong direction is one chat round, not one finished deck.

This is the Junior-Designer mode distilled from huashu-design: batch the questions up front, show something visible early (even a wireframe with grey blocks), let the user redirect cheaply. Combined with the brand-asset protocol (locate ยท download ยท grep hex ยท write brand-spec.md ยท vocalise), it's the single biggest reason output stops feeling like AI freestyle and starts feeling like a designer who paid attention before painting.

5 ยท The daemon makes the agent feel like it's on your laptop, because it is.

The daemon spawns the CLI with cwd set to the project's artifact folder under .od/projects/<id>/. The agent gets Read, Write, Bash, WebFetch โ€” real tools against a real filesystem. It can Read the skill's assets/template.html, grep your CSS for hex values, write a brand-spec.md, drop generated images, and produce .pptx / .zip / .pdf files that show up in the file workspace as download chips when the turn ends. Sessions, conversations, messages, tabs persist in a local SQLite DB โ€” pop the project open tomorrow and the agent's todo card is right where you left it.

6 ยท The prompt stack is the product.

What you compose at send time isn't "system + user". It's:

DISCOVERY directives  (turn-1 form, turn-2 brand branch, TodoWrite, 5-dim critique)
  + identity charter   (OFFICIAL_DESIGNER_PROMPT, anti-AI-slop, junior-pass)
  + active DESIGN.md   (150 systems available)
  + active SKILL.md    (132 skills available)
  + project metadata   (kind, fidelity, speakerNotes, animations, inspiration ids)
  + skill side files   (auto-injected pre-flight: read assets/template.html + references/*.md)
  + (deck kind, no skill seed) DECK_FRAMEWORK_DIRECTIVE   (nav / counter / scroll / print)

Every layer is composable. Every layer is a file you can edit. Read apps/daemon/src/prompts/system.ts and apps/daemon/src/prompts/discovery.ts to see the actual contract.

Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ browser (Next.js 16) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  chat ยท file workspace ยท iframe preview ยท settings ยท imports     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ”‚ /api/* (rewritten in dev)          โ”‚
               โ–ผ                                    โ–ผ
   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   /api/proxy/{provider}/stream (SSE)
   โ”‚  Local daemon (Express + SQLite) โ”‚   โ”€โ†’ any OpenAI-compat
   โ”‚                                  โ”‚       endpoint (BYOK)
   โ”‚  /api/agents          /api/skillsโ”‚       w/ SSRF blocking
   โ”‚  /api/design-systems  /api/projects/โ€ฆ
   โ”‚  /api/chat (SSE)      /api/proxy/{provider}/stream (SSE)
   โ”‚  /api/templates       /api/import/claude-design
   โ”‚  /api/artifacts/save  /api/artifacts/lint
   โ”‚  /api/upload          /api/projects/:id/filesโ€ฆ
   โ”‚  /artifacts (static)  /frames (static)
   โ”‚
   โ”‚  optional: sidecar IPC at /tmp/open-design/ipc/<ns>/<app>.sock
   โ”‚  (STATUS ยท EVAL ยท SCREENSHOT ยท CONSOLE ยท CLICK ยท SHUTDOWN)
   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
             โ”‚ spawn(cli, [...], { cwd: .od/projects/<id> })
             โ–ผ
   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
   โ”‚  claude ยท codex ยท devin (ACP) ยท gemini ยท opencode ยท cursor-agent โ”‚
   โ”‚  qwen ยท qoder ยท copilot ยท hermes (ACP) ยท kimi (ACP) ยท pi (RPC) ยท kiro (ACP) ยท kilo (ACP) ยท vibe (ACP) ยท deepseek  โ”‚
   โ”‚  reads SKILL.md + DESIGN.md, writes artifacts to disk            โ”‚
   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
Layer Stack
Frontend Next.js 16 App Router + React 18 + TypeScript, Vercel-deployable
Daemon Node 24 ยท Express ยท SSE streaming ยท better-sqlite3; tables: projects ยท conversations ยท messages ยท tabs ยท templates
Agent transport child_process.spawn; typed-event parsers for claude-stream-json (Claude Code), qoder-stream-json (Qoder CLI), copilot-stream-json (Copilot), json-event-stream per-CLI parsers (Codex / Gemini / OpenCode / Cursor Agent), acp-json-rpc (Devin / Hermes / Kimi / Kiro / Kilo / Mistral Vibe via Agent Client Protocol), pi-rpc (Pi via stdio JSON-RPC), plain (Qwen Code / DeepSeek TUI)
BYOK proxy POST /api/proxy/{anthropic,openai,azure,google,ollama,senseaudio}/stream โ†’ provider-specific upstream APIs, normalized delta/end/error SSE; allows loopback local LLM providers, rejects non-loopback private/link-local/CGNAT/multicast/reserved hosts, and disables upstream redirects at the daemon edge
Storage Plain files in .od/projects/<id>/ + SQLite at .od/app.sqlite + credentials at .od/media-config.json (gitignored, auto-created). OD_DATA_DIR=<dir> relocates all daemon data (used for test isolation and read-only-install setups); OD_MEDIA_CONFIG_DIR=<dir> further narrows the override to just media-config.json for setups that want to keep API keys outside the data dir
Preview Sandboxed iframe via srcdoc + per-skill <artifact> parser (apps/web/src/artifacts/parser.ts)
Export HTML (inline assets) ยท PDF (browser print, deck-aware) ยท PPTX (agent-driven via skill) ยท ZIP (archiver) ยท Markdown
Lifecycle pnpm tools-dev start | stop | run | status | logs | inspect | check; ports via --daemon-port / --web-port, namespaces via --namespace
Desktop (optional) Electron shell โ€” discovers the web URL through sidecar IPC, no port guessing; same STATUS/EVAL/SCREENSHOT/CONSOLE/CLICK/SHUTDOWN channel powers tools-dev inspect desktop โ€ฆ for E2E

Quickstart

Download the desktop app (no build required)

The fastest way to try Open Design is the prebuilt desktop app โ€” no Node, no pnpm, no clone:

Run with Docker

Run Open Design without installing Node.js or pnpm locally.

Requirements
  • Docker Desktop
  • Docker Compose v2

Verify Docker:

docker compose version
Start Open Design
  1. Clone the repository, change to the deploy directory, and copy the environment template:

    git clone https://github.com/nexu-io/open-design.git
    cd open-design/deploy
    cp .env.example .env
    
  2. Generate a secure token:

    openssl rand -hex 32
    
  3. Open .env in your editor, find OD_API_TOKEN=, and paste the generated token there.

Then start the service:

docker compose up -d

Open in your browser:

http://localhost:7456
Common Commands
# View logs
docker compose logs -f

# Restart containers
docker compose restart

# Stop containers
docker compose down

# Pull latest image
docker compose pull
docker compose up -d

For advanced Docker configuration and environment variables, see QUICKSTART.md.

Run from source

git clone https://github.com/nexu-io/open-design.git
cd open-design
corepack enable
corepack pnpm --version   # should print 10.33.2
pnpm install
pnpm tools-dev run web
# open the web URL printed by tools-dev

Environment requirements: Node ~24 and pnpm 10.33.x. nvm/fnm are optional helpers only; if you use one, run nvm install 24 && nvm use 24 or fnm install 24 && fnm use 24 before pnpm install.

Windows users can follow docs/windows-troubleshooting.md for the native setup path and a tiny double-click launcher.

For desktop/background startup, fixed-port restarts, and media generation dispatcher checks (OD_BIN, OD_DAEMON_URL, apps/daemon/dist/cli.js), see QUICKSTART.md.

The first load:

  1. Detects which agent CLIs you have on PATH and picks one automatically.
  2. Loads 132 skills + 150 design systems.
  3. Pops the welcome dialog so you can paste an Anthropic key (only needed for the BYOK fallback path).
  4. Auto-creates ./.od/ โ€” the local runtime folder for the SQLite project DB, per-project artifacts, and saved renders. There is no od init step; the daemon mkdirs everything it needs on boot.

Type a prompt, hit Send, watch the question form arrive, fill it, watch the todo card stream, watch the artifact render. Click Save to disk or download as a project ZIP.

First-run state (./.od/)

The daemon owns one hidden folder at the repo root. Everything in it is gitignored and machine-local โ€” never commit it.

.od/
โ”œโ”€โ”€ app.sqlite                 โ† projects ยท conversations ยท messages ยท open tabs
โ”œโ”€โ”€ artifacts/                 โ† one-off "Save to disk" renders (timestamped)
โ””โ”€โ”€ projects/<id>/             โ† per-project working dir, also the agent's cwd
Want toโ€ฆ Do this
Inspect what's in there ls -la .od && sqlite3 .od/app.sqlite '.tables'
Reset to a clean slate pnpm tools-dev stop, rm -rf .od, run pnpm tools-dev run web again
Move it elsewhere OD_DATA_DIR=<absolute-or-relative-path> pnpm tools-dev run web โ€” the daemon resolves ~/ and anchors relative paths to the repo root. OD_MEDIA_CONFIG_DIR=<dir> narrows the override to just media-config.json if you want credentials in a separate location.
Migrating a pre-desktop-app .od/ into the installed Desktop app

If you ran the repo first and only later installed the packaged Desktop app, the two writers point at different roots:

  • Repo dev-server (pnpm tools-dev start web) writes to <repo-root>/.od/.

  • Installed Desktop app writes under <appData>/Open Design/namespaces/<channel>/data/, where <appData> is Electron's per-OS app-data base (everything before the Open Design segment that app.getPath("userData") already includes). The channel suffix is platform-specific โ€” the release workflows append -win/-linux:

    Platform <appData> (Electron appData base) Stable channel Beta channel
    macOS ~/Library/Application Support release-stable release-beta
    Windows %APPDATA% (= %USERPROFILE%\AppData\Roaming) release-stable-win release-beta-win
    Linux $XDG_CONFIG_HOME (default ~/.config) release-stable-linux release-beta-linux

    Example resolved paths:

    • macOS beta: ~/Library/Application Support/Open Design/namespaces/release-beta/data/
    • Windows beta: %APPDATA%\Open Design\namespaces\release-beta-win\data\
    • Linux beta: ~/.config/Open Design/namespaces/release-beta-linux/data/

    If unsure, inspect the packaged daemon log right after the app boots; it logs the resolved daemonDataRoot.

โš ๏ธ Do this in a clean state. Migration replaces (not merges) the Desktop app's data dir with your repo .od/. Both writers must be fully stopped before copying โ€” quit the Desktop app and stop the repo dev-server. SQLite-WAL needs to flush cleanly on both sides; if either daemon is still running it can write SQLite/WAL pages or project/artifact files mid-snapshot, leaving the staged copy inconsistent. If the Desktop app already has projects you care about, decide which side is authoritative before continuing โ€” the steps below back up the Desktop's current data/ to a sibling but do not merge.

Option A: one-shot auto-migration via OD_LEGACY_DATA_DIR

Use this when the Desktop app's data/ is still empty, which is the typical state right after the upgrade that surfaced #710. Quit the Desktop app first (so its daemon is not holding app.sqlite), then re-launch with OD_LEGACY_DATA_DIR pointed at your old repo .od/. The daemon stages your payload into a sibling tmp directory and only promotes it into data/ on success; on any failure the staging directory is removed so the next boot retries cleanly.

The daemon refuses, with a visible startup error, when:

  • the path in OD_LEGACY_DATA_DIR does not contain app.sqlite (typo, deleted source, wrong path), or
  • the Desktop's data/ already contains any of app.sqlite, projects/, artifacts/, media-config.json, etc. SQLite/WAL pairs and project trees cannot be safely interleaved, so the daemon refuses to merge instead of silently corrupting either side. If the Desktop has already booted and seeded its own data/, use Option B and decide explicitly which side wins.

A .migrated-from marker is written on success so subsequent boots no-op.

Quit the Desktop app first, then re-launch with this env set. The launcher must put the variable into the app process environment, not just the shell that runs open / xdg-open.

macOS (LaunchServices does not inherit shell env, so use the direct binary):

OD_LEGACY_DATA_DIR="/path/to/old/repo/.od" \
  "/Applications/Open Design.app/Contents/MacOS/Open Design"

If you prefer the Dock launcher, set the variable in launchctl first, open the app, then unset it:

launchctl setenv OD_LEGACY_DATA_DIR "/path/to/old/repo/.od"
open "/Applications/Open Design.app"
# After the migration log line appears:
launchctl unsetenv OD_LEGACY_DATA_DIR

Linux (run the binary directly so the env var actually reaches it):

OD_LEGACY_DATA_DIR="/path/to/old/repo/.od" /path/to/open-design
# (e.g. the AppImage you launched, or the unpacked binary under /opt)

Windows (PowerShell):

$env:OD_LEGACY_DATA_DIR="C:\path\to\old\repo\.od"
& "$env:LOCALAPPDATA\Programs\Open Design\Open Design.exe"

The daemon log records [od-migrate] migration complete: copied N entries (...). After the first launch you can clear the env variable; the marker prevents re-migration even on subsequent runs.

Option B: manual copy

To carry your existing projects, SQLite, artifacts, and media-config.json over to the Desktop app, when Option A is not viable (Desktop already has its own data and you want to replace it explicitly).

macOS / Linux (bash):

set -euo pipefail
# 1. Stop both writers so the source and target are quiescent.
#    - Quit the Desktop app (Cmd+Q on macOS, File โ†’ Exit on Linux).
#    - Stop the repo dev-server: `pnpm tools-dev stop` from the repo root.
# 2. Set REPO and APP_DATA to your actual paths; the example below is macOS + beta.
REPO="/path/to/open-design"
APP_DATA="$HOME/Library/Application Support/Open Design/namespaces/release-beta/data"

# 3. Preflight: see what (if anything) the Desktop app already has.
ls "$APP_DATA/projects" 2>/dev/null && echo "Desktop already has projects, confirm this is a replace, not a merge."

# 4. Stage into a sibling first, then atomically swap into place. `set -e` plus
#    the explicit rsync exit check guarantee a non-zero copy aborts before any
#    `mv` runs, so the Desktop data dir cannot end up half-populated.
STAGE="${APP_DATA}.staged-$(date +%F-%H%M)"
mkdir -p "$STAGE"
rsync -a --exclude='backup-*' "$REPO/.od/" "$STAGE/" || { echo "rsync failed, aborting before swap"; exit 1; }

# 5. Backup the Desktop's current data, then promote the staged copy.
mv "$APP_DATA" "${APP_DATA}.fresh-baseline-$(date +%F-%H%M)"
mv "$STAGE" "$APP_DATA"

# 6. Relaunch the Desktop app. The daemon applies forward schema changes on boot.

Windows (PowerShell):

$ErrorActionPreference = 'Stop'
# 1. Stop both writers so the source and target are quiescent.
#    - Quit the Desktop app (File > Exit).
#    - Stop the repo dev-server: `pnpm tools-dev stop` from the repo root.
# 2. Set $Repo and $AppData to your actual paths; the example below is stable channel.
$Repo    = 'C:\path\to\open-design'
$AppData = Join-Path $env:APPDATA 'Open Design\namespaces\release-stable-win\data'

# 3. Preflight: see what (if anything) the Desktop app already has.
if (Test-Path (Join-Path $AppData 'projects')) {
  Write-Host 'Desktop already has projects, confirm this is a replace, not a merge.'
}

# 4. Stage into a sibling first. Robocopy /MIR mirrors source to staging, and
#    its exit codes >= 8 are real errors (0..7 are success/info), so we guard
#    explicitly before promoting.
$Stamp = Get-Date -Format 'yyyy-MM-dd-HHmm'
$Stage = "$AppData.staged-$Stamp"
robocopy "$Repo\.od" $Stage /MIR /XD 'backup-*' | Out-Null
if ($LASTEXITCODE -ge 8) { throw "robocopy failed (exit $LASTEXITCODE), aborting before swap" }

# 5. Backup the Desktop's current data, then promote the staged copy.
if (Test-Path $AppData) { Rename-Item $AppData "$AppData.fresh-baseline-$Stamp" }
Rename-Item $Stage $AppData

# 6. Relaunch the Desktop app. The daemon applies forward schema changes on boot.

If anything looks wrong after relaunch, restore the original Desktop data by deleting $APP_DATA (or $AppData on Windows) and renaming the .fresh-baseline-* directory back into place.

โš ๏ธ Schema migrations are forward-only. The daemon applies CREATE TABLE IF NOT EXISTS / ALTER TABLE changes on boot; there is no version guard. After migrating, do not open the same data dir with an older repo checkout โ€” unsupported columns or behavior mismatches can leave the workspace inconsistent. Back up app.sqlite* before the first launch with the new app.

โš ๏ธ Advanced: sharing one data dir between repo dev-server and Desktop app. Pointing both at the same dir via OD_DATA_DIR is possible but only safe one-at-a-time. The daemon opens app.sqlite in WAL mode and writes uncoordinated files under projects/ and artifacts/; running both writers concurrently can corrupt SQLite or clobber artifacts. Always stop the Desktop app before starting the dev-server, and stop the dev-server before opening the Desktop app:

OD_DATA_DIR="$HOME/Library/Application Support/Open Design/namespaces/release-beta/data" \
  pnpm tools-dev start web

Full file map, scripts, and troubleshooting โ†’ QUICKSTART.md.

Running the Project

Open Design can run as a web app in your browser or as an Electron desktop application. Both modes share the same local daemon + web architecture.

Web / Localhost (Default)

# Foreground mode โ€” keeps the lifecycle command in the foreground (logs written to files)
pnpm tools-dev run web

# View recent logs:
pnpm tools-dev logs

# Background mode โ€” daemon + web run as background processes
pnpm tools-dev start web

By default, tools-dev binds to available ephemeral ports and prints the actual URLs on startup. To use fixed ports from a stopped state:

pnpm tools-dev run web --daemon-port 17456 --web-port 17573

If daemon/web are already running, use restart to switch ports in the existing session:

pnpm tools-dev restart --daemon-port 17456 --web-port 17573

Desktop / Electron

# Start daemon + web + desktop in the background
pnpm tools-dev

# Check desktop status
pnpm tools-dev inspect desktop status

# Take a screenshot of the desktop app
pnpm tools-dev inspect desktop screenshot --path /tmp/open-design.png

The desktop app discovers the web URL automatically via sidecar IPC โ€” no port guessing required.

Other Useful Commands

Command What it does
pnpm tools-dev status Show running sidecar statuses
pnpm tools-dev logs Show daemon/web/desktop log tails
pnpm tools-dev stop Stop all running sidecars
pnpm tools-dev restart Stop then restart all sidecars
pnpm tools-dev check Status + recent logs + common diagnostics

For fixed-port restarts, background startup, and full troubleshooting see QUICKSTART.md.

Nix

A flake is published at the repo root. Home Manager is the recommended path for individual developers; a NixOS module is also exposed for shared/server installs. See nix/README.md for the full surface (data dir, secrets, webFrontend vs. bringing your own server, OD_DAEMON_URL).

# Home Manager
inputs.open-design.url = "github:nexu-io/open-design";
# then: imports = [ inputs.open-design.homeManagerModules.default ];
nix run github:nexu-io/open-design       # boot the daemon (`od`) without installing

For developers, a Nix dev shell is available and can be used with direnv too:

nix develop   # dev shell with required dependencies to work on Open Design

Use Open Design from your coding agent

Open Design ships a stdio MCP server. Wire it into Claude Code, Codex, Cursor, VS Code, Antigravity, Zed, Windsurf, or any MCP-compatible client and the agent in another repo can read files from your local Open Design projects directly. Replaces the export-then-attach loop. When the agent calls search_files, get_file, or get_artifact without a project argument, the MCP defaults to whatever project (and file) you have open in Open Design right now, so prompts like "build this in my app" or "match these styles" just work.

Why MCP? Exporting and re-attaching a zip every design iteration breaks flow. The MCP server exposes your design source directly -- tokens CSS, JSX components, entry HTML -- as a structured API the agent can query by name. The agent always sees the live file, not a stale copy from the last export.

Open Settings โ†’ MCP server in the Open Design app for a per-client install flow. The panel bakes the absolute path to your node binary and the daemon's built cli.js into every snippet, so it works on a fresh source clone where od is not on your PATH. Cursor gets a one-click deeplink; the rest get a copy-paste JSON snippet in the schema their config file expects (Claude Code includes a claude mcp add-json one-liner so you do not have to hand-edit ~/.claude.json). Restart or reload your client after install for the server to show up.

The daemon must be running locally for MCP tool calls to succeed. If the agent was started before Open Design, restart the agent after Open Design is up so it can reach the live daemon. Tool calls made while the daemon is offline return a clear "daemon not reachable" error rather than a crash.

Security model. The MCP server is read-only; it exposes file reads, file metadata, and search -- nothing that writes to disk or calls an external service. It runs as a child process of the coding agent over stdio, so any MCP client you register inherits read access to your local Open Design projects. Treat it like installing a VS Code extension: only register clients you trust. The daemon binds to 127.0.0.1 by default; LAN-wide exposure requires an explicit OD_BIND_HOST opt-in. If you also front the SPA with a non-loopback static server, set OD_ALLOWED_ORIGINS=<origin1>,<origin2>,... (comma-separated scheme://host[:port] entries) so the daemon's same-origin gate accepts API writes from those origins on both the Origin and Host checks; without it the browser will see 403s on every PUT/POST (Caddy v2 reverse_proxy preserves the original Host header upstream by default, so loopback alone is not enough). Connector-credential and live-artifact preview routes stay loopback-only regardless.

Repository structure

open-design/
โ”œโ”€โ”€ README.md                      โ† this file
โ”œโ”€โ”€ 

---

*README truncated. [Continue reading on GitHub](https://github.com/nexu-io/open-design#readme)*