ARIA Live Region Debugger

Paste HTML and validate aria-live, aria-atomic and aria-relevant on dynamic regions

Ad placeholder (leaderboard)

Live regions are how a screen reader learns that something on the page changed without the user moving focus there, such as a form-save confirmation or a new chat message. They are also famously easy to get wrong: the wrong politeness setting, a conflicting role, or an invalid aria-relevant token can mean the announcement never happens or happens too aggressively. This tool validates your live-region markup against the ARIA spec.

How it works

The tool parses your HTML and collects every element that is a live region, either through an explicit aria-live attribute or through an implicit live role: alert, status, log, marquee or timer. For each one it checks:

  1. aria-live is one of off, polite or assertive. An assertive value without role="alert" is flagged, because assertive interrupts the user and is usually meant only for true alerts.
  2. Implicit roles are reconciled with any explicit aria-live. role="alert" implies assertive plus atomic, and role="status" implies polite; a conflicting explicit value is reported.
  3. aria-atomic is true or false only.
  4. aria-relevant contains only the tokens additions, removals, text or all, and a lone removals is flagged as noisy.
  5. A region that is empty at load is noted as good practice, since the container should be registered before content is injected.

Example

<div aria-live="aggressive" aria-relevant="removals"></div>

This has two bugs: aggressive is not a valid aria-live value (the options are off, polite and assertive), and announcing removals alone is rarely useful. The tool reports both with the correct alternatives.

Tips and notes

  • Default to polite. Reserve assertive (or role="alert") for errors and other interruptions the user must hear at once.
  • Keep the region element in the DOM from page load and only change its text content; replacing the whole element can defeat the announcement.
  • For a running log, use aria-atomic="false" so only the newest line is read; for a short toast, use aria-atomic="true".
  • All parsing is local to your browser; the markup you paste never leaves the page.
Ad placeholder (rectangle)