Data camp · 8 entries

The data camp: agents fill in declarative UI

The data camp is solving one problem: letting a model put interactive UI in front of a person without the host running code the model wrote. Every entry uses server-driven UI. The host keeps a catalogue of trusted components and draws them its own way, and the model sends a description. Adaptive Cards did this for bots in 2017. A2UI, json-render, OpenUI, ChatKit widgets and Tambo redo it for agents under three new pressures: streaming (flat lists with ids, or JSON Patch lines, so a half-sent UI still draws), tokens (OpenUI's terse language, and A2UI's Express proposal following it), and editing over several turns (everything addressable by id or name). The paths split five ways. A2UI and Adaptive Cards bet on a portable format where the host owns the look. json-render is a toolkit that treats formats as catalogues and has many renderers, including the only real terminal one (Ink). OpenUI is a compact language with variables, logic and model-free data queries, plus a paid gateway. AG-UI and CopilotKit own the transport and shared state and stay neutral on format. The AI SDK, ChatKit and Tambo follow "model picks, developer renders". Almost everything lives in a browser chat and treats the UI as a message, not a standing screen.

The entries

any · format · protocol

A2UI (Agent-to-User Interface)

A streaming JSON format for agent-described UI that each client renders with its own native widgets from a trusted catalogue.

For fictty Keep fictty's own value internal and write the A2UI v1.0 input adapter onto assembly. Align vocabulary (surface, catalogue, data model, pointer) so the mapping is lossless. Copy the split between structure and data in the patch verbs, structured validation errors that carry a JSON Pointer, placeholders for missing references, and sendDataModel-style state attached to actions in watch. A2UI has no data sources, key maps, layers, pixels, theme or read-back, so it can't be fictty's internal model.

adoptevidence: strong
browser · runtime · protocol

AG-UI and CopilotKit

An event protocol between agent backends and user-facing apps (runs, messages, tool calls, shared state as JSON Patch), with CopilotKit as the frontend stack on top.

For fictty It is a transport, not a UI, so there's nothing to adopt in its place. It could be a second wire protocol for fictty. Emitting state as a snapshot plus RFC 6902 deltas from get --state and watch would let AG-UI tooling consume fictty unchanged. Use CopilotKit's controlled/declarative/open-ended taxonomy to explain where fictty sits.

complementevidence: strong
any · renderer · library

json-render

A schema-agnostic generative UI toolkit: Zod catalogues, flat JSON specs streamed as JSON Patch, and renderers from React to PDF to the terminal (Ink).

For fictty It is the nearest terminal neighbour (the Ink renderer) but it's a library inside someone's app, with no socket, patch-by-id from outside, local data sources or read-back. Adopt RFC 6902 (plus RFC 7396 merge) as fictty's patch dialect, generate agent-facing docs from the same schema the runtime validates, and state fictty's no-logic rule clearly against json-render's growing expression set. Watch for json-render/ink gaining a socket and read-back; that would erode fictty's lead.

competeevidence: strong
browser · format · library

OpenUI (Thesys; C1 now OpenUI Cloud)

A compact, streaming-first UI language (OpenUI Lang) with reactive variables, expressions and runtime-executed data queries, plus a commercial cloud and gateway.

For fictty It can't be adopted: it is a programming language, which breaks fictty's data-never-code rule, and it has no terminal runtime. Its Query(tool, args, default, refreshSeconds) is the nearest cousin to fictty's data sources, so copy the default value that renders before the first result and the re-run when a bound input changes. Publish token counts for fictty examples against A2UI and json-render. Argue the no-logic stance explicitly.

inspireevidence: mixed
any · format · protocol

Adaptive Cards

Microsoft's 2017 JSON card format: declarative UI snippets rendered natively by each host under a host config, with templating and fallback.

For fictty Too small for fictty's screens (no tables with selection, no patch by id, no live binding), so don't adopt it. Take host config (the theme owns the look, and the agent says 'emphasis'), fallback for unknown components (a labelled placeholder instead of a failed push), and a version field in every pushed UI.

inspireevidence: strong
chat · renderer · product

OpenAI ChatKit widgets (and Open-JSON-UI)

A drop-in chat UI whose widgets are designer-made templates (a strict JSX dialect, .widget files with Jinja placeholders) hydrated with data and streamed into a conversation.

For fictty Nothing to adopt: it is a vendor-hosted web component with no public standalone schema and no terminal story. Take the plain-text twin per node, a per-node copy text in get --state that lets an agent quote one card without parsing the frame. The template-plus-data split already matches fictty's project components.

watchevidence: mixed
browser · framework · library

Tambo

A React generative UI SDK and backend where agents pick registered components and keep editing 'interactable' ones; its hosted cloud is shutting down.

For fictty Interactable components back up the idea of an agent continuously editing a live screen. Every fictty node already works this way (patch by id, read back), and the docs should say so. The shutdown is a warning against building a hosted agent loop: stay the runtime that the terminal agent talks to.

watchevidence: mixed
browser · framework · library

Vercel AI SDK generative UI

Generative UI as typed tool calls whose results a React chat renders with developer-built components.

For fictty It is the baseline pattern most agent developers learn: the model picks, the developer renders. fictty's project components are its terminal equivalent and should be at least as easy to use as writing a full UI value. The streamUI retreat supports fictty's data-never-code stance.

watchevidence: strong

The overview

The data camp: agents fill in declarative UI

