We target WCAG 2.1 Level AA across the marketing site, sign-in and the study app. Of the 21 criteria in the table below (20 of them at our target level), 16 are supported and 5 are partially supported, with the specific gap named in each case.
What is verified, and how: axe-core runs on every release over seven marketing routes and all eight signed-in surfaces, at WCAG 2.1 A and AA. That is an automated floor rather than a certification — axe catches on the order of a third of real barriers, and the rows it cannot judge say so.
We have not had the product tested by a screen-reader user, and we are not going to imply otherwise. If something blocks you, write to accessibility@brainback.chat and it goes to the front of the queue.
a summary, not the agreement — the clauses below are what binds
Conformance table
Statuses use the ordinary three values: Supports means we have evidence it holds, Partially supports means it holds with a stated exception, and Not independently verified means we believe it holds and cannot show you proof.
| Criterion | Lvl | Status | What we know |
|---|---|---|---|
| 1.1.1 Non-text content | A | Partially supports | Icon-only controls carry aria-label; decorative art is hidden from assistive tech. Complex product illustrations do not yet have long descriptions. |
| 1.3.1 Info and relationships | A | Supports | Landmarks (main, nav, header, footer), heading order, and programmatic labels tied with htmlFor. Verified by axe on every release across the marketing routes and all eight signed-in surfaces. |
| 1.3.4 Orientation | AA | Supports | Nothing is locked to an orientation. Every surface reflows to 390px width. |
| 1.4.3 Contrast (minimum) | AA | Supports | 4.5:1 or better on body text in both the day and night themes; checked by axe with motion frozen, because a measurement taken mid-fade is meaningless. |
| 1.4.4 Resize text | AA | Supports | Type is set in relative units throughout; the app scale is driven by CSS custom properties, and a repo lint rule rejects raw pixel font sizes on the app surface. |
| 1.4.10 Reflow | AA | Partially supports | No surface scrolls horizontally at 320px except three that are allowed to: the concept map, wide tables, and code blocks, each inside its own scroll container. |
| 1.4.11 Non-text contrast | AA | Supports | Control borders, focus rings and chart fills sit above 3:1. The signal palette carries separate darker tokens for text on a tint for exactly this reason. |
| 1.4.12 Text spacing | AA | Supports | Line height and letter spacing come from tokens and survive user overrides without clipping. |
| 2.1.1 Keyboard | A | Supports | Every interactive element is reachable and operable by keyboard. The recall reviewer is keyboard-first by design: space turns a card, 1–4 grade it. |
| 2.1.2 No keyboard trap | A | Supports | Dialogs close on Escape as well as on their close control. |
| 2.4.1 Bypass blocks | A | Supports | A skip link to #main on every page. |
| 2.4.3 Focus order | A | Partially supports | Follows DOM order everywhere. Axe cannot judge focus order, and we have not had this verified by a person who navigates this way by necessity. |
| 2.4.7 Focus visible | AA | Supports | A visible focus ring on every focusable element; never removed without a replacement. |
| 2.5.3 Label in name | A | Supports | Accessible names contain the visible text of the control. |
| 2.5.5 Target size (beyond target) | AAA | Partially supports | Primary controls are 40–48px. The footer sitemap is the known exception; its rows were enlarged to 14.5px with 30px hit areas in October 2026 and it is still a dense index. |
| 3.1.1 Language of page | A | Supports | lang="en" on the document root. The product is English-only today. |
| 3.2.2 On input | A | Supports | No control changes context on focus or on a value change alone. |
| 3.3.1 Error identification | A | Supports | Inline errors are text, not colour alone, and announced with role="alert". |
| 3.3.2 Labels or instructions | A | Supports | Every field has a visible label; the ones that need it carry a hint saying what the value is for. |
| 4.1.2 Name, role, value | A | Supports | Native elements wherever possible. Custom controls (tabs, the desk picker, the mastery nodes) declare their role and state. |
| 4.1.3 Status messages | AA | Partially supports | Streaming replies, grading and the recall counter use aria-live. Whether each announcement is actually useful is a judgement axe cannot make. |
How this is verified
Two automated suites run against every release. tests/a11y.spec.ts sweeps seven marketing routes — the homepage, pricing, product, for-schools, the trust centre, sign-in and the privacy policy. tests/a11y-authed.spec.ts signs in and sweeps all eight study surfaces: Today, Learn, Recall, Sessions, Mastery, Brain score, Ask and Settings. Both assert zero violations at WCAG 2.1 A and AA, and both freeze page motion first, because a contrast measurement taken while an element is mid-fade is a measurement of nothing.
A violation axe reports is a real one. The reverse does not follow: whether focus order makes sense, whether a live region announces something a person can use, whether a label describes what the control actually does — none of that is machine-checkable, and those rows above are marked partial for that reason rather than hidden.
What we have not done
- No audit by a third party, and no VPAT prepared by anyone but us.
- No testing session with a screen-reader user. This is the gap that matters most and it is the one we most want closed; if you use one and are willing to spend twenty minutes in the product telling us what breaks, we will pay for your time.
- Complex product illustrations have no long descriptions yet.
- The command palette (Cmd+K) is fully keyboard operable but its trigger needs a more discoverable accessible name.
How to report an issue
Email accessibility@brainback.chat with a short description and, if you can, the URL and the assistive technology you were using. A person replies within 3 business days.
Third parties
Some surfaces are not ours to fix: Stripe’s checkout, the email client that renders a magic link, and our auth vendor’s hosted pages. We pick vendors who publish their own accessibility statements, and we escalate anything you report to them directly rather than closing the ticket.
Formal complaints
If your need has not been met, or you disagree with how we responded, you can escalate to the relevant body in your country — in the United States the Department of Justice ADA information line, in the European Union your national equality body, in Canada the Accessibility Commissioner.