Skip to content
Accessibility Audit cover
FrontendFree · MIT

Accessibility Audit

WCAG audit that maps each barrier to a criterion and a concrete fix — keyboard, names, contrast, semantics, live regions.

v1.0.0 · ~663 tokens · ⬇ 0 · Updated July 6, 2026

What it does

Audits UI for real accessibility barriers grouped by impact: blocking (keyboard operability, accessible names, image alt, form labels) and serious (contrast, semantics, live regions/focus, zoom/reflow). Every finding maps to a WCAG criterion with a concrete fix. Prefers native semantics over ARIA and tests the keyboard path.

Example uses

Audit a checkout form

You are shipping a payment form and need the WCAG barriers found and fixed before launch.

Audit this React checkout form (CheckoutForm.tsx) for accessibility: the card fields use placeholders instead of labels, validation errors only turn the border red, and the submit spinner is never announced. Map every finding to its WCAG criterion, group blocking versus serious, and give the concrete fix for each — native semantics over ARIA wherever possible.

Fix broken keyboard navigation

A user reports they cannot operate your app without a mouse.

A keyboard-only user cannot open the dropdown menu or dismiss the modal in dashboard.tsx. Walk the full keyboard path — tab order, visible focus indicators, Enter and Escape handling, focus trap and restore in the modal — and fix every break. The menu items are currently div onClick, so replace them with the correct native elements.

Make icon buttons announce themselves

Your toolbar is all icon-only buttons and a screen-reader user hears nothing useful.

Our editor toolbar has 12 icon-only buttons (bold, link, undo, and so on) with no accessible names, and the auto-save toast is never announced. Add a correct accessible name to each button, wire the toast to an aria-live region, and list the WCAG criterion each fix satisfies so I can document compliance for the release.

Install

# 1. Create the skill folder in your Claude setup
mkdir -p ~/.claude/skills/accessibility-audit

# 2. Download SKILL.md into it (or move the file you just downloaded)
#    → ~/.claude/skills/accessibility-audit/SKILL.md

# 3. Claude Code auto-discovers it on next launch.

Inside the skill

SKILL.md
---
name: accessibility-audit
description: Audit a UI/component for accessibility (WCAG) with concrete, checkable issues and fixes. Use when building or reviewing UI, before shipping a page, or when asked "check accessibility", "is this a11y compliant", "audit for screen readers". Findings map to WCAG and come with the fix.
---

# Accessibility Audit (WCAG)

Accessibility is not optional polish — it's whether a chunk of your users can use the
thing at all (and, increasingly, a legal requirement). Audit against real barriers, fix concretely.

## Check (grouped by impact)

### Blocking (a real user is locked out)
- **Keyboard**: every interactive element reachable and operable by keyboard alone; visible
  focus indicator; no keyboard traps; logical tab order. (Try it: unplug the mouse mentally.)
- **Names**: every button/link/input has an accessible name (visible label, `aria-label`, or
  associated `<label>`). Icon-only buttons WITHOUT a name are invisible to screen readers.
- **Images**: meaningful `<img>` has descriptive `alt`; decorative images have `alt=""`.
- **Forms**: inputs have labels (not just placeholders — placeholder is not a label); errors
  are announced and tied to the field (`aria-describedby`), not just colored red.

### Serious
- **Contrast**: text ≥ 4.5:1 (≥ 3:1 for large text); don't rely on color alone to convey
  meaning (add icon/text). Check the actual computed colors, states included.
- **Semantics**: use real elements — `<button>` for actions, `<a>` for navigation, headings
  in order, lists for lists. A `<div onClick>` is not a button.
- **Live regions / dynamic content**: updates (toasts, async results) announced via
  `aria-live`; modals trap focus and restore it on close.
- **Zoom/reflow**: usable at 200% zoom; no horizontal scroll from a fixed layout.

### Minor (friction, not a barrier — the task still completes)
- **Near-miss contrast**: slightly under the ratio on decorative or non-essential text
  (body text under the ratio stays Serious).
- **Faint focus ring**: a focus indicator that exists but is hard to spot — a missing one
  is Blocking.

## Output

```
A11Y AUDIT — <component/page>
BLOCKING / SERIOUS / MINOR
  [level] <issue> — <element> — WCAG <criterion> — Fix: <concrete change>
Passes: <what's already accessible>
```

## Rules

- Map each finding to a WCAG criterion and a concrete fix — "improve accessibility" helps no one.
- Prefer native semantics over ARIA. The first rule of ARIA: don't use ARIA if a native
  element does the job. Bad ARIA is worse than none.
- Test the keyboard path yourself in your head (tab, enter, escape) — it catches the most, fastest.

Changelog

  • v1.0.02026-07-03Initial clean-room write.

Frequently asked questions

Is Accessibility Audit free?

Yes. Accessibility Audit is free to download and MIT-licensed.

Where do I install Accessibility Audit?

Place the SKILL.md file in ~/.claude/skills/accessibility-audit/ and Claude Code auto-discovers it on next launch.

How many tokens does Accessibility Audit use?

About 663 tokens — it is designed to be token-lean.

Anthony M. — Founder & Lead Reviewer
Anthony M.Verified Builder

We're developers and SaaS builders who use these tools daily in production. Every review comes from hands-on experience building real products — DealPropFirm, ThePlanetIndicator, PropFirmsCodes, and many more. We don't just review tools — we build and ship with them every day.

Written and tested by developers who build with these tools daily.