Accessibility

Embed
Preview of the card
<a href="https://forumulate.com/guides/accessibility"><img src="https://forumulate.com/guides/_api/public/orgs/046a9bc0-d530-43ae-9bae-af7945008cda/spaces/36aa4df0-1e95-4cef-8ae9-795169441345/pages/6bc51bdb-a0ac-416a-a4e1-fb56a94c20c8/social-card.svg?v=3e7ae33eec8b" alt="Accessibility" width="600" height="315"></a>

This is our conformance statement for the pages readers see: documentation and API reference, blog, forum, changelog, roadmap, status, legal documents and the other reader surfaces, on forumulate.com and on a customer's own domain. The console (where an organization edits its spaces) is not covered here.

Target: WCAG 2.2 level AA. Status: partially conformant. Most of the standard is met by the reader itself. The gaps we know of are listed below, and so are the criteria we have not yet measured. Prepared: 2026-10-24, from a review of the reader's source, the fixes of the 2026-10 integrator audit and an automated axe-core run against forumulate.com (below). It is updated when a known gap closes or a new one is found.

What a reader page does

  • Skip link and landmarks. Every reader page starts with a "Skip to content" link, the first thing you can tab to, ahead of the site header. It moves focus to the main region. Pages use header, nav, main and footer landmarks, and each navigation has a name.

  • Language and direction. The document declares the page's language, and dir="rtl" for right-to-left languages, so screen readers pronounce the text correctly and the layout mirrors.

  • Headings. Each page has one h1. Sections follow in order. On a generated API reference page, each operation is an h2 you can link to (#<operationId>). Its parameters, request body, responses and code samples are h3. The "On this page" rail lists the operations.

  • Search. The search box is a combobox (aria-expanded, aria-controls, aria-activedescendant). Its results are a listbox that holds only options. While it is open, focus stays inside the dialog and reaches every control in it. Escape closes it.

  • Keyboard. Every control can be reached and used from the keyboard, and focus is always visible (:focus-visible rings on reader controls).

  • Colour. The reader never relies on colour alone:

    • Status days carry a pattern as well as a hue: hatched for partial and major outages, ruled for degraded, dotted for maintenance.

    • The sibling-page state dot also has its state in words.

  • Contrast of a brand colour. Brand-coloured text is drawn in a readable shade of the brand (--reader-brand-ink), not in the raw brand colour. Saving a theme whose primaryColor reads below 4.5:1 as text returns a contrast.brand_text warning with the ratio. For example, #0e9f6e on white is 3.4:1: it passes as a fill (3:1) and fails as text.

  • Motion. Animations and scroll effects respect prefers-reduced-motion.

  • Media. Course videos carry caption tracks: the ones the author uploaded, or ones transcribed for the organization. The media library lists images that have no alt text yet (missingAlt), so an author can find them.

Known gaps

  • Found by the first automated run, fixed in the next release. On 2026-10-25 axe-core reported three serious problems on forumulate.com:

    • the reader's theme toggle drew its inactive letters in the muted grey, under 4.5:1 on every reader header (1.4.3, every page checked);

    • the docs rail scrolls on its own but could not be reached with the keyboard to scroll it (2.1.1, docs and reference pages);

    • the default HTTP-method chips of the API reference put white text on 500-weight hues, 2.1 to 3.8:1 (1.4.3, reference pages).

    All three are fixed in the source (full-ink toggle letters, a focusable rail, darker default chip colours). They stay on this list until a run against the deployed site comes back clean.

  • Large generated reference pages. A tag page that groups many operations is heavy. A 22-operation page measured 2.8 MB. That is slow to load, and slow to move through with a screen reader. The importer warns when a tag has more than 25 operations, and recommends per-operation mode (one operation per page). Until a reference is regenerated in that mode, its large pages stay large.

  • Status bars set to fill: solid. An owner may turn the patterns off. The status colours are then the only difference between states, which fails 1.4.1 (Use of Color). The default keeps the patterns.

  • What the owner writes and adds. We cannot make these accessible on the owner's behalf:

    • alt text for images, and the description of a drawing;

    • captions for uploaded videos with no caption track;

    • link text;

    • colours set in customCss or elementStyles, which override the readable brand shade;

    • scripts added through customJs;

    • third-party embeds: video players, chat widgets, consent banners. Each vendor is responsible for its own widget.

    The theme warning covers primaryColor only.

  • Code playgrounds. A playground runs the author's code in a sandboxed frame on a separate origin. What it renders is the author's markup. We have not tested its keyboard behaviour across browsers.

Not yet measured

We have not yet checked these WCAG 2.2 criteria across every surface, so we make no claim for them:

  • 2.4.11 Focus Not Obscured (sticky headers, and a consent banner at the bottom of the page);

  • 2.5.8 Target Size (Minimum), for the smallest icon buttons;

  • 3.3.8 Accessible Authentication, for reader sign-in through an organization's own identity provider. That page belongs to the provider.

How this is checked

  • Automated. scripts/a11y-axe.mjs runs axe-core in Chromium against a list of reader URLs, with the WCAG 2.0, 2.1 and 2.2 A and AA rules. With no list, it checks one forumulate.com page per reader type. It prints each rule that fails, with the elements it found. It exits non-zero on any serious or critical violation. --json writes a report; --dark checks the dark scheme as well. It runs on Google Cloud Build:

    scripts/check-on-gcp.sh --sha <commit> \
      'pnpm --filter @forumulate/web exec playwright install --with-deps chromium && npm i --no-save --prefix /tmp/axe axe-core@4.10.3 >/dev/null && AXE_CORE_PATH=/tmp/axe/node_modules/axe-core/axe.min.js node scripts/a11y-axe.mjs'

    To check your own site, pass its URLs, or a file of them with --file.

  • Last automated run: 2026-10-25, the default list of ten forumulate.com pages. Nine had the serious violations listed under Known gaps; the legal register did not finish loading within the 45-second limit and was not checked.

  • Manual. Not yet done for this statement. The checks it will cover:

    • keyboard only, through the header, search, the reader's controls and the footer;

    • the order of headings and landmarks in a screen reader;

    • contrast ratios measured on the rendered colours.

Automated rules find about a third of WCAG problems, so a clean axe run is a floor, not a pass.

Report a problem

If something on a reader page stops you, post in the community forum with "accessibility" in the title. Include the page's address, what you were trying to do, and your browser and assistive technology. If the page is on a customer's own site, the problem may be in content they wrote. Tell them as well. They can raise it with us in the same place.

The Forumulate teamUpdated