Research as of 10 October 2026. Dossiers: A2UI, json-render, OpenUI / Thesys C1, AG-UI and CopilotKit, AI SDK generative UI, ChatKit widgets and Open-JSON-UI, Adaptive Cards, and Tambo (added: a large generative UI SDK whose hosted service is shutting down). Nothing on the original list turned out not to exist; “Open-JSON-UI” exists only as CopilotKit’s name for OpenAI’s widget schema, so it’s covered inside the ChatKit dossier.

What’s really being solved

Everyone in this camp is solving the same problem: how to let a model put interactive UI in front of a person without running code the model wrote. The answer is always some version of server-driven UI: the host keeps a catalogue of trusted components and draws them its own way; the model sends a description. Adaptive Cards did this in 2017 for bots. A2UI, json-render and the rest are doing it again for agents, with three new pressures:

  1. Streaming. A person shouldn’t wait for the whole description; formats are flat lists with ids or JSON Patch lines so a half-finished UI can draw.
  2. Tokens. Every brace costs latency. OpenUI built a terse language; A2UI followed with its Express proposal.
  3. Editing over turns. A UI is revised as the conversation goes on, so everything is addressable by id (A2UI components, json-render elements, OpenUI statement names, Tambo’s interactable components).

Almost all of it lives in a chat, in a browser, and most of it treats the UI as a message: a card in a thread that a later message replaces. Long-lived screens are the exception.

The paths

pathwhothe bet
A portable format, host-native renderingA2UI, Adaptive Cardsbe the contract under every client; the host owns the look
A schema-agnostic toolkit with many renderersjson-renderbe the library everyone renders with, whatever the format
A compact language with logic and dataOpenUI (Thesys)tokens and power matter more than “pure data”; sell the gateway
The transport and shared stateAG-UI, CopilotKitstay neutral on format, own the pipe and the frontend stack
Model picks, developer rendersAI SDK, ChatKit, Tambothe model never lays out UI; it calls typed tools or fills templates

The open debates

  • How much logic belongs in the data? The spectrum runs from Adaptive Cards and A2UI (small functions for formatting, validation and and/or/not) through json-render ($cond, visible, watch, $computed) to OpenUI (variables, ternaries, loops, filters, queries). Every format that started as “safe like data” has added logic. fictty’s rule (substitution only, logic in the runtime or in commands) is at the strict end, and that’s a position to argue, not a default.
  • JSON or a language? OpenUI’s benchmark claims about half the tokens of JSON formats; A2UI’s Express proposal concedes the point. JSON stays the wire format; what the model types may not be JSON for long.
  • Catalogue sameness. Critics say fixed catalogues make every generated UI look alike; the defenders say that’s the point (the host’s design system).
  • Standard or toolkit? A2UI wants to be the standard; json-render treats standards as catalogues; OpenUI calls its language a standard; CopilotKit supports all of them. Consolidation has started: Thesys renamed C1 to OpenUI Cloud, OpenAI is retiring Agent Builder, Tambo Cloud is shutting down, the AI SDK walked streamUI back to experimental.

What almost nobody does (and fictty does)

  • Read back what was drawn. These formats are one-way: the agent knows what it sent and what actions came back, not what the person sees, where the cursor is, or what is selected. ChatKit’s copy_text and A2UI’s sendDataModel are the closest. A frame as text plus the full state as JSON is unclaimed.
  • Data that skips the model. Values usually arrive through the agent (A2UI updateDataModel, AG-UI state deltas). OpenUI’s Query(..., refreshSeconds) is the single exception and the nearest cousin to fictty’s data sources.
  • A long-running screen an outside agent attaches to. All of these are libraries inside someone’s app. None is a process an agent in a terminal can push to, patch, drive with keys and read back.
  • The terminal. Only json-render’s Ink renderer is real there (about 590,000 npm downloads a month, though downloads overstate users); the A2UI terminal renderers (a2ui-ink, the Rust a2ui crate) are tiny.

Should fictty adopt one of these as its format?

Hard-nosed answer: no single format replaces fictty’s value, and A2UI is the only one worth speaking natively.

  • A2UI maps best: surfaces, components by id, a data model by JSON Pointer, custom catalogues. It lacks data sources, key maps, layers, pixels, theme (removed in v1.0) and any read-back, and v1.0 is still a release candidate. Keep fictty’s value internal, write the A2UI v1.0 adapter onto assembly as planned, and align vocabulary so the mapping is lossless. If A2UI goes stable and grows an extension for bound data sources, re-run this decision.
  • json-render: adopt its patch dialect (RFC 6902, plus RFC 7396 merge), not its spec; the spec carries logic fictty forbids.
  • OpenUI Lang: incompatible with “data, never code.” Take its data-source details (defaults, re-run on input change) and its token discipline.
  • AG-UI: a possible second transport, not a format. Emitting state as snapshot plus JSON Patch deltas would let AG-UI tooling consume fictty unchanged.
  • AI SDK, ChatKit, Tambo, Adaptive Cards: nothing to adopt; ideas only (controlled pattern, plain-text twin per node, host config, fallback, versioning).

What this means for fictty’s position

The data camp has settled the format question well enough that fictty shouldn’t compete on it. What’s left open is everything after the first render: a screen that stays up, runs its own behaviour at frame rate, pulls its own data, and can be read back exactly. That’s fictty’s ground. The risk is json-render/ink (or an A2UI terminal renderer) growing a socket and a read-back verb; that would be a weekend’s work for a motivated maintainer, so fictty’s lead is in the loop’s quality and speed, not in the idea.

For the bigger question (UI that’s cheap enough to throw away, and visual learning rather than reading an agent’s text), this camp is mostly silent. Its products are chat cards and enterprise forms. Nobody here is designing for “an agent builds a screen to help a person understand something, and then the screen goes away.” That framing is open.