The output is a file, not a shared canvas
OpenDesign treats a coding agent as the rendering engine. A user chooses an artifact type, a design system, and a model or local CLI, then describes the work. The agent writes files while the Studio keeps the conversation, file tree, and preview together. Outputs include single-page prototypes, dashboards, documents, decks, images, and code-driven video.
This is meaningfully different from a vector editor. OpenDesign's reusable brand contract is a DESIGN.md file, sometimes paired with tokens, fixtures, assets, and provenance. Functional skills describe workflows; design templates describe renderable formats. The resulting HTML, PDF, PPTX, ZIP, Markdown, or MP4 can leave the application as an ordinary file. Developers can continue in their editor instead of translating a canvas into code.
The approach suits quick product concepts and presentation artifacts. It is weaker for designers who need multiplayer cursor presence, constraint-based vector editing, component inspection, and careful handoff across many screens. Calling it a Figma alternative describes the market ambition, not feature equivalence. Penpot is the better comparison when a conventional collaborative canvas is required.
Agent choice is unusually open
OpenDesign can launch a long list of local coding CLIs, including Claude Code, Codex, DeepSeek Harness, Cursor, OpenCode, Qwen, Copilot, and Hermes. It can also call OpenAI-compatible, Anthropic, Google, Azure, Ollama, and other endpoints through a BYOK proxy. Both paths end in the same project and preview, though their output contract differs.
A filesystem-capable local agent writes canonical project files and sends tool events. A plain API model returns one complete artifact block for the host to parse. This difference matters when debugging. A missing preview may come from the agent runtime, its permissions, file delivery, the daemon, artifact parsing, or the iframe. The product provides one Studio, while the execution paths remain technically distinct.
MCP lets Claude Code and other clients consume OpenDesign outside the desktop UI. Installation commands can print a dry run, add the server, or uninstall it. The daemon is read-only by default, binds to loopback, and keeps credential and preview routes local even when LAN access is enabled. Those are sensible defaults for software that can spawn command-line agents and write project files.
What happened when we ran it
We cloned commit 82c607d into an unprivileged Node 22 container with three CPUs and 8 GB of RAM. pnpm installation succeeded in 83 seconds. It installed 1,293 packages and used 2,644 MB on disk. That footprint is large enough to affect CI caching, developer laptops, and container build storage.
No build script or target was available at the measured root, so the lab skipped the build stage. There was also no test script or target, and no tests directory, so the test stage was skipped. This is absence of a root gate, not a passing build or test result. The repository had 12,864 files, about 1,498,326 lines of source, 50 CI workflow files, monorepo workspaces, and no root Dockerfile.
The Quickstart gives package-level build and test commands, such as building the daemon or web package and testing a selected workspace. Those may be the correct contributor checks, but they were not the targets our standard harness discovered. An adopter should identify the exact desktop, daemon, web, or plugin packages being changed and run their documented guards, type checks, builds, and tests explicitly.
Security choices are visible
The local daemon uses Express and SQLite and serves the web application. Provider requests pass through SSRF checks that block private, link-local, carrier-grade NAT, and cloud-metadata addresses. Internal model gateways need an exact entry in OD_ALLOWED_INTERNAL_HOSTS; broad CIDR entries are not supported. This can surprise an Ollama or LiteLLM user on a private network, but an explicit exception is better than quietly allowing internal fetches.
LAN exposure also requires OD_BIND_HOST and allowed origins. Docker setup asks for a generated API token. Reverse proxies need buffering and compression disabled on SSE routes or streams may end as incomplete chunked responses. These details make the documentation useful for self-hosters, while showing that 'local-first' does not mean zero configuration.
Privacy claims need one qualification from the README. Product analytics and session replay are consent-gated. Scrubbed safety and reliability telemetry is described as always enabled. An organization with a strict no-telemetry rule should resolve that policy mismatch before installation rather than infer that every local-first component is silent.
Version 0.21.0 fixes sessions while package installation lags
Version 0.21.0 was released on August 25, 2026, and the repository was pushed on August 27. GitHub showed 867 issues and pull requests combined. The release names 42 pull requests from 13 contributors over 4 days, including fixes for HTML previews, stale desktop sidecars, Kimi sessions, and duplicate AI Optimize runs. That pace is evidence of active maintenance and a warning that adapters are moving quickly.
The release also changes the 30-minute MCP idle behavior that older reports criticized. The default remains, but OD_MCP_STDIO_IDLE_EXIT_MS can extend it to 24 hours or disable idle exit. Issue 7471 identifies a different packaging gap: Git installs of @open-design/dsh-runtime lack built distribution files because the package has no prepare script. Pull request 7475 proposes a fix. Until a release includes it, use the supported package path instead of assuming a Git URL is installable.
OpenDesign earns a trial when the deliverable is a file and the team already uses coding agents. Begin with a disposable project and inspect the HTML, assets, accessibility, and export instead of judging only the preview. The 2,644 MB dependency tree and missing root gates make package-level checks part of adoption, not an optional contributor chore.

