Accessibility

Accessibility at Courier

Courier's web client is built on the Renkara design system. On 10/29/2026 we ran axe-core over fourteen states of the running app (the inbox, an open conversation, starred, sent, drafts, scheduled, rules, the rule editor, settings, search results, a smart folder, a reply window, contacts, and the composer) at phone and desktop widths in light and dark, 56 scans in all. It found real problems earlier in the day; we fixed the small ones in Courier, and what is left is listed below as known gaps. We do not claim a WCAG conformance level for the product.

Illustration: a quiet public reading room in soft light, with a wide level entrance, a low service counter, and clear open aisles between the shelves.
The product

What Courier supports today

Each line says what the product does, how we know, and where to look. “Not yet tested” means exactly that: we have not checked, and we do not claim it.

  • Partly supported

    Keyboard operation

    A skip link and a visible focus ring are in place, every message row is a focusable control that opens on Enter or Space, and go-to chords (G then I, S, D, T, A, P, or R) and a shortcut sheet work. Courier defines more single-key shortcuts than the web client connects, so those do nothing. The scan reports no nested controls in the message rows.

    Evidence

    • frontend/src/components/layout/Layout.tsx: a Skip to main content link to the main landmark
    • frontend/src/global.css: a two-pixel focus-visible outline in the accent color on every control
    • frontend/src/components/mailbox/MessageRow.tsx: each row is role button with tabIndex 0 and an Enter and Space handler
    • frontend/src/hooks/useKeyboardShortcuts.ts: the go-to chords and the shortcut sheet
    • app-axe-scan.json: no nested-interactive finding in any of the 56 scans
    • A keyboard-only walkthrough of every flow has not been recorded.
  • Partly supported

    Screen reader landmarks and labels

    The page has landmarks (header, sidebar navigation, main), the Live indicator announces its state, the star buttons and message headers have accessible names, and axe-core's name and role checks pass apart from one button on the contacts page and one unfocusable scrolling pane in the reply window. Courier has not been tested with a screen reader.

    Evidence

    • frontend/src/components/layout/Header.tsx: the connection indicator is a status region with aria-live polite
    • frontend/src/components/layout/Sidebar.tsx: the sidebar is an aside holding a nav
    • frontend/src/components/reading/MessageBubble.tsx: the message header reports aria-expanded and is named by its visible text
    • frontend/src/__tests__/axe-findings.test.tsx: tests for each name and target finding the scan led to
    • app-axe-scan.json: 14 page states at two widths in two themes; the serious findings open on these checks are label-content-name-mismatch on the contacts page and scrollable-region-focusable on the reply window's editor
  • Partly supported

    Contrast in light and dark

    After fixes, text and controls pass axe-core's contrast rule in light and dark on every scanned state except one, the name of the open smart folder in the sidebar. The scan found white text on the dark theme's light-teal accent, gray text on a hard-coded fallback color, and red text on the dark surface, and each was fixed in Courier. Only the scanned states were checked, and no one has reviewed contrast by hand.

    Evidence

    • app-axe-scan.json: color-contrast reports one serious failure, the current smart folder's name in the sidebar, in the two 1440 pixel smart-folder scans; the other 54 scans have none
    • frontend/src/__tests__/axe-findings.test.tsx: fails if white text returns on the accent fill, or an undefined color variable with a gray or red fallback returns to the rules screens
  • Partly supported

    Reduced motion

    The header checks the reduced-motion setting before animating, and the design system's global styles switch motion off when it is set. The rest of the app's transitions have not been audited and no test covers it.

    Evidence

    • frontend/src/components/layout/Header.tsx: uses the reduced-motion hook before animating
    • frontend/src/global.css: the reduced-motion rule is owned by the design system's tokens, as its own comment says
  • Not yet tested

    Text resize and zoom

    Resizing text to 200 percent has not been tested, and several components set text in fixed pixel sizes.

  • Partly supported

    Mobile and touch

    Below 768 pixels wide the sidebar folds into a menu drawer, the list fills the screen, and opening a conversation replaces it with the reading pane. No scanned state scrolls sideways at 375 pixels. Tap-target size was not measured.

    Evidence

    • app-axe-scan.json: no horizontal overflow in any of the 28 scans at 375 pixels
    • frontend/src/hooks/useMediaQuery.ts and the Sidebar drawer: the phone layout
    • screenshots/output/courier/inbox-phone_light.png and thread-phone_light.png: the phone views, captured at 375 by 812

No WCAG conformance level is claimed for Courier. Its README names WCAG 2.1 Level AA as a goal and says VoiceOver, NVDA, and JAWS were used; we found no record of any of that, so this site does not repeat it. The evidence is an automated axe-core scan run on 10/29/2026 (scripts/app-axe-scan.mjs, results in AVIAN/records/fleet-showcase/courier/app-axe-scan.json), unit tests for the fixes it led to, and reading the code. The app's own accessibility test only checks that landmarks and headings render; it never calls axe. No one has audited Courier against WCAG or tested it with a screen reader.

Known gaps

What does not work yet

  • The reply window's editor is a scrolling pane that a keyboard cannot focus (axe scrollable-region-focusable, serious, four scans).
  • The contacts page has a button whose accessible name does not contain its visible label (axe label-content-name-mismatch, serious), and a heading level that skips (heading-order, moderate).
  • The name of the open smart folder in the sidebar is below the contrast minimum in both themes at desktop width (axe color-contrast, serious).
  • Only the go-to keys act; the single-key shortcuts the shortcut sheet lists do nothing.
  • Courier has not been tested with a screen reader, and reduced motion and 200 percent text resize are not covered by tests.
  • The AI screens and the native apps have not been checked for accessibility.
This website

How this site is built and checked

This site targets WCAG 2.2 level AA. That is a target we build and test toward, not a certification, and no one has audited it for conformance.

  • Structure

    A skip link, labeled landmarks (header, navigation, main, footer), one h1 per page, and headings that do not skip levels.

  • Keyboard and focus

    Links and buttons are native elements, so they work from the keyboard. Focus is drawn as a visible ring, and the menu closes with Escape.

  • Contrast

    Text meets 4.5 to 1 in both the light and dark themes, checked against the stylesheet by the test suite.

  • Motion

    Transitions and animation switch off when your system asks for reduced motion.

  • Small screens and zoom

    Layouts hold at 375 pixels wide with no sideways scrolling, text resizes with the browser, and touch targets are at least 44 pixels.

  • Automated scan

    Every page is scanned with axe-core at 375 and 1440 pixels in light and dark, and the checks fail on any serious or critical violation. Automated tools find only part of the problems, so this is a floor, not proof.

  • Images

    Every product screenshot has a text description and comes in a light and a dark version that follows your theme.

  • Your theme choice

    The theme follows your system setting until you pick one with the button in the header.

Feedback

Tell us what is in your way

If something here or in Courier does not work for you, write to Renkara Media Group. Say what you were doing, what you used, and what happened, and a person will answer.

Statement last reviewed 10/29/2026.