NACNative Agent Contract v2.3.1 · stable

Drive web UIs by voice, chat, AI.

NAC is a small public spec that lets your existing web UI be driven by AI assistants, voice runners, RPA bots, and accessibility tools -- without writing per-app glue code. Add a few HTML attributes; agents resolve names, click buttons, fill fields, and switch tabs the way a human would.

PEER REVIEWS · 2026-05

Six independent AI systems just evaluated NAC under the 2026 post-human paradigm.

"Architecturally inevitable." — ChatGPT-5  ·  "Right problems, right primitives." — Claude Opus  ·  "Not a luxury — a fundamental requirement." — DeepSeek

80–90% less LLM hallucination · 90% fewer tokens vs raw HTML · 80–95% less visual RPA · ~0 test maintenance

Read the full peer reviews →
EMPIRICAL BENCHMARK · 2026-05

600 runs across 5 models and 3 protocols. NAC3 caught zero phantom selectors; Raw DOM passed CI with broken selectors on 15% of runs.

95.5% NAC3 success  ·  0/200 silent damage (vs 30/200 in Raw)  ·  3.5× fewer round-trips than MCP

5 models tested · ~US$15 to re-run · 1h 23min wall-clock · fully reproducible · bundle included

See results & methodology →
CASE STUDY · 2026-05 · CONDUIT (REALWORLD)

Forge migrated Conduit -- 47 React components, $0.46, ~70 seconds -- and auto-generated 66 e2e tests across 4 frameworks. 4.7× more cases than the fork's hand-written Cypress.

--ai-apply walks JSX with Claude  ·  59 manifest elements, semantic IDs + imperative verbs  ·  4 frameworks (Playwright/Cypress/Vitest/WDIO)

47 files scanned, 34 decorated · ~$0.50 end-to-end · SPA-aware bridge (MutationObserver on route change)

Read the Conduit case study →
MIGRATION PAPER · 2026-05

One vanilla calculator, three NAC3 decoration paths -- Forge silent, Forge assisted, Sumi manual. All three hit 5/5 functional. The reading is in the deltas.

$0.045 per decoration via Forge  ·  15/15 dispatch tasks OK  ·  +24% manual i18n bloat

3 decorations compared · byte-by-byte diff · live demos · drive each calc with Pilot

Read the migration paper →

How small is small

A button you already shipped, with three extra attributes:

<!-- Decorate the button -->
<button data-nac-id="invoice.save"
        data-nac-role="action"
        data-nac-action="save"
        onclick="saveInvoice()">
  Save
</button>

// Now any agent can drive it:
await NAC.click('invoice.save');              // by id
await NAC.click_by_verb('invoice', 'save');   // by verb

Add the runtime once:

npm install @nac3/runtime
// or via CDN:
<script src="https://yujin.app/nac-spec/js/nac.js"></script>

Live demos

All four open in your browser. The v21 data-table demo is wired to the Yujin chat backend -- talk to it.

example.php v1.9 stable

The canonical NAC v1.9 demo. 27 widgets (chat, calendar, autopilot, modals, tabs, charts) covering the full v1.9 surface in production-shaped UI.

Open demo →
example-v20-primitives-showcase.php v2.0-rc4

Didactic showcase of the eight v2.0 primitives + HMAC + isTrusted + i18n contract. One section per primitive. Read this if you want to understand each new thing in isolation.

Open demo →
example-v20-full.php v2.0-rc4

Brownfield migration of the v1.9 demo to v2.0 strict. Same 27 widgets, same HTML, same handlers -- v2.0 layer applied via ~80 lines of setup. Demonstrates that adoption does not require rewriting every widget.

Open demo →
example-v21-data-table.php v2.1 + chat

Live data-table demo wired to the Yujin chat backend (Claude Sonnet). Talk to it: "agrega monitor cantidad 1 a 250", "borra el teclado", "ve a permisos", "leeme el total".

Try the chat →
example-v23-editor.php v2.3 preview

Field editor primitive. Click "Edit" on any field -- a Word-style modal opens with 8 NAC3-callable verbs: select_word, select_sentence, select_all, replace, delete_selection, ai_correct_syntax, save, cancel. Or ask the chat "edita la descripcion y corrige la gramatica".

Try the editor →
demos/react/ v2.2 npm + React 18

