Accessible AI, without rebuilding your interface.

Framework-independent accessibility for the AI interface you already have.

generative-a11y / runtime

RUNTIME / QUICK START

Start with the package that fits your stack.

npm install @generative-a11y/
event trace complete

01response.startedpolite queue opened

02response.text.deltasegment buffered

03tool.startedresearch in progress

04response.completedfinal update delivered

The interface stays yours

generative-a11y adds accessible behavior to the AI interface you already have without replacing its UI or stealing focus. If lifecycle evidence is incomplete, it says so.

Observe the behavior layer

Interactive runtime laboratory

Step through bounded lifecycle traces without moving focus.

Scenario
Ready

scenario / streaming

Streaming

A response delivers two useful segments before confirmed completion.

Evidence boundary. The trace is deterministic. It demonstrates event handling, not screen-reader output.

Behavior, not replacement UI

Built for asynchronous AI

One normalized vocabulary covers the work between a prompt and its terminal state.

01 / stream

Streaming stays useful

response.started
response.text.delta
response.completed

02 / tools

Tool work has a lifecycle

tool.started
tool.progress
tool.completed | tool.failed

03 / focus

Focus remains user-owned

captureFocus()
restoreFocus()
preventScroll: true

04 / schedule

Announcements are scheduled

queued
merged | suppressed
announced | cancelled

Keep your UI

Add accessibility without starting over

Connect generative-a11y to the AI stack and interface you already use.

Works with your stack

AI SDKassistant-uiAG-UIReact

One behavior layer

Make asynchronous AI easier to follow.Clear updates for streams, tools, approvals, and completion.
Choose your integration

Development-only trace explorer

Debug accessibility behavior before users find the problem

Follow each update from source to browser delivery without exposing message content.

Accessibility trace Live session

Observed

Response started

A new response was confirmed by the connected adapter.
Why
Opened one bounded, polite update queue.
Browser
Nothing announced yet.
Privacy
Message text hidden
Explore Devtools

From event to delivery

Start with the runtime.

Install core and DOM, then report events from your existing chat.

npm install @generative-a11y/core @generative-a11y/dom
Read the getting started guide
core + domchat-accessibility.ts
import { createRuntime } from "@generative-a11y/core";
import { bindRuntime } from "@generative-a11y/dom";

const runtime = createRuntime();
const delivery = bindRuntime(runtime);

runtime.dispatch({ type: "response.started", responseId: "response-1" });
runtime.dispatch({
  type: "response.text.delta",
  responseId: "response-1",
  delta: "A complete sentence.",
});
runtime.dispatch({ type: "response.completed", responseId: "response-1" });

// Call when the chat is removed, not after each response.
export function disposeChat() {
  delivery.dispose();
  runtime.dispose();
}

MIT licensed, package by package

Accessible behavior, clear boundaries.

Add only what you need. Every package has one focused job.

  1. 01@generative-a11y/core

    Runtime, policies, scheduling, and diagnostics.

  2. 02@generative-a11y/dom

    Browser announcement delivery and focus utilities.

  3. 03@generative-a11y/react

    React provider, hooks, and runtime bindings.

  4. 04@generative-a11y/ai-sdk

    Adapter for documented Vercel AI SDK state.

  5. 05@generative-a11y/assistant-ui

    Adapter for assistant-ui lifecycle state.

  6. 06@generative-a11y/ag-ui

    Adapter for the public AG-UI protocol.

  7. 07@generative-a11y/devtools

    Development-only diagnostics and redacted traces.