Skip to content
One Moment

Accessibility

Our own audit

We built an accessibility product. Failing accessibility would be indefensible, so here is our audit, generated from the code, including anything it found.

Decisions behind the caller's screen

  • At most three things on screen.

    One idea per line, very large type. Aphasia-friendly formatting and Hick's law both point the same way: fewer choices, faster and surer decisions.

  • No timer, ever.

    A clock on someone who cannot find a word adds pressure and makes the block worse.

  • No transcript of their own speech.

    Seeing your own disfluent speech written out is discouraging, and it is not what the caller needs.

  • Two real choices, never yes or no.

    Buttons 88 pixels tall, at most four words each, plus "Something else".

  • Atkinson Hyperlegible for everything the caller reads.

    Designed by the Braille Institute to make letters hard to confuse.

  • Stop is on screen whenever it speaks for the caller.

    Its own colour token, with contrast checked separately, because it is the one control that must always work.

Sources: Rose et al. 2003, 2011Aphasia Institute, SCAWCAG 2.2

Colour contrast: 28 of 28 pairs pass

Every text and state colour, in both themes, checked against WCAG 2.2. This runs before every build and the build fails on any violation. Last run 2026-09-29.

Contrast pairs
ThemePairRatioNeededPurposeResult
lighttext on bg16.51:17:1body text, AAAPass
lighttext on bg-raised17.21:17:1body text on cards, AAAPass
lighttext-muted on bg7.55:14.5:1secondary text, AAPass
lighttext-muted on bg-raised7.87:14.5:1secondary text on cards, AAPass
lighttext-subtle on bg5.46:14.5:1captions and metadata, AAPass
lightaccent-fg on accent6.3:14.5:1primary button label, AAPass
lightdanger-fg on danger6.54:14.5:1Stop button label, AA even though it is large textPass
lightaccent on bg6.05:14.5:1links, AAPass
lightfocus-ring on bg6.05:13:1focus indicator, non-text 1.4.11Pass
lightfocus-ring on bg-raised6.3:13:1focus indicator on cardsPass
lightborder-strong on bg3.55:13:1borders that carry state, 1.4.11Pass
lightev-grounded on bg-raised4.42:13:1evidence mark, non-textPass
lightev-vetoed on bg-raised3.95:13:1evidence mark, non-textPass
lightev-inferred on bg-raised2.17:11.9:1evidence mark, relieved by label (documented)Pass
darktext on bg17.31:17:1body text, AAAPass
darktext on bg-raised15.8:17:1body text on cards, AAAPass
darktext-muted on bg10.41:14.5:1secondary text, AAPass
darktext-muted on bg-raised9.5:14.5:1secondary text on cards, AAPass
darktext-subtle on bg7.09:14.5:1captions and metadata, AAPass
darkaccent-fg on accent9.27:14.5:1primary button label, AAPass
darkdanger-fg on danger10.08:14.5:1Stop button label, AA even though it is large textPass
darkaccent on bg9.27:14.5:1links, AAPass
darkfocus-ring on bg9.27:13:1focus indicator, non-text 1.4.11Pass
darkfocus-ring on bg-raised8.46:13:1focus indicator on cardsPass
darkborder-strong on bg3.35:13:1borders that carry state, 1.4.11Pass
darkev-grounded on bg-raised4.73:13:1evidence mark, non-textPass
darkev-vetoed on bg-raised5:13:1evidence mark, non-textPass
darkev-inferred on bg-raised5.6:11.9:1evidence mark, relieved by label (documented)Pass

The amber “worked out” evidence colour is below 3:1 in light mode. It is never the only signal: every evidence mark also has an icon and a text label, and the colours were chosen with a colour-blindness validator after our first draft, green and red, failed it.

Automated checks: 0 issues found

axe-core 4.13.0 (WCAG 2.2 AA and best-practice rules), run on 2026-09-27 against every page in both themes. Automated tools catch only some real problems, so this is a floor, not a verdict.

Automated accessibility checks
PageThemeRules passedIssues
/light46Pass
/demolight45Pass
/replaylight42Pass
/replay?call=dissentlight44Pass
/setuplight43Pass
/apilight47Pass
/judgeslight45Pass
/technologylight44Pass
/evidencelight46Pass
/limitslight45Pass
/glossarylight40Pass
/accessibilitylight45Pass
/dark46Pass
/demodark45Pass
/replaydark42Pass
/replay?call=dissentdark44Pass
/setupdark43Pass
/apidark47Pass
/judgesdark45Pass
/technologydark44Pass
/evidencedark46Pass
/limitsdark45Pass
/glossarydark40Pass
/accessibilitydark45Pass

Which browsers this was tested in

Everything above was run in Chromium, on Windows, at desktop and phone widths, in both themes. We have no Apple device, so Safari and iOS are untested, and rather than guess we have made sure the part a visitor most needs does not depend on anything exotic.

Browser support by path
What you are doingWhat the browser has to supportIf it does not
Reading any pageNothing beyond HTML and CSS. Every page is server-rendered.Not applicable.
The three recorded callsOne <audio> element playing an MP3. No microphone, no AudioContext, no worklet.Nothing to fall back to, because there is nothing unusual to fail.
Play the recorded call liveAudioContext, to play what the engine sends back.The call reports the error and the recorded calls remain.
Use my microphonegetUserMedia and AudioWorklet, both supported in Safari since 14.5.The demo hands its slot back at once and points you at the recorded calls, which show the same behaviour.

The practical consequence: a judge on an untested browser, or one who declines the microphone prompt, still sees three real calls with every event they produced. That path was made to need nothing more than an audio tag precisely because it is the one we cannot verify everywhere.

What we have not done

  • No testing with people with aphasia, and no review by a speech-language pathologist. What we did instead is check each design decision against research done by people who worked with them, and say plainly what that does and does not establish: the parameters, against the literature.
  • No testing on Safari or iOS, because we have no Apple device. See above for what depends on what.
  • No full manual screen-reader walkthrough. Live regions announce the caller's state and the replay captions, but that is not the same as a real audit.
  • Voice input only. A caller who cannot speak at all needs a different product.