Show HN:QORM – build UI apps where you and your AI edit the app together, live QORM, an agent-native declarative-UI runtime, enables developers to build UI apps collaboratively with AI assistants like Claude in real time. The tool, written in Go, allows AI to scaffold, edit, run, and verify apps while humans interact with the same live app, and supports cross-platform deployment to web, iOS, Android, desktop, and mini-programs. English · 中文 /qorm/qorm/blob/main/README.zh.md Build UI apps with your AI assistant — together, live. QORM is an agent-native declarative-UI runtime: describe a UI as small, language-neutral JSON, and your AI Claude, Cursor, … can scaffold, edit, run, and verify it while you collaborate on the same running app in real time — you click, it sees you; it edits, you watch it happen. The GIF was recorded by QORM itself — the AI drove the edits over MCP and qorm shot captured each frame via WebKit. No browser automation; see scripts/record-demo.sh. Under the hood the default build is pure Go — it runs the app live in the browser, renders a static HTML snapshot, ed25519-signs it into a distributable bundle, serves it over-the-air with rollback, exposes it to agents over MCP, and packages it for web / iOS / Android / desktop / mini-program — cross-compiled from any machine. Developed in collaboration with Claude Anthropic — fitting, since human-AI collaboration is QORM's whole premise. QORM is agent-native: point your AI coding assistant Claude Code, Claude Desktop, Cursor, Windsurf, … at it and have it scaffold, edit, run, and verify QORM apps — then collaborate with you on a live app in real time. You click, it sees you qorm activity ; it edits, you see an "AI edited" toast. Set it up once: go install github.com/qorm/qorm/cmd/qorm@latest claude mcp add qorm -- qorm mcp . or add integrations/mcp.json to your agent Then just ask — "scaffold a habit tracker" , "fix this overflow" , "package it for web" . Full guide: Build with your AI · Human-AI collaboration /qorm/qorm/blob/main/docs/collaboration.md . | Target | Package | Render | Live app | Agent / MCP | |---|---|---|---|---| | Web | ok | ok | ok | ok | | iOS | ok | ok | ok | ok | | Android | ok | ok | ok | ok | | macOS | ok | ok | ok | ok | | Linux | beta | ok | ok | ok | | Windows | beta | ok | ok | ok | | Mini-program | ok | beta | beta | beta | ok supported + tested · beta foundation / partial · — n/a. The full feature list distribution, rendering, runtime, agent — each per target is the platform support matrix /qorm/qorm/blob/main/docs/platforms/support-matrix.md ; each platform's hardware interfaces are in capabilities.md /qorm/qorm/blob/main/docs/platforms/capabilities.md . Both are generated from the code and kept in sync by tests. go run ./cmd/qorm run examples/counter opens the app in your browser go run ./cmd/qorm render examples/todo -o todo.html static snapshot Press + / - in the counter, or add/toggle tasks in the todo app — button presses POST to /event , the server updates state, re-runs the action, and swaps in the re-rendered UI. Compile an app into a single content-addressed artifact and sign it with ed25519. The runtime verifies integrity tamper detection and, with a trusted public key, authenticity — before running a line of it. This is the trust primitive for safe over-the-air UI delivery. php qorm keygen - qorm key, qorm key.pub qorm build examples/counter -o counter.qorm.bundle --key qorm key qorm verify counter.qorm.bundle --trust qorm key.pub qorm run counter.qorm.bundle --trust qorm key.pub refuses tampered/unsigned bundles A tampered bundle fails the hash check; a bundle signed by an untrusted key fails the signature check; both are refused at run time. All pure Go crypto/ed25519 , so it cross-compiles like everything else. php ./scripts/build-all.sh - dist/qorm-{darwin,linux,windows}-{amd64,arm64} Each target is a single static ~7 MB binary with no runtime dependencies. In this default pure-Go build, qorm run --app opens the app in a chromeless browser window. For a true native window, build with -tags desktop . This drives the platform-native WebView WKWebView / WebView2 / WebKitGTK via cgo — using a vendored WebView binding internal/webview /qorm/qorm/blob/main/internal/webview — so it is built per-platform , not cross-compiled from one machine: ./scripts/build-desktop.sh native binary for this OS qorm-desktop-... run examples/counter --app opens a native window The two paths coexist deliberately: default = cross-compile everywhere browser window ; -tags desktop = native window per-platform build . Both render HTML/CSS in a web engine , so both keep the full agent-collaboration stack shared live session over SSE + MCP . The QORM architecture loader → runtime → render → server is identical in both. | build | render | draws widgets | |---|---|---| | default | HTML/CSS → browser | web engine | -tags desktop | HTML/CSS → native WebView | web engine | Expose the app to an agent Claude, Cursor, … over the Model Context Protocol stdio JSON-RPC : qorm mcp examples/counter The agent can design, run, test and operate the app — the loop for real human-AI collaboration: | capability | tools | |---|---| | understand | qorm inspect , qorm render html , qorm get node , qorm list actions | | operate | qorm dispatch run an action , qorm set state | | test | qorm assert stateEquals / htmlContains / nodeExists | | design | qorm preview patch → qorm apply patch | | reason | qorm simulate action side-effect-free | Safety model: simulate and preview patch never touch the live app; apply patch must carry the previewToken returned by a prior preview patch of the same ops — so a committed design change is always bound to a review. qorm run also exposes the agent over HTTP at /mcp , sharing the same runtime the browser renders. An AI's edits appear in every connected browser instantly — the page subscribes to Server-Sent Events at /events with a /poll fallback — and the human's clicks are visible to the AI's next qorm inspect . True real-time human-AI collaboration on one running app. qorm run examples/counter browser UI + agent endpoint at /mcp agent: POST http://127.0.0.1:PORT/mcp JSON-RPC 2.0 app JSON manifest + scenes + actions → loader parse into model.App Node tree / Action / GlobalState → runtime state store + {{expr}} evaluation + action dispatch → render Node → HTML + CSS flexbox browser does layout → server HTTP + /event live update loop | package | role | |---|---| internal/model | App / Node / Action data model | internal/loader | load a dir skips type:test , parse manifest/scene/action | internal/expr | expression evaluator count + 1 , state.x , ternary, ... | internal/runtime | state, binding interpolation, action steps state.set/append/appendObject/toggle | internal/render | full widget set → HTML/CSS, incl. list repeat with {{item. }} scope | internal/server | live HTTP server + event dispatch | internal/bundle | compile + sha256 content hash + ed25519 sign/verify | internal/keys | ed25519 keypair generation and storage | internal/ota | fetch http/file + verify-before-activate, rollback by inaction | internal/mcp | MCP stdio JSON-RPC server agent tools | cmd/qorm | run / render / build / keygen / verify / mcp CLI | Top-tier widget vocabulary, all mapped to semantic HTML/CSS: Layout : row, column, stack/absolute, scroll , grid N columns , card , spacer , divider , wrap. Text : text, link , icon , badge — with fontFamily, lineHeight, letterSpacing, textDecoration, lineClamp / ellipsis , transform. Input : input two-way state binding , textarea , select , checkbox, switch, radio , slider — with onChange events. Media/feedback : image, avatar image or initials , progress , spinner , video . Structure : tabs client-side switching , list data-bound repeat with {{item. }} scope . Plus cross-cutting features on every node: conditional rendering "if": "{{state.x}}" , accessibility role , ariaLabel , title , and rich style shadow, gradient, position + top/left/right/bottom, aspectRatio, min/max width/height, opacity, transition . See examples/gallery . A running app started from a bundle accepts hot updates: POST /update {"source": "