Canvas-native accessibility review workflow for Figma and FigJam. v3.0.0 pairs The A11Y Project Checklist with live contrast inspection, three on-canvas audits, native Dev Mode annotations, evidence-bound sign-off, and a canonical Canvas Record.
Active users on Figma Community across design teams at companies of all sizes
Checklist and interface translated through a term-protected pipeline
Audit platform, native annotations, and evidence-bound sign-off
The first version of a11y Companion solved a workflow problem: The A11Y Project Checklist lived on a website, and designers needed it inside the file they were working in. That version worked, and teams adopted it. Using it surfaced a harder problem.
A checked box is a claim, not a measurement. Nothing in the widget knew whether the file actually met the criterion beside the checkmark.
Version 3.0.0 keeps the checklist and gives every item a way to be measured, annotated, signed, and recorded.
a11y Companion 3.0.0 turns the widget from a checklist into a review workflow that produces evidence.
Three audits run directly against the selected canvas scope, sharing a capped 25-finding slot with failures sorted ahead of warnings. Counts stay truthful past the cap rather than reporting only what fits.
Watch mode re-checks the selected layer on every selection change through a keep-alive bridge. Ownership is shared state with last-writer-wins takeover, so the team can see who is driving.
Findings leave the widget and become artifacts the rest of the team already knows how to read.
A section can be signed by a named reviewer, and the signature fingerprints what was actually reviewed: item ids, completion state, and checklist revision. When items change underneath a signed section, the stamp turns amber and the section reads as needing re-review.
Export as Markdown, CSV, or JSON. Reports carry run owner and time, scope, full counts, grouped evidence, and an explicit disclosure when rows are representative rather than complete.
Most of the hard bugs in v3 came from the runtime behaving differently than the API surface suggests:
height=0figma.clientStoragesessionId rather than in-memory identity to survive the same resetEarly token pairing matched on names containing "text" and "bg". Testing
against Vercel's Geist file showed why that fails: ramp-named systems use
gray/100 through gray/1000, and the audit was
checking roughly twelve pairs. It now infers role from the trailing numeric
step, reading high steps as ink and pairing them against low steps and
explicit surfaces in the same family, with the pair cap raised to 800.
The widget's own design system is checked by scripts rather than convention, and the checks run in lint:
Twenty locales are generated through a pipeline that shields WCAG codes and inline markup from machine translation. Missing keys fall back to English per key, so a newly shipped command renders in English rather than as a blank menu item while its translations are reviewed.
The product site is statically prerendered and gated by a Chrome-based check that exercises audit interactions and control geometry at 390, 768, 1000, and 1440px. The site's inspector demo is held to the production widget's exact specimen size, card inset, and vision grid.
The widget has 400+ users across teams from startups to Fortune 500 enterprises, and v3 changes what those teams can prove:
Accessibility work becomes measurable rather than self-reported, because audits run against the file instead of a checkbox
Findings reach engineering through native Dev Mode annotations that carry the WCAG reference and the failing property
Reviews survive the file as a Canvas Record and as Markdown, CSV, or JSON exports
Approvals expire honestly when the design changes under a signed section
Twenty locales put the checklist in front of teams that do not work in English
The widget passes its own checklist. Checkboxes meet WCAG 1.4.11 non-text contrast, severity is never carried by color alone, and WCAG references render correctly in both themes. Holding the tool to the standard it measures caught defects in the tool itself.