---
title: A2UI
description: How Framewerk relates to A2UI — concept mapping only; the exporter is planned, not shipped.
status: planned
url: https://getairframe.com/framewerk/integrations/a2ui
---

> Part of the Framewerk docs. Index of every page: /framewerk/llms.txt

# A2UI

**Status: planned.** There is no A2UI exporter today. This page is a
concept-mapping table so you can see where the two formats meet before the
exporter exists. There are no install instructions because there is nothing
to install.

Framewerk is opinionated; A2UI is a UI-exchange format aimed at agents and
assistants. The relationship is **export** — post-1.0 — not a conversion
layer in the other direction.

## Concept mapping

| A2UI concept | Framewerk equivalent |
| --- | --- |
| Root application tree | `screens[]` with a `layout` tree |
| Widget / component catalog | ~40 built-in node types (`text`, `button`, `input`, …) plus user `components` |
| Widget props | Node layout props and type-specific props |
| Data binding to a model | `stateVars` + `$state` / expressions in `showWhen` |
| Actions / tool calls | `action` strings: `navigate`, `back`, `setState`, `toggleState`, `scrollTo`, `openUrl` |
| Navigation / intents | `flows[]` and `navigate(screenId)` |
| Styling / theming | `styles[]` tokens and rules; `brands[]` for identity |
| Localization | `content` registry: `$c()` labels, `$f()` fixtures |

## The same screen, both shapes

Framewerk (what you write today):

**A Framewerk screen**

```json
{
  "formatVersion": "1.0",
  "screens": [
    {
      "id": "home",
      "stateVars": { "email": { "type": "string", "default": "" } },
      "layout": {
        "_id": "root",
        "type": "column",
        "gap": 12,
        "padding": 24,
        "children": [
          { "_id": "h", "type": "text", "variant": "heading", "content": "Sign in" },
          { "_id": "e", "type": "input", "label": "Email", "placeholder": "you@example.com" },
          { "_id": "go", "type": "button", "variant": "primary", "content": "Continue" }
        ]
      }
    }
  ]
}
```

The same screen expressed as A2UI-shaped JSON (illustrative, not a shipped
export):

```json
{
  "version": "0.1",
  "layout": {
    "type": "column",
    "children": [
      { "type": "text", "value": "Sign in", "style": "heading" },
      { "type": "input", "label": "Email", "placeholder": "you@example.com", "bind": "email" },
      { "type": "button", "label": "Continue", "onTap": { "type": "submit" } }
    ]
  }
}
```

The mapping is one-to-one for layout and controls. What Framewerk has that
A2UI does not model is the full document: flows, styles with tokens, devices,
and a validator. What A2UI has that Framewerk does not is a schema-agnostic
contract with external tool calls — Framewerk's `action` grammar is
deliberately six verbs.

## When the exporter ships

It will lower a Framewerk document to A2UI for a target that only speaks
A2UI. Until then: no install, no CLI, no claim of support. Follow the
project changelog for the status flip.
