Skip to content
Agentmart
Submit a tool

a2ui

This skill should be used whenever the run has to produce a user interface rather than prose.

Skill by theschoolofai

IndexedMIT
Write a review

Chalk Labs

Need help deploying a2ui?

Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.

Book a call

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/theschoolofai-a2ui

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

This skill should be used whenever the run has to produce a user interface rather than prose. Load it before adding a compose_surface node, and whenever the request asks to "show", "display", "render", "make an app", "build a page", "make it interactive", or asks for a quiz, exercise sheet, dashboard, form, report or worksheet. It carries the closed component catalog, the data-binding rule, and four behaviours of the render client that are not guessable.

Use cases: documents, spreadsheets, frontend, data

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/a2ui

What's inside

Skill name
a2ui
Description
This skill should be used whenever the run has to produce a user interface rather than prose. Load it before adding a compose_surface node, and whenever the request asks to "show", "display", "render", "make an app", "build a page", "make it interactive", or asks for a quiz, exercise sheet, dashboard, form, report or worksheet. It carries the closed component catalog, the data-binding rule, and four behaviours of the render client that are not guessable.
License
MIT
Instructions
106 lines in SKILL.md · view on GitHub

Files (2)

  • SKILL.md
  • catalog.md · references/

SKILL.md (first lines)

You are composing an A2UI surface. Read this before you plan the nodes, not after.

## The shape you produce

A surface is three things and no markup:

```json
{
  "root": "col_main",
  "components": [ {"id": "...", "type": "...", ...}, ... ],
  "dataModel": { "title": "...", "questions": [...] }
}
```

`components` is a flat array linked by `id`, not a nested tree. A parent names its
children by id in a `children` list. One component is the `root`.

## The rule that matters more than any other

**You compose structure. You do not author data.**

The harness builds the data model from what the run actually produced, and hands
you the list of pointers that exist as `available_pointers`. Your job is to
choose components and bind them to those pointers.

```json
{"id": "q1_stem", "type": "Text", "variant": "body", "text": {"$bind": "/item_0_detail"}}
```

**Bind only to a pointer that appears in `available_pointers`.** A pointer you
invent resolves to nothing. The surface will still validate, because the
structure is legal, and it will render with every field blank. That failure is
silent: no rejection, no error, an interface full of empty cards.

Read `available_pointers` first and design the layout around what is genuinely
there. If the data you want is not in the list, the fix is upstream: the node
that produced the content needs to emit it as structured data, not prose. Do not
paper over it by inventing a path.

Values you may write literally are the ones no user supplied: a `Card` title, a
`Tabs` label, a section heading. Everything that came from the run is a binding.

**Inputs are the exception, and it is easy to get wrong.** For `TextField`,
`CheckBox`, `InputChoice` and `Slider`, the `value` binding is where the answer
is *written*, not where content is read from. It should point at a fresh pointer
under `/input`, one per control, and it will be empty until the user acts. That
is correct: an unanswered question has no answer.

    options -> a pointer that exists and holds the choices  (read)
    value   -> /input/q0                                     (write)

Do not point a `value` at content, or the first keystroke overwrites it.

## Four things about the render client you cannot guess

**`Modal` does not hide anything.** The client draws it as a labelled block and
always renders its children. If you put answers in a `Modal`, they are on screen
immediately. Never use `Modal` to conceal.

**`Tabs` genuinely conceals.** It renders only the active panel; the others are
not in the DOM until clicked. `Tabs` is the only concealment you have. Each child
of a `Tabs` is one whole panel, and `labels` is a comma-separated string naming
them in order.

**Buttons do four things and each is a server round-trip.** `onPress` accepts only
`approve`, `reject`, `request_data`, `rerun`. There is no `submit` and no `reveal`.
If your design needs a button that does something else, the design is wrong: use
`Tabs` for progressive reveal and inputs for local state.

**`Text` with `variant: "heading"` is rendered literally; `body` is rendered as
safe markdown.** Put `$x^2$`-style plain text in body variants and it survives.

Inputs (`TextField`, `CheckBox`, `InputChoice`, `Slider`) write straight back into
the data model in the browser, so a learner can select answers with no round-trip.

## Composing an exercise or quiz

This is the pattern that works with the constraints above:

- `Tabs` at the top with `labels: "Questions, Solutions"`.
- Panel one: a `Column` of `Card`s, one per item. Each card holds a `Text` (body)
  bound to the pointer carrying that item's question, and an `InputChoice` bound
  to the pointer carrying its options.
- Panel two: a `Column` of `Card`s bound to the pointers carrying the solutions.

The learner answers in tab one and checks in tab two. No buttons, no actions, no
round-trip, and nothing is spoiled because tab two is not rendered until clicked.

Every one of those bindings must come from `available_pointers`. If the run
produced ten questions but the only pointers are `/item_0_label` and
`/item_0_detail`, then that is what you bind, and the layout follows the data you
have rather than the data you wish you had.

Use `Notice` with `tone: "warn"` to carry an instruction like "attempt before
opening Solutions".

## Before you finish

Call `load_skill` with `reference: "catalog.md"` to get every component type and
its exact properties. Do that before composing rather than guessing a property
name: a type or property that is not in the catalog is rejected by the validator,
and the rejection names the component and the field.

Keep the data model flat and boring. Arrays of objects with short keys bind
cleanly; deep nesting produces pointers nobody can read.

From theschoolofai/S17Code, MIT.

Signals

Stars
0
Forks
31
Open issues
0
Last commit (this folder)
Aug 13, 2026 (2 months ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from theschoolofai

Done for you

Rather not set it up yourself?

Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.

See how we build AI agents →Read the case studies

Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.

launches shipped
50+
launches shipped
media placements
500+
media placements
founders on every account
2
founders on every account

Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block

Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.

Get a2ui running in your business

Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying a2ui?

CallGet help
Cite this page

a2ui skill. Agent Mart. https://agentmart.dev/skills/theschoolofai-a2ui (last updated 2026-10-24)