a2ui
This skill should be used whenever the run has to produce a user interface rather than prose.
Skill by theschoolofai
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.
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.
About
Use cases: documents, spreadsheets, frontend, data
Reviews
Write a reviewNo 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.
More from theschoolofai/S17Code
- 0.521score
web-pages
theschoolofai
This skill should be used whenever the run creates or edits an .html file, or the request mentions a page, a site, a landing page, CSS or the browser.
SkillBFreshness: BClaude Code +9 - 0.513score
house-style
theschoolofai
Always on.
SkillBFreshness: BClaude Code +9 - 0.499score
bento-slides
theschoolofai
This skill should be used when the request is for a slide deck, a presentation, a talk, a pitch, or "make some slides about X", and a .bento.html file is…
SkillBFreshness: BClaude Code +9 - 0.281score
charts
theschoolofai
No description from the publisher yet.
SkillBFreshness: BClaude Code +9 - 0.278score
python-bugfix
theschoolofai
No description from the publisher yet.
SkillBFreshness: BClaude Code +9
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
- Repository
- github.com/theschoolofai/S17Code
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from theschoolofai
- 0.521score
web-pages
theschoolofai
This skill should be used whenever the run creates or edits an .html file, or the request mentions a page, a site, a landing page, CSS or the browser.
SkillBFreshness: BClaude Code +9 - 0.513score
house-style
theschoolofai
Always on.
SkillBFreshness: BClaude Code +9 - 0.499score
bento-slides
theschoolofai
This skill should be used when the request is for a slide deck, a presentation, a talk, a pitch, or "make some slides about X", and a .bento.html file is…
SkillBFreshness: BClaude Code +9
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.
Cite this page
a2ui skill. Agent Mart. https://agentmart.dev/skills/theschoolofai-a2ui (last updated 2026-10-24)