Compiled React + Vite study case running on this server. Real @nac3/runtime package consumed via npm. Todos UI + chat panel + autopilot tour. Yujin design tokens. npm run build output served as static assets.

Open React demo →
demos/angular/ v2.2 npm + Angular 17

Compiled Angular 17 standalone mirror of the React study case. Same UI, signals + onChatAction overrides + NacService wrapper. ng build output served as static assets.

Open Angular demo →

Made with NAC3

Apps that ship the NAC3 contract today. Your project belongs here -- see the bounty program below.

Yujin CRM

The reference production app. Sales pipelines, deliveries, inventory, finance -- every screen NAC3-compliant.

Visit →

Reference demos

Eight live demos (vanilla, React, Angular, data-table, interop). Public source, MIT.

See demos →

Atlas Pro voice ad

Voice-driven advertisement that closes the sale itself. The visitor speaks, the agent fills the form against a NAC3 manifest, submits the lead to a CRM. Ten languages. Live.

Try the live demo →

Your app

Run our AI playbook to migrate any web app to NAC3 in a single afternoon. Claim a bounty for the first 10 OSS apps.

AI playbook →

Coming Q3 2026: Yujin Forge + Pilot

Two commercial tools built on NAC3, BYOK (you supply your Claude / OpenAI / Gemini key). Sign up to be notified when they launch.

Yujin Forge -- $19/mo

The IDE for NAC3 apps. Claude Code curado + scaffolding + auto-deploy + forge publish. Every app you build is NAC3-compliant by default and ships with Pilot bundled free.

  • Guided BYOK setup wizard
  • Multi-provider router (Claude / OpenAI / Gemini / local)
  • Token-aware UI (cost before action)
  • "Convert existing app" mode

Yujin Pilot -- $5/mo (or free w/ Forge)

The controller for NAC3 apps. Voice + chat + keyboard dispatch across every NAC3-compliant app in the registry. The first general-purpose accessibility tool that works on every app.

  • Registry browser of NAC3 apps
  • Cross-app routing + pairing
  • Premium TTS + multi-device sync
  • Mobile companion

BYOK: subscriptions cover the tooling -- guided setup, multi-provider routing, prompt caching, token-aware UI, app registry. They do not cover AI consumption. You pay Anthropic, OpenAI, or Google directly.

For builders

Pick what you need. All Apache-2.0; copy whatever fits.

Use cases

Voice + chat is the headline. The contract underneath unlocks four more.

Voice + chat

Voice runners (Siri-style, Whisper-fed, browser SpeechRecognition) and LLM chat agents drive the same UI a human uses, by stable name. Multi-locale out of the box (10 languages). The headline use case.

Accessibility

Users with motor impairment can drive the app by switch device, head-tracker, or eye-gaze through a NAC-aware adaptor -- without per-app retrofit. Braille displays, sip-and-puff controllers, and Dasher-style predictive keyboards get a stable target tree to render. Where ARIA stops at "this is a button," NAC says "this button has a verb the assistive tool can call."

Testing & QA

Stable names that survive UI redesigns. Test code says NAC.click('invoice.save'), the design team moves the button from a toolbar to a dropdown, the test keeps passing. Selenium, Playwright, Cypress, and headless browsers all consume the same contract. Auto-generated test corpora (per role + ack family) make near-100% coverage cheap.

RPA

Robotic process automation traditionally scrapes the DOM with brittle CSS selectors that break on every UI change. With NAC, an RPA bot reads NAC.describe(), picks an action by verb, calls it, and waits on the canonical event family. No screenshot OCR, no XPath rituals. The same bot drives ten different vendors' apps if all ten are NAC-3 conformant.

Agentic control

LLM agents (Claude, GPT, Gemini, local models) drive web UIs by name without per-app fine-tuning. Cross-app interop (v2.3 preview): a host agent imports a peer app's tree via MCP and proxies dispatches. "Yujin, jump to Excel" becomes one extra MCP call. The contract scales to a marketplace of NAC-3-compliant apps each addressable from any agent.

Case studies

Existing apps that adopted NAC. The brownfield migration recipe is in the Yujin framework migration doc.

Yujin CRM brownfield in progress

Yujin CRM is the framework's first adopter -- a production multi-tenant SaaS being progressively migrated to NAC-3. The 7-step migration recipe (decorate top-20 buttons -> manifest -> ack events -> coverage -> chat + autopilot -> HMAC + isTrusted -> field editor) is documented and re-runnable for any existing app.

