Accessibility Statement
⚠ DRAFT — pending real-browser audit + manual screen-reader walkthrough. The structural fixes and the automated regression gates described below have shipped, but a full manual a11y review (keyboard-only nav across all flows + VoiceOver/NVDA spot-check) has not yet been completed. Claims marked (unverified) are intentions backed by the automated tests, not human-verified facts.
Last updated: 2026-04-23. Version: 0.1 — draft.
Our commitment
Tracker is a compliance product. A non-accessible compliance product is the same shape of failure as a security product with a 0-day, so we treat WCAG 2.1 Level AA as a baseline rather than an aspiration.
We aim to align with the European Accessibility Act, the UK Equality Act 2010 digital-accessibility expectations, and the WCAG 2.1 Level AA technical criteria.
What we've done
The current state, as of the date above:
- Foundation — every interactive widget (buttons, dropdowns, dialogs, comboboxes) is built on Radix UI primitives, which carry keyboard navigation, focus management, and ARIA roles correctly out of the box.
- Skip-to-main-content link on every page (WCAG 2.4.1).
- Page landmarks — every page has
<header>,<nav>,<main>in the right place; the skip link targets the main region. - Form labels explicitly associated via
<label htmlFor>↔<input id>on every authentication and settings form. Errors carryrole="alert", are paired with non-colour cues (icon + literal "Error:" prefix), and are linked to the relevant input viaaria-describedbyso screen readers announce them in context (WCAG 1.4.1, 3.3.1, 4.1.3). - Data tables — all tables (API tokens, members, audit log)
carry an
sr-only<caption>describing the table content andscope="col"/scope="row"on header cells (WCAG 1.3.1). - Heading hierarchy — each page has a single
<h1>that reflects the page state; conditional renders consolidate to a state-dependent heading rather than multiple h1s (WCAG 2.4.6). - Focus indicators — visible
focus-visible:ringstyling on every interactive element via the shared button / input primitives. Nooutline-nonetraps without a replacement indicator (WCAG 2.4.7). - Automated regression gates:
- Component-level:
vitest-axeruns on every push and pins the structural patterns we use (auth-error block, data table, skip-link target, form labels). Seetest/component/a11y-patterns.test.tsx. - Browser-level:
@axe-core/playwrightruns against a real Chromium engine for the public pages (login, signup, forgot-password, the legal docs). Seetest/e2e/a11y.spec.ts. Run locally withnpm run test:e2e.
- Component-level:
Known limitations
What is not yet covered, in honest detail:
- (unverified) Manual keyboard-only walkthrough across the full authenticated experience (dashboards, requirements / gaps / tasks flows, framework adoption, settings).
- (unverified) Screen-reader spot-check with VoiceOver (macOS) or NVDA (Windows) on the same flows.
- (unverified) Colour-contrast audit in dark mode beyond what the default theme contributes — custom branding combinations not yet reviewed.
- The browser-level automated suite covers public pages only. Authenticated pages need a seeded user + sign-in flow before they can be added; queued.
- Mobile / touch gestures not specifically tested. The application
is designed for desktop-class interaction; the responsive layout
works at narrow viewports but isn't optimised for screen-reader
- touch combined navigation.
- Live-region / dynamic-content announcements outside the auth pages have not been audited individually.
Compatibility
We test against the latest stable Chromium (the engine shared by Chrome, Edge, Brave, Arc, etc.). Firefox and Safari are expected to behave similarly because the underlying primitives are engine-agnostic, but we don't run an automated sweep against them.
The application requires JavaScript. It will not function with JS disabled.
How to report an accessibility issue
If you encounter an accessibility barrier when using Tracker, we want to hear about it. Email [ACCESSIBILITY_CONTACT_EMAIL] with:
- The page or feature where the issue occurred (URL is helpful).
- A description of the barrier and the assistive technology in use (e.g. "VoiceOver on Safari can't reach the Save button on the requirement-edit form").
- Your contact details if you'd like a response.
We'll acknowledge within 5 working days and aim to ship a fix or an honest plan within 30 days, depending on scope.
Conformance status
This product partially conforms to WCAG 2.1 Level AA. Partially because of the unverified items in the Known limitations section above — we have a good automated baseline and the structural fixes to back the claim, but the manual sweep that would let us assert conforms hasn't been done yet.
This statement will move from partially conforms to conforms
once the manual checklist in docs/a11y/baseline.md has been
completed and signed off, and the (unverified) tags in the
"What we've done" section are removed.
Standards and references
- WCAG 2.1 Level AA — https://www.w3.org/TR/WCAG21/
- European Accessibility Act (Directive (EU) 2019/882) — applicable scope being assessed for this product class.
- UK Equality Act 2010 — Part 3, services and public functions; Part 4, premises; applied to digital services per UK case law.