Open-Design : Run a Local AI Design Studio for Free
A Claude Design Alternative How to wire up a self-hosted design generation stack that rivals Figma's AI features — without sending your work to a third-party cloud. There is a quiet corner of the open-source world where two tools have been evolving in parallel, each solving a different half of the same problem. Open-design wants to be the AI-native design canvas. Lynkr wants to be the intelligent router that connects any AI model to any client. Together, they form a surprisingly capable stack: a browser-based design studio powered entirely by models you run yourself. This article explains what each tool does, why they pair well, and walks you through the exact steps to get both running — from a blank machine to a working design session in under twenty minutes. Open-design (github: nexu-io/open-design) is a web application that lets you describe what you want to build in plain English and receive a live, editable HTML design in return. Think of it as a Figma alternative where the "draw" action is replaced by a conversation. You open a project, type "Create a SaaS pricing page with three tiers, a purple gradient header, and a FAQ section below the fold," and the assistant responds with a fully rendered HTML page sitting in a split pane next to the chat. You can iterate on it — "make the CTA button larger and change the font to Inter" — and the design updates in place. What makes this different from just asking ChatGPT for HTML and copying the output into a file is the structure open-design wraps around the conversation: Project workspaces — each project has its own conversation history, file panel, and design system binding. Your palette and typography rules travel with the project. Design files panel — generated HTML is not dropped in the chat as a code block. It is parsed, saved as a project file, and opened as a rendered tab in a file viewer with an iframe preview. Skills — prebuilt workflow templates (landing page, deck, dashboard, prototype) that inject opinionated system prompts so the model follows proven patterns rather than making it up. Design systems — you can attach a DESIGN.md that defines your color tokens, spacing scale, and component rules. The model reads this as authoritative and binds every artifact to it. Live artifacts — a second artifact type for data-driven outputs (dashboards, reports) that can be refreshed on a schedule by re-running the generation with updated data. Open-design ships with two ways to run the AI backend. Daemon mode spins up a local CLI agent (Codex, Claude Code, Gemini CLI) on your machine. The daemon manages the agent process, streams its output, and interprets the tool calls it makes — reading files, writing artifacts, running shell commands. This is the "full agentic" mode where the AI can explore your file system, install dependencies, and produce multi-file outputs. API mode (also called BYOK — Bring Your Own Key) skips the local agent entirely. You point open-design at any OpenAI-compatible or Anthropic-compatible endpoint, hand it an API key, and it sends requests directly. The AI cannot use tools in this mode; it can only output blocks, which open-design parses and routes to the Design Files panel. This is the simpler, faster mode — and it is exactly the mode Lynkr plugs into. Both modes share one key convention: the tag. When the AI wants to produce a design, it wraps its HTML inside: ... Open-design's streaming parser watches the incoming text for this tag. The moment it sees arrives — saves the file to the project folder and opens it as a tab. The user sees a live preview build up line by line, like watching someone draw. The chat view simultaneously strips the artifact out (showing only any prose the model wrote around it) so the conversation stays clean. Lynkr is an AI proxy server that presents a unified Anthropic-compatible API surface (/v1/messages) while internally routing requests to whichever provider and model makes sense for the task. If you run multiple AI providers — Ollama locally, Anthropic in the cloud, maybe Azure OpenAI for enterprise workloads — every client that talks to one of them is tightly coupled to that provider's API format. Swap the provider, update every client. Lynkr breaks that coupling. Clients always speak Anthropic's message format. Lynkr translates on the fly to whatever the target provider expects and translates the response back. Beyond simple translation, Lynkr runs an agent loop: It receives a message request. It forwards the request to the target model (Ollama, Anthropic, Azure, OpenRouter). If the model responds with tool calls, Lynkr executes them server-side (web search, file reads, subtask delegation) and feeds the results back to the model. The loop repeats until the model produces a final text answer or a terminal condition is hit. The final response is returned in Anthropic SSE format. This means clients that speak Anthropic's streaming protocol — including open-design in API mode — get a fully resolved, agentic response even when the underlying model is a local Ollama instance that has no native tool support. Lynkr analyzes each incoming request for complexity (simple lookup vs. multi-step reasoning vs. heavy code generation) and routes to the appropriate tier: Simple / fast → local Ollama model (zero cloud cost, low latency) Complex / reasoning → cloud model (Anthropic, OpenAI, Azure) Agent tasks → multi-step loop with tool execution All of this is transparent to the client. Open-design sends one request; Lynkr decides where it goes. Token budget enforcement — Lynkr tracks token usage and compresses conversation history before it would overflow the context window, preserving the most recent and most important turns. Headroom sidecar — a small Python service that monitors GPU/CPU memory and tells Lynkr how much headroom is available for local inference, enabling dynamic load shedding when the machine is under pressure. Session memory — vector-search-backed conversation memory that lets the model recall context from previous turns in long projects. Telemetry and tracing — structured logs, latency metrics, and per-provider cost tracking. Dashboard — a web UI at /dashboard that shows live request throughput, provider health, and routing decisions. Open-design in API mode needs an endpoint that: Speaks Anthropic's /v1/messages format with SSE streaming. Understands the design system context injected in the system prompt. Produces clean HTML blocks without hallucinating tool calls or emitting ANSI escape codes into the CSS. Routes to whatever model the user has available — local or cloud. Lynkr provides all four. You point open-design at http://localhost:8081, select "Anthropic" as the protocol, set any string as the API key, and Lynkr handles the rest. The integration is also meaningful in the other direction. Lynkr needs clients that exercise its capabilities in realistic ways. Open-design's rich system prompts, multi-turn conversations, and artifact streaming are exactly the kind of traffic that surfaces edge cases — model hallucinations, ANSI corruption in streamed HTML, token overflows — that make a proxy useful to stress-test. Tool Version Purpose Docker 24+ Run open-design Node.js 20+ Run Lynkr Ollama 0.4+ Local model inference Git any Clone repos You also need at least one model pulled in Ollama. For design generation, minimax-m2.5:cloud gives strong results (it reasons visually and follows HTML conventions well). For lighter machines, qwen2.5-coder:7b or llama3.1:8b are workable. ollama pull minimax-m2.5:cloud # or for lighter machines: ollama pull qwen2.5-coder:7b # Clone the repo git clone https://github.com/Fast-Editor/Lynkr cd lynkr # Install dependencies npm install # Start Lynkr on port 8081 node bin/cli.js start --port 8081 Lynkr starts, discovers your local Ollama instance automatically, and is ready to accept requests at http://localhost:8081/v1/messages. You can verify it is running: curl -s http://localhost:8081/health | jq . # { "status": "ok", "providers": ["ollama", ...] } To check the dashboard, open http://localhost:8081/dashboard in your browser. # Pull and run open-design docker run -d \ --name open-design \ -p 7456:7456 \ --add-host=host.docker.internal:host-gateway \ nexuio/open-design:latest The --add-host flag is critical. Open-design runs inside a container, and it needs to reach Lynkr which runs on your host machine. host.docker.internal is the hostname that resolves to your host from inside a Docker container. Open your browser at http://localhost:7456. You should see the open-design welcome screen. In the open-design UI: Click the Settings gear icon (top right). Under Execution & model, click the BYOK tab (right side — "API provider"). Select the Anthropic protocol tab. Under Quick fill provider, choose Custom provider. Set API Key to any non-empty string (e.g. local). Lynkr does not validate it for local providers. Set Model to the Ollama model you pulled — e.g. minimax-m2.5:cloud or qwen2.5-coder:7b. Set Base URL to: http://host.docker.internal:8081 Click Test to confirm the connection, then close Settings. The Settings panel with BYOK selected, Anthropic protocol active, and Base URL pointed at Lynkr. The model shown is claude-opus-4-5 but you can type any Ollama model name — the field accepts free text. That is it. Open-design will now route all AI requests through Lynkr, which routes them to your local Ollama instance. Click New Project and name it anything — "Landing Page Test". When prompted for project kind, choose Prototype. Type your first prompt in the chat: Create a modern SaaS landing page with a dark hero section, gradient headline, three feature cards below, and a "Get Early Access" CTA button. Use a deep blue and violet color scheme. Hit enter and watch what happens. Lynkr receives the request, routes it to Ollama, the model generates an extended thinking block, then produces an HTML block. Lynkr streams this back to open-design. Open-design's streaming parser detects the tag, opens a Design panel tab, and renders the HTML in real time — line by line, as the model writes it. When the stream ends, the file is saved automatically to the project and the Design tab snaps into focus with your rendered page. The full open-design workspace after a generation completes. Left: the conversation. Center: the Design Files panel with a structured layers tree. Right: the live rendered preview — this is a 10-slide editorial pitch deck generated from a single prompt in about 60 seconds. The conversation history is preserved per-project. Each turn, open-design builds the full message history and sends it to Lynkr, so the model has context from every prior design decision. Try follow-up prompts like: Make the hero headline larger, add a subtle animated gradient background to the hero section, and add a navigation bar at the top with the logo on the left and three nav links on the right. or: Add a testimonials section below the feature cards with three customer quotes and avatar placeholders. Keep the same color palette. Each response produces an updated artifact. Open-design saves the new version and opens it, preserving the previous version in the file history. Lynkr supports routing heavy or complex requests to a cloud provider while keeping simple requests local. Add your Anthropic API key to Lynkr's config: # In lynkr directory export ANTHROPIC_API_KEY=sk-ant-... node bin/cli.js start --port 8081 Lynkr's complexity analyzer will automatically route multi-step reasoning requests to claude-sonnet-4-6 and keep lighter requests on Ollama — without any change to your open-design configuration. Open-design lets you create a design system with a DESIGN.md that defines your brand tokens. Once bound to a project, this file is injected into every system prompt. The model reads it as authoritative and will not invent colors, fonts, or spacing outside what you defined. A minimal DESIGN.md looks like: ## Colors - Primary: #5B21B6 (violet-800) - Accent: #7C3AED (violet-600) - Background: #0F0F23 - Surface: #1A1A2E - Text: #F8FAFC ## Typography - Headings: Inter, weight 700 - Body: Inter, weight 400 - Code: JetBrains Mono ## Spacing Base unit: 4px. All spacing is multiples of 4. ## Buttons - Primary: solid violet-600, white text, 8px radius, 14px 28px padding - Ghost: transparent, violet-600 border, violet-600 text With this bound, every artifact the model generates will use exactly these values — no hallucinated hex codes. Skills are workflow templates that inject expert-level instructions for specific artifact types. Open-design ships with several built-in skills. You can also write your own SKILL.md and publish it to the open-design skill registry. A good skill for landing pages would define the exact section order, component patterns (hero → social proof → features → CTA), and validation checklist the model must pass before emitting the artifact. This means the model produced output but it was not recognized as an artifact. The most common causes: The model used tool calls instead of outputting blocks. Some models trained on agent data (like MiniMax or Qwen) reflexively try to call file-writing tools instead of producing direct output. Lynkr handles this by detecting the hallucinated tool calls, dropping them, and injecting a redirect message: "You don't have any tools available. Output the result directly as an block." The model then produces the correct output on the follow-up. If you see this happening, it is normal — it adds one extra round trip but the design still arrives. The HTML failed validation. Open-design requires that artifact HTML start with or tags (e.g. "I updated the header section"), it fails the structural check and is not saved. Try a more explicit prompt: "Output the complete HTML document in an artifact block." Connection refused from the Docker container. Make sure you used host.docker.internal as the base URL (not localhost). From inside a Docker container, localhost refers to the container itself, not your host machine. This would have caused CSS rules like * { box-sizing: border-box } to appear as ▸ { box-sizing: border-box } with colored terminal output embedded in the HTML. Lynkr's latest version detects when text content looks like HTML and bypasses the ANSI markdown renderer, keeping the HTML clean. If you see this, make sure you are on the latest Lynkr commit. If your Ollama model was trained on agent data (Claude Code, Codex), its first instinct is to run ls and read files before generating anything. Lynkr injects a system-level note when it detects a tool-less request: "You have NO tools available. Output ONLY text content directly." Combined with open-design's system prompt, this redirects the model within one or two turns. Running open-design with Lynkr gives you a local AI design studio with some properties that are hard to get from fully-managed SaaS alternatives: Privacy. Your prompts, your designs, and your conversation history never leave your machine (when using local Ollama models). Sensitive product ideas, unreleased brand concepts, confidential UI specs — none of it is sent to a third-party cloud. Cost control. With Ollama models, inference is free. Lynkr's token budget enforcement and complexity routing mean you only pay cloud API costs for the requests that genuinely need it. A typical design session with minimax-m2.5:cloud on Ollama costs nothing. Model flexibility. You are not locked to one vendor. If a better open-source design model releases tomorrow, you pull it with ollama pull and update the model name in open-design settings. The rest of the stack does not change. Composability. Lynkr exposes a standard Anthropic API surface, which means anything that speaks Anthropic can use it — Claude Code, Codex, Continue.dev, your own scripts. Open-design is just one client. You can run others against the same Lynkr instance simultaneously. Neither open-design nor Lynkr is trying to replace your existing design workflow wholesale. They are building blocks — a canvas that understands artifacts, and a router that understands models. Assembled correctly, they remove the most annoying friction from early-stage design: the gap between I know what I want this to look like and here is the actual HTML. The integration is not yet seamless for every model (some still need the redirect injection to break out of agent mode), but the core loop — describe it, see it, iterate — works reliably once both services are running. If you are running a product team and want to prototype faster without signing up for another SaaS tool, or if you are building in public and want full ownership of your AI-generated design assets, this stack is worth an afternoon of setup time. Both projects are open source. Links below. Open-design: github.com/nexu-io/open-design Lynkr: https://github.com/Fast-Editor/Lynkr Ollama: ollama.ai If you found this useful, share it with someone building with open-source AI tools. Comments and questions are open below.
