Library
Components, schemas, renderers, and action contracts define the vocabulary.
A product architecture explainer
The OpenUI docs describe a powerful generative UI loop. We keep that loop intact—then add a connector data plane, SQLite mirrors, an HTML-first creative canvas, governed capability execution, durability, and an AI-native operating surface. This is the open-kimono account of both the system and the failure-driven method that produced it.
01 / The OpenUI baseline
OpenUI’s documented architecture is a component contract turned into a prompt, a model-generated OpenUI Lang stream, and a parser/renderer that progressively maps that stream to native UI.[1] Runtime Query() and Mutation() calls resolve through the Renderer’s tool provider.[2]
Components, schemas, renderers, and action contracts define the vocabulary.
The library becomes model-readable instructions and tool definitions.
The model chooses and composes an interface for the user’s intent.
A compact, declarative OpenUI Lang program arrives progressively.
The program becomes a validated, typed element tree.
Registered React components become the live interface.
OpenUI also explicitly documents forward references for progressive rendering[3], and component/state/data as distinct Lang statement types.[4] That separation is the foundation Snappy extends rather than replaces.
02 / The connector data road
RunConnectorCommand is Snappy’s one resident road for reading a connected external source. The model passes a connector slug and the user’s natural-language request once. Printing Press resolves and completes the read internally, then returns bounded rows plus the exact contracts the generative UI must bind. A blended ask uses one call per source—often concurrently—then one model judgment and one composed surface.
“Show my important unread email before tomorrow’s meetings.”
The exact request enters one selected connected source. This tool is read-only.
Direct exact reads skip the inner model. Complex asks can fan out list → detail in one bounded internal loop.
Printing Press chooses the honest serving road. SELECT-only SQL can answer compound local questions in one call.
The result includes operation-scoped rows, columns, query bindings, mutation contracts, source state, and a ledger.
The model synthesizes the answer and authors HTML/OpenUI Lang against those exact fields and handles.
The Renderer’s toolProvider resolves Query and Mutation calls through the governed provider registry.
RunConnectorCommand gives the outer model enough bounded source truth to judge what matters, reconcile sources, choose fields, and design the answer. Internal list/detail operations stay inside the connector road instead of bloating the parent chat with tool-call choreography.
Query("exact_handle", exact_args) inside the emitted Lang points the Renderer back to the registered provider and mirror. That is what lets a saved surface reopen, refresh, and remain queryable rather than becoming decorative JSON frozen into cards.
The local data plane
Printing Press connectors can maintain a user-local SQLite mirror. The mirror gives Snappy a low-latency, structured source for reads, search, counts, filters, joins, and offline-aware state—without forcing every repaint to wait on a remote API.
The important distinction is honesty: local rows carry sync age and source state. If a live request fails authentication, cached rows are stale evidence, not a fake fresh success.
sql for compound local questions
When the generated connector exposes it, a SELECT-only SQL verb can answer counts, filters, aggregations, and joins over the mirror in one read.
“Discord is institutional memory,” “Stripe is business health,” “Linear is a team-behavior observatory.” The connector’s product thesis is a required compilation input, not launch copy.
Catalog what existing CLIs, skills, and MCP servers already do; match the useful parts; then use local relational history to create compound questions a stateless wrapper cannot answer.
Auto-JSON when piped, --compact, dry-run, typed exit codes, search, SQL, and bounded output make the generated capability cheap and recoverable under repeated model use.
03 / HTML + OpenLang
Your instinct is right: this is one of the clearest departures from the docs. The OpenUI documentation we reviewed centers registered component libraries as the visual vocabulary.[5] Snappy reverses the emphasis for ambitious surfaces: one authored HTML/CSS canvas owns art direction, while OpenUI Lang supplies live data, state, registered React components, and governed actions.
The library defines the visual and behavioral vocabulary. The model emits component calls, and defineComponent maps Lang nodes to React components with validated props.[6] The official material does not present Snappy’s one-HTML-canvas + React-portal mount pattern.
Html and HtmlMount are Snappy-defined OpenUI components. HTML gets full layout and visual freedom. The component kit becomes interactive atoms, specialized capabilities, and the quick-answer path.
data-openui-mount slots inside the HTML.
$state and actions become reactive runtime behavior.
// Local reactive state $search = "" // HTML owns the complete visual composition root = Html("<style>...responsive art direction...</style> <main class='inbox'> <header><h1>Priority inbox</h1></header> <section>{{#each items}}...{{subject}}...{{/each}}</section> <aside data-openui-mount='controls'></aside> </main>", {items: filtered}, [controls]) // Query supplies live data through toolProvider mail = Query("gmail_messages", {limit: 20}, {rows: []}) filtered = @Filter(mail.rows, "subject", "contains", $search) lead = @First(filtered) // Mutation declares a governed capability; it is inert here archive = Mutation("gmail_messages_modify", {id: lead.id, userId: "me", "remove-label-ids": ["INBOX"]}) // Real React/OpenUI controls mount inside the HTML slot search = FormControl("Search", Input("search", "Filter inbox...", "text", null, $search)) stage = Button("Stage archive", Action([@Run(archive)]), "primary") controls = HtmlMount("controls", [search, stage])
Query()Calls a registered read handle and exposes reactive result fields to the program.
$stateHolds local, user-editable state for inputs, selections, filters, and view controls.
Mutation()Declares a potential write against an exact registered capability; declaration alone does nothing.
Action()Composes gesture-time operations such as @Run, @Set, @Reset, and query refresh.[7]
HtmlMount()Places the real registered React component tree into a named slot in the authored HTML.
04 / The whole architecture
The difference is not a forked syntax or a replacement renderer. It is everything before and after the renderer: a governed data plane, one model harness, typed composition, source contracts, artifact identity, and proof that the visible result matches reality.
Query() and Mutation() identities.The practical formula
OpenUI gives us a safe, model-native way to describe and render interfaces. Snappy adds the laws that make those interfaces trustworthy enough to become the product itself.
Every request enters the same AI SDK harness. A greeting and a database dashboard differ by the handles disclosed—not by a hidden shortcut, regex lane, or canned renderer.
One resident read road resolves the natural-language ask, returns real rows for model judgment, and attaches the exact registered handle the generated surface must bind at render time.
Queries can read only available, granted sources. Mutations remain inert until a real control fires them—and AI-requested external effects stage typed approval objects instead of silently executing.
ComposeUI carries one HTML-first Lang program. CSS owns art direction; Query, state, Mutation, Action, and mounted React components supply the live functionality.
Beyond parser validity, Snappy blocks phantom providers, unreachable handles, invented fields, dead mutations, fake data defaults, empty sections, static data dumps, and source-binding drift.
A stable artifact identity makes the UI reopenable and versioned. Follow-up turns patch the same object instead of creating duplicates; query bindings remain live across refresh and re-entry.
A small semantic AI-for-AI surface exposes asks, grants, staged actions, approvals, artifacts, activity, and rendering. A generated whole-route MCP wrapper separately forces every side door to be classified and governed.
Prose cannot claim data loaded, an action ran, or a surface rendered unless the underlying state proves it. Live, cached, stale, empty, error, and auth-expired are explicit product states—not vibes.
05 / How it was actually made
Snappy OS was not designed from a clean architecture diagram and then implemented. It was excavated from real work: founder dictation, failed agent turns, screenshots, audit documents, production traces, SDK behavior, and repeated attempts that looked plausible but lied at runtime. The codebase is a compiled record of those lessons.
Emotional language was treated as compressed acceptance criteria: “undeniable,” “5 seconds useful,” “deliver then approve,” “never make me explain it again.”
Conversations, dictations, audits, and machine lanes became one source-ranked spec plus an explicit unmined ledger—so summaries could not quietly shrink the goal.[M1]
“Cached data masqueraded as fresh,” “surface emitted but never painted,” and “mutation timed out after dispatch” became different typed states—not one generic error.
Credential truth belongs to the connector gate. Source identity belongs to the binding contract. Approval belongs to execution. Paint belongs to the client receipt.
Use prompt language for taste, strategy, and recovery. Put decisive guidance in the tool description the model sees when it must choose—not in a distant hint tail.
If disobedience can create a lie, leak, or side effect, the instruction graduates into schemas, enums, state machines, provider gates, lints, or receipts.
Test arbitrary human phrasing, the installed app, the actual runtime owner, live connector state, renderer paint, and a separate audit—not a curated prompt or same-session toast.
Once the SDK-native path works, delete sentinels, regex lanes, static connector tables, fallback surfaces, duplicate prompt catalogs, and legacy render exits.
Prompts as runtime architecture
There is no single magical system prompt. The runtime assembles a byte-stable head, a live variable tail, deferred skill loaders, typed result memory, and native tool schemas. The OpenUI grammar, component schema, and runtime catalog are generated from the same canonical library—without a hand-maintained second language.[M2]
The model still saw a 19.6k “phone book” of familiar component signatures. A late hint could not defeat that resident habit. The fix was not more adjectives; it was shrinking disclosure and moving the HTML-first law into ComposeUI’s highest-salience description.[M3]
Prompt prose once contradicted the actual mutation gate, and the model repeated the prose instead of testing the tool. The runtime now treats the typed tool result as truth; prompt text explains how to recover.
Prompt owners, token ceilings, cache placement, resident schemas, tool output caps, and reasoning effort were measured after real regressions—not tuned as abstract “context engineering.”
Earlier Claude Code work found that good skills remained inert when the model had to remember to load them. Prompt-submit hooks, file context, rules, passive indexes, and later ToolSearch turned retrieval from a memory test into an environmental affordance.[M4]
The suggestion-engine harness explicitly separates live, sample, built-but-unrouted, migration-target, and honest-stub states. That same discipline now shapes Snappy’s connected, stale, empty, approval-pending, outcome-unknown, and painted verdicts.[M5]
Prompt-optimization work found 527 traces could collapse to roughly 12 unique inputs; optimizer choice and judge quality had to follow information diversity, not event count. The same law bounds connector rows and treats relevance × structure as the useful context budget.[M6]
The Charlotte/Cyborg line did not solve retrieval by stuffing in more memory. It modeled a current goal, suppression and boost signals, access history, salience, and nightly decay in local durable state. Context became an attention policy that changes with the task.[M9]
In the companion-agent runtime, the model chooses the semantic action, but the boundary injects authoritative companion, user, post, comment, group, scene, and lineage IDs from session context—replacing hallucinated or mismatched arguments. Judgment belongs to the model; identity belongs to the runtime.[M10]
The Content Engine’s visual QC scores logic, composition, style, text, artifact cleanliness, and two-second concept relevance, then makes overall quality the minimum dimension—not the average. One fatal weakness cannot hide behind five pretty scores. Its preservation mode also learned when to judge the voice without rewriting it.[M11]
Rejected because curation hid a weak generator. Delight must be the default behavior of the generative road, not a hand-picked retrieval lane.
The strict rule over-constrained valid static creative work. It was demoted to advisory while factual data remains bind-or-omit.
“Marking it fake” was recognized as hiding the failure. The source-binding and served-field boundary must prevent the fabricated claim.
They made demos look smart while arbitrary language failed. One model-owned harness and machine metadata replaced request-string routing.
It created two render/persist owners and lost prose on reload. One assistant message now owns both prose and its ComposeUI tool part.
It burned invisible tokens and time on compact OpenLang. “Auto” moved to low effort; explicit operator choice still wins.
The MCP lineage moved from more than 100 resident tools, through mode and slug filters, to 182 definitions extracted behind progressive discovery, and finally to five resident product concepts plus ToolSearch. Context became an operating budget, not a catalog shelf.[M7]
Ralph-style loops kept branch tip equal to the best-known state: attempt, build, drive the real story, keep on proof, revert on failure, and preserve the evidence ledger. Motion without a retained, audited improvement stopped counting.[M8]
06 / The novelty ledger
OpenUI, React, SQLite, MCP, the AI SDK, local mirrors, and approvals are not individually new. The original work is the way they are fused into one inspectable lifecycle where a model-authored visual answer remains causally connected to the read that grounded it, the authority that permits it, the object that stores it, and the evidence that proves its effect.
Bounded rows ground model judgment at composition time; the exact registered Query() handle re-executes at render time. A causal contract proves those are the same operation, arguments, source, and fields.
RunConnectorCommand accepts the user’s request once. Printing Press may execute directly, fan out list-to-detail, or run declared SELECT-only SQL, then returns operation-scoped rows plus the exact read and write contracts ComposeUI can use.
Instead of asking the component kit to carry all visual expression, one authored HTML/CSS canvas owns art direction. OpenUI Lang becomes the capability spine: data, state, mutations, actions, and registered React behavior.
HtmlMount portals registered OpenLang children into named positions inside the canvas. The model gets arbitrary composition without gaining a second JavaScript or tool runtime.
Multi-operation reads do not collapse into a union of rows and handles. Each executed operation retains its arguments, served fields, source identity, query handle, and eligible mutation contracts.
SQLite is not treated as a generic cache. The mirror carries schema, product-row versus plumbing-row identity, sync state, credential state, freshness, and an explicit live/local serving decision.
A multi-source surface must visibly connect the sources in its answer. Parallel raw tables do not satisfy synthesis; the binding contract checks that the rendered structure actually reconciles them.
A Lang Mutation() only declares capability. @Run stages at gesture time; policy resolves authority; a human-plane approval may execute; a fresh read verifies. Timeouts after dispatch become execution_outcome_unknown, never blind retries.
The same surface can remain ephemeral or acquire artifact identity, version lineage, exact bindings, refresh behavior, and incremental in-place edits. It becomes software state, not a screenshot inside a transcript.
Validated, emitted, painted, hydrated, persisted, approved, executed, and verified are separate epistemic states. The model can stop when a surface reaches the wire without the product falsely calling it painted.
External AIs receive a small semantic MCP product surface. Separately, a generated one-to-one route wrapper forces every local HTTP door to declare object, action, grant, mode, receipt, and result typing before it can hide.
The component library generates grammar, schemas, and catalogs; runtime disclosure is budgeted; live truth is separated from cacheable law; skills are lazy; result memory is typed. Prompt behavior and executable boundaries are designed together.
Printing Press compiles APIs or observed traffic into capabilities. OpenUI compiles a component library into model grammar and Lang into React. Snappy compiles lived failures into typed laws, gates, state machines, and receipts. The product is a stack of truth-preserving compilation boundaries.
In the builder kernel, a skill progresses from mentionable to callable, drillable, scriptable, cronable, and measurable by adding inspectable files—not editing a central router. The filesystem is both declaration and reflection.[K1]
A certificate answers “did the effect happen?” An eval answers “is the result any good?” The historical Snappy Mini experiment made every verb declare an eval and caught quality defects that exit-code success and self-reporting had missed.[K2]
Another builder experiment split immutable human intent and sources from agent-rewritable verbs, libraries, logs, and learned state. The AI becomes the CPU for a portable program that can self-bootstrap across harnesses instead of depending on one vendor runtime.
OpenUI still owns Lang, parsing, progressive rendering, actions/state, Query()/Mutation(), and the artifact preview/panel model. Vercel AI SDK owns the provider-neutral tool loop and stream parts. React owns the component runtime and portals. MCP supplies the protocol. SQLite supplies the local relational store. Snappy’s invention is the product contract that joins them—and the refusal to add a second implementation path when an upstream primitive already owns the job.
07 / The hard-won laws
These are not aesthetic preferences. Each law exists because a plausible implementation produced a live, user-visible lie. For an expert audience, this is the real architecture: the failure mode, the boundary that now owns it, and the general lesson that transfers to other agentic systems.
Rows at composition time let the model inspect fields, reconcile sources, and make judgment. Exact Query() bindings at render time let the surface refresh and reopen. Rows without handles create a frozen paste; handles without rows force blind composition.
General lesson: Separate model grounding from runtime binding, then causally attest that they describe the same read.[S1]
Models ignored “never read an unconnected source,” advertised dead mutations, and invented fallback data even when the prompt was explicit. Credential readiness, registered-provider reachability, served fields, and approval requirements now refuse mechanically.
General lesson: If violating an instruction creates a lie or side effect, convert the instruction into a typed boundary check.[S2]
A text sentinel plus a separate surface-only message rendered one tool result twice; reload then kept the surface and lost the prose. The correct OpenUI model is one assistant message: prose in content, surface in toolCalls, rendered once beneath that message.[8]
General lesson: Framework-native state should have one author and one durable identity.[S3]
A durable generated app needs a canonical artifact ID, stable app identity, version lineage, and patch semantics. Follow-ups must modify the active object, not mint a same-title sibling or regenerate the whole Lang program.
General lesson: Durable GenUI is object versioning, not transcript persistence.[S4]
Local data makes generative surfaces feel immediate, but a cached row beside a dead credential can look “live” unless source state is explicit. Every surface needs one honest state: live, cached, stale, empty, error, or auth-expired.
General lesson: Latency optimization without freshness semantics is a truth regression.[S5]
Two detectors looking at different step-result paths graded composed, persisted surfaces as empty output. Snappy now derives terminal-surface truth from the same completed tool results the AI SDK stop condition sees.
General lesson: Never let orchestration completion and product success observe different realities.[S6]
Arbitrary script inside a generated canvas would create a second, ungoverned tool and state runtime. Snappy permits HTML/CSS art direction, escapes bound data, paint-contains the surface, and mounts only registered React/OpenUI capabilities through HtmlMount.
General lesson: Give the model freedom in representation, not in authority.[S7]
The live connector/provider map once disappeared only for profile-carrying turns—the exact shape the app sent—while curl probes saw the full context. The model looked “dumb,” but prompt assembly had split reality.
General lesson: Instrument prompt blocks and tool disclosure on the production request shape, not a convenient probe.[S8]
If list, detail, and aggregate reads are flattened into one row bag with one handle bag, the composer can bind a field to a broader or different query than the one that produced it. Each operation must retain its own args, rows, served fields, and handle.
General lesson: Preserve provenance at the granularity where execution happened.[S9]
Retrying an external mutation after a network timeout can duplicate the effect. Snappy distinguishes pre-dispatch failure from post-dispatch uncertainty, stamps execution_outcome_unknown, disables blind retry, and seeks an independent verification read.
General lesson: Model uncertainty about the effect itself; “exception” is a transport fact, not business-state truth.[S10]
Decks, reports, and static visual artifacts were incorrectly sentenced to timeouts because the success grader demanded a query-settlement acknowledgement that could never exist. Artifact identity or a no-paint-required verdict is the right proof for that class.
General lesson: Define proof obligations by effect class, not one universal success boolean.[S11]
Four source results around 60k characters exhausted the provider input budget after the surface had already rendered. Connector output is now bounded and compacted after preserving full internal truth; the outer model receives enough rows to judge, not every byte the source can produce.
General lesson: Observation quality is relevance × structure, not raw volume.[S12]
The MCP family first exposed more than 100 tools, then tried modes and slug filters, then extracted 182 definitions behind search. The surviving design is a tiny semantic resident core with exact schemas pulled on demand.
General lesson: Make the correct capability discoverable at decision time; do not make every capability resident all the time.[S13]
A prompt optimizer saw 527 EmailResponder traces collapse to roughly 12 unique inputs after deduplication. Optimizer choice, judge quality, and confidence had to be based on diversity and rich context—not row count.
General lesson: Before optimizing an AI system, measure unique situations and comparable metrics; duplicated telemetry creates false confidence.[S14]
The Mini experiment separated certificates from evals: one proves the action occurred, the other independently judges the result. Its content eval caught planted defects that exit codes and the actor’s self-report missed.
General lesson: Give every consequential verb both an effect proof and a quality proof, with a different actor and auditor.[S15]
Autonomous browser loops attempted one story, built, drove the real path, retained the commit only on proof, and reverted failed attempts while preserving the audit ledger. Reversibility let the loop be aggressive without quietly degrading the branch.
General lesson: Design long-running agents as monotonic evidence systems: explore freely, but promote state only after an independent gate.[S16]
08 / Firsthand MCP proof
On July 19, 2026, Codex entered through the public snappy-render MCP surface as caller claude-code. It discovered capabilities, read CoinGecko through the connector road, inspected the SQLite mirror, requested OpenUI composition, opened the Activity spine, and rendered a packaged-app screenshot. The result confirmed the architecture and exposed several contracts that still need tightening.
Discoversnappy_list_connectors returned four readable mirrors. CoinGecko was hydrated with 37,650 rows, 12 tables, and exact registered query handles—before any data request was attempted.
AskA plain-English request resolved to Printing Press command coins markets, returned five served rows in about five seconds, and stamped Query("coingecko_coins", …) plus the exact arguments and fields.
MirrorThe low-level proof read five rows in about one second from local table coins at ~/.local/share/coingecko-pp-cli/data.db, which contained 18,772 rows.
ComposeThe one-call snappy_ask(render:true) timed out at the MCP client, yet Activity later recorded “allowed, 5 rows, with generated UI.” The server completed after the transport had given up.
Paintsnappy_render_proof produced a 121,427-byte screenshot from the installed app bundle. The app chrome and provenance rendered; the data canvas exposed a separate freshness problem.
The inspected CoinGecko artifact declared a live query, but after five seconds it still showed $62,500 Bitcoin and $1,200B market cap while the connector had just served roughly $64,664 and $1,297B. A loading spinner remained visible.
Transferable lesson: Validate composition, binding, provider resolution, first paint, freshness, and fallback provenance as separate stages. “Contains Query()” proves only one of them.
The combined ask reported an aborted operation to the calling AI, but the Activity spine later showed that the governed read and generated UI completed. The standalone render, by contrast, landed an explicit failed receipt and no artifact.
Transferable lesson: Long-running AI tools need durable request IDs, resumable status reads, and idempotent retrieval. A transport exception must never be treated as authoritative execution state.
The same response described CoinGecko as hydrated, fresh, and credential_missing:false, then marked it not AI-operable because “no credential” was present—even though the governed read succeeded immediately.
Transferable lesson: Health, readiness, credentials, grants, and operability must derive from one canonical state projection. An AI cannot safely plan from mutually incompatible booleans.
The mirror query was correctly allowed by a CoinGecko read grant, but its envelope also exposed unrelated grants for Gmail, Calendar, scripts, skills, and artifacts. Enforcement was scoped; disclosure was broader than the task required.
Transferable lesson: Apply least privilege to context and receipts as well as execution. Return the winning grant and relevant lineage; keep unrelated authority out of model-visible payloads.
09 / Side-by-side
The docs correctly leave product policy to the host application. Snappy’s unique work is turning those host responsibilities into explicit, enforced, testable primitives rather than scattered app code.
| Dimension | OpenUI docs | Snappy OS |
|---|---|---|
| Primary unit | A generated interfaceA Lang program rendered by a registered library. | A governed UI objectA Lang program plus source identity, authority, lifecycle, state, and receipts. |
| Model path | The host calls a modelThe generated prompt teaches components and tools. | One provider-neutral AI SDK harnessThe SDK owns the tool loop, streaming parts, stop conditions, and terminal truth for every turn. |
| Tool disclosure | Tools are included in the generated promptThe app chooses the practical size and shape. | Five resident tools + ToolSearch cascadeA lean always-visible core; exact long-tail schemas are retrieved only when the model needs them. |
| Connector grounding | The host supplies tool resultsOpenUI starts once the application has defined the relevant tools and data road. | RunConnectorCommand owns the readThe user’s request enters a generated Printing Press skill unchanged; direct reads, list/detail fan-out, or SELECT-only SQL finish behind one parent tool call. |
| Data access | Function map or MCP clienttoolProvider resolves Query() and Mutation().[2] |
Printing Press → registered handlesGenerated connectors, local source mirrors, live readiness, exact arguments, and a dynamic provider registry feed that same toolProvider. |
| Local data plane | Application-specificOpenUI does not prescribe a connector cache or mirror architecture. | User-local SQLite mirrorsScheduled mirror-first reads, auto/live fallback, freshness state, and optional SELECT-only SQL make connected data fast without pretending cached means live. |
| Creative canvas | Registered component libraryModels compose the visual vocabulary assembled with defineComponent and createLibrary.[6] |
One HTML/CSS canvas for ambitious surfacesSnappy’s custom Html component owns art direction; HtmlMount portals real React/OpenUI capabilities into named slots. |
| Composition | The model emits OpenUI LangThe renderer consumes the response stream. | The model calls ComposeUIThe Lang program, object identity, placement, durability, and action allowance travel through one typed terminal tool part. |
| Validation | Parser + schemas + renderer errorsSyntax and component contracts are validated progressively. | Parser plus product-semantic gatesSnappy also checks provider reachability, query/mutation lane, source match, real served fields, action wiring, density, durability, and truthful defaults. |
| Writes | A Mutation calls the supplied toolPolicy belongs to the host. | Authority is part of the runtimeAI-side external effects stage; human approval owns execution. Credentials, grants, risk, exact payload, and receipts are enforced server-side. |
| Artifacts | Preview + actual viewOne artifact has an inline preview and a detailed panel/full view. | SDK-native artifact model, extendedSnappy adds saved HTML, files, images, documents, spreadsheets, presentations, Live Apps, storage, versioning, and rehydration to the same registry. |
| Messages | Content + tool calls in one assistant messageTool output renders inline beneath its parent message. | Exactly the same message truthProse stays prose; the ComposeUI tool part owns the surface. No sentinel, duplicate surface-only message, or parallel persistence road. |
| Lifecycle | The host decides what survivesRenderer state and artifact controls are available. | Ephemeral and durable share one roadA stable app_slug / artifact ID turns the same live-bound surface into a reopenable, in-place patchable, versioned object. |
| Truth model | Error and parse callbacksThe app receives the signals needed to present state. | A product-wide state-language contractEvery data surface declares live, cached, stale, empty, error, or auth-expired—and success prose is gated on the real result. |
| AI surface | OpenUI can execute tools through MCPMCP is one supported tool-provider form. | Snappy itself is an AI-for-AI capability busExternal AIs get a curated semantic surface; a separate generated MCP x-ray proves governance coverage across the whole local product. |
10 / What is actually unique
The novelty is the combination. Source grounding, approvals, model orchestration, artifacts, MCP, and generated UI exist independently. Snappy fuses them into one governed lifecycle where the visual answer and the executable truth are the same object.
The interface does not merely display plausible values. It carries the exact source handle, arguments, fields, freshness, and causal receipt needed to prove where those values came from.
A button is not simulated state. It is a real registered capability with a risk class, grant, approval policy, payload preview, execution road, and receipt.
The same composition can stay ephemeral or become a named, reopenable, versioned Live App. Follow-ups refine the active object rather than regenerating a disconnected screen.
The model is not decorating an app. It is operating through the product’s own typed roads—and other AIs can use those same governed concepts without guessing hidden routes.
.openui answers per skill.11 / Open-kimono ledger
Transparency means separating shipped mechanisms, ratcheted contracts, observed defects, and aspirational specification. These are the sharp edges a sophisticated team should see before copying the ideas.
The positioning
Our differentiation is not that we can make prettier generated screens. It is that a generated screen can be trusted as a live, permissioned, source-bound, durable piece of software—and can be operated by humans and AIs through the same product laws.
12 / Source notes
This explainer distinguishes OpenUI’s documented SDK responsibilities from the product responsibilities Snappy OS adds. The official documentation was retrieved through Context7 and checked against the implementation links below; Snappy claims point to the repo boundaries that enforce them.