Read the migration story →
React + Vite study case greenfield

Vite + React 18 todos app that consumes @yujin/nac from npm and wires chat + autopilot in ~250 lines. npm install + npm run dev -- runs against the production Yujin chat backend.

Open packages/nac-react-demo →
Angular 17 study case greenfield

Angular 17 standalone mirror of the React study case. Same UI, same flows, framework-shaped service + signals. Useful side-by-side reference for shop-internal "should we use React or Angular" decisions.

Open packages/nac-angular-demo →

Why NAC, why now

Voice assistants, LLM chat agents, and accessibility tools all face the same problem: they need stable names for the things they want to act on. CSS selectors break when you redesign the UI. ARIA was designed for human-driven assistive tech, not agent-driven automation, and its contract stops at "this is a button" rather than "this button has a verb the agent can call".

Today every team builds its own per-app glue: a custom voice grammar, a hand-written automation script, a one-off accessibility shim. That work does not transfer between apps, between teams, or between agent vendors.

NAC is a small experimental contract that lets those agents talk to those apps without per-pair integration. ARIA stays in place for the accessibility tree; NAC adds a parallel agent tree on the same elements.

Where NAC3 fits in the agent stack

NAC3 is the client-side half of agent-driven software. MCP is the server-side half. Use both for full-stack agents: MCP exposes your business logic, NAC3 exposes your UI.

NAC3 does not compete with any of these tools -- it overlaps in narrow ways and complements in others. If you only have one of the problems below, use the dedicated tool. If you have several, NAC3 unifies the contract.

LayerWhat it solvesWhere it stopsNAC3 relationship
MCP (Anthropic) Agent calls server-side tools / functions Does not touch the UI; agent cannot navigate, fill forms, or read on-screen state Complement. Use MCP for backend ops, NAC3 for the UI half. v2.3 preview adds an MCP bridge to route between NAC3 apps.
ARIA Accessibility tree for screen readers + switch devices Stops at "this is a button named Save"; no verb the agent can call, no completion event Sits next to. Keep your ARIA roles. Many adopters end up with role="button" and data-nac-role="action" on the same element.
data-testid Stable selectors for test runners (Cypress, Playwright) Test-only; no manifest, no event family, no provenance, no i18n Superset. NAC3 covers the testing case + voice + RPA + LLM with the same attribute, but at a higher mental cost. If you only need tests, data-testid is fine.
AG-UI (CopilotKit) Agent-to-app protocol for chat-driven UIs Tied to the CopilotKit framework + JS runtime; less focus on RPA / a11y / cross-vendor LLMs Adjacent. Different bet on the same space. AG-UI has Series A funding and an existing ecosystem; NAC3 is open and framework-agnostic but earlier-stage. Pick AG-UI if you build on CopilotKit; NAC3 if you want a framework-neutral surface.
Computer Use / browser-use (vision-based) Agent reads pixels, reasons over screenshots Slow, expensive, brittle on dynamic content; depends entirely on the LLM Fallback layer. Vision is what the agent uses when NAC3 is not there. NAC3 turns a 3-second pixel-reasoning round into a 30 ms named dispatch.

Honest read: if you are inside a single app with a single agent vendor, MCP (server) + a screen-reader-grade ARIA pass (client) covers most cases. NAC3 starts paying back when you have multiple callers (voice + chat + RPA + tests), cross-app workflows, or you want vendor-portable integrations.

Governance

NAC3 is stewarded by Yujin today -- one company, not a foundation. We say this up front because the difference matters: NAC3 is not yet an industry standard the way ARIA or MCP are. It is a vendor-authored contract published under permissive licenses (Apache 2.0 spec + MIT runtime) so adopters do not depend on Yujin's continuity.

Spec changes follow an RFC process with at least 14 days of public comment for any change to the public API or wire format. We commit to moving NAC3 to a neutral foundation (W3C community group, Linux Foundation, or equivalent) if and when adoption justifies neutral governance. Until then, the Apache 2.0 + MIT licensing is what guarantees portability -- adopters can fork either, run either, and ship either, today and after we are gone.

Read the full statement in ABOUT.md + CONTRIBUTING.md. Accessibility commitment in docs/ACCESSIBILITY.md.