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.
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>
All four open in your browser. The v21 data-table demo is wired to the Yujin chat backend -- talk to it.
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 →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 →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 →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 →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 →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.
Compiled Angular 17 standalone mirror of the React study case. Same UI, signals + onChatAction overrides + NacService wrapper. ng build output served as static assets.
Apps that ship the NAC3 contract today. Your project belongs here -- see the bounty program below.
The reference production app. Sales pipelines, deliveries, inventory, finance -- every screen NAC3-compliant.
Visit →Eight live demos (vanilla, React, Angular, data-table, interop). Public source, MIT.
See demos →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 →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 →Two commercial tools built on NAC3, BYOK (you supply your Claude / OpenAI / Gemini key). Sign up to be notified when they launch.
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.
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.
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.
Pick what you need. All Apache-2.0; copy whatever fits.
Voice + chat is the headline. The contract underneath unlocks four more.
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.
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."
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.
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.
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.
Existing apps that adopted NAC. The brownfield migration recipe is in the Yujin framework migration doc.
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 →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.
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 →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.
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.
| Layer | What it solves | Where it stops | NAC3 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.
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.