Interfaces, described in JSON

An open specification for declaring dynamic user interfaces: structure, data binding, validation, and behavior in one portable JSON document.

{
  "$schema": "https://example.com/ui-schema/app",
  "type": "form",
  "props": {
    "onSubmit": { "$action": "submit" },
    "children": [
      {
        "type": "input",
        "props": {
          "label": { "$t": "signup.email" },
          "value": { "$field": "/email" }
        }
      },
      {
        "$if": { "$data": "/acceptedTerms" },
        "$then": {
          "type": "button",
          "props": {
            "label": { "$t": "signup.submit" }
          }
        }
      }
    ]
  }
}

From document to interface

The specification separates what a UI is from how it gets rendered:

Language
The keywords, composition rules, and semantics defined by the specification.
Dialect
Element definitions composed into a JSON Schema meta-schema, defining the element types and props documents may use.
UI Schema
A document written in the language and a specific dialect, describing the UI to render.
Engine
Interprets a document and its data context, mapping each element type to a renderer component and managing state, events, and validation.

What it unlocks

When an interface is data, it can come from anywhere — a model, a database, an editor:

Generative UI with guardrails

Let an LLM compose interfaces without writing free-form code. The dialect constrains generation to known elements, props, and actions — every document validates before it renders.

Server-driven UI

Ship new screens and flows from the backend without a client release. Clients render whatever document the server sends.

Form builders

Store forms as data: field bindings, validation, and conditional logic live in one document, editable without touching the frontend.

CMS and page builders

Let editors compose pages from an element catalog. The output is portable JSON, decoupled from any particular frontend.

Cross-platform rendering

One document, many engines. Map the same element types to web, mobile, or native renderers.

Experiments and personalization

Swap documents per user, segment, or experiment at runtime — no deploy required.