Skip to content

Accessibility Statement

Last reviewed: April 2026

it applies only to the current website (e.g., vanityURLs.link) and not to self-hosted vanityURLs deployments.

We’re committed to making this site usable by as many people as possible, regardless of ability or assistive technology. This statement explains what we’ve implemented, what we know is imperfect, and how to test or report accessibility issues.

We target WCAG 2.1 Level AA and the site is partially conformant. The majority of criteria are met, and we are working on the remaining gaps described below.

WCAG 2.1 is organized around four principles:

PrincipleStatus
OperableAll UI is keyboard-navigableMostly met, see known issues
PerceivableInformation is presentable to all usersMostly met, see known issues
RobustCompatible with assistive technologiesCompliant
UnderstandableContent is readable and predictableCompliant

What we have implemented

Keyboard navigation

  • Every interactive elements (e.g., navigation links, buttons, sidebar, search modal) are reachable and operable using a keyboard alone
  • A visible skip-to-content link appears on focus, letting keyboard users bypass the header navigation
  • Arrow keys navigate the documentation sidebar. Enter and Space activate expandable sections
  • The Source Code dropdown menu is operable by keyboard: Enter or Space opens it, ArrowDown/ArrowUp move between items, Escape closes it and returns focus to the trigger
  • The search modal traps focus correctly when open and releases it on Escape
  • All focus states are visible with a consistent 2px brand-coloured ring using :focus-visible (not shown on mouse clicks, only on keyboard navigation)

Semantic structure

  • Correct HTML landmark elements: <header>, <main>, <nav>, <footer>, <aside>, <article>
  • Heading hierarchy is maintained (h1h2h3) on all pages without skipping levels
  • The page lang attribute is set correctly for both English (en-US) and French (fr-FR)
  • All pages have a unique, descriptive <title>

Images and icons

  • Decorative SVG icons carry aria-hidden="true" and are invisible to screen readers
  • The logo image uses alt="" (correctly empty for decorative images) alongside the visible “vanityURLs” text label
  • Content images, where they appear, include descriptive alt text

Colour and contrast

  • Body text (gray-800 on white) exceeds WCAG AA at 12.6:1
  • Documentation text links use brand-700 (#0f766e) which achieves 5.47:1 on white — meeting AA
  • Dark mode uses brand-400 (#2dd4bf) for links on gray-900, achieving 9.53:1 — exceeding AAA
  • UI components (badges, icons) use either brand-700 or contextual colours verified to meet the 3:1 AA threshold for non-text elements

Assistive technology support

  • Tested with VoiceOver (macOS Safari) and NVDA (Windows Firefox)
  • ARIA roles, properties, and states are used where HTML semantics alone are insufficient: role="dialog", aria-modal, aria-expanded, aria-haspopup, aria-controls, aria-label
  • Form controls (search input) are labelled via aria-label

Reduced motion

The site uses minimal animation. CSS transitions are short (150ms) and used only on opacity/visibility. No auto-playing video, parallax, or flashing content is present.

Known limitations (not yet resolved)

IssueImpactPriority
brand-500 (#14b8a6, 2.49:1) used in the hero badge background gradientLow — decorative only, no text in that colour at body sizeMedium
Search results from Pagefind may not announce result counts to screen readersSome screen reader users may not know how many results were returnedMedium
Mobile navigation menu uses JavaScript toggle — requires JS to be enabledUsers with JS disabled cannot open the mobile menuLow (modern browsers enable JS by default)
Tables in documentation pages do not have <caption> elementsScreen readers announce the table without a summaryLow

How to test this website

Automated tools (start here)

These tools catch 30–40% of WCAG failures automatically and are the fastest starting point:

ToolHow to accessWhat it checks
axe DevToolsChrome extension — open DevTools → axe tabComprehensive WCAG 2.1 A and AA
WAVEwave.webaim.org — enter the URL, or browser extensionStructure, contrast, ARIA
LighthouseChrome DevTools → Lighthouse tab → check AccessibilityQuick score + issues list
IBM Equal Access CheckerChrome extensionWCAG 2.1 + IBM guidelines

Keyboard testing (catches interaction issues)

Close your mouse and navigate the page using only:

KeyAction
TabMove forward through focusable elements
Shift+TabMove backward
Enter / SpaceActivate buttons and links
EscapeClose modals and dropdowns
Arrow keysNavigate menus and sidebar

Everything interactive should be reachable, have a visible focus indicator, and be activatable without a mouse.

Colour contrast testing

ToolURL
WebAIM Contrast Checkerwebaim.org/resources/contrastchecker
Colour Contrast Analyser (desktop app)paciellogroup.com
Chrome DevToolsDevTools → Elements → Accessibility panel → Computed

Target: 4.5:1 for normal text, 3:1 for large text (18pt / 14pt bold) and UI components.

Screen reader testing

Screen readerOSBrowser
VoiceOvermacOS (built-in: Cmd+F5)Safari
NVDAWindows (free download)Firefox
TalkBackAndroid (built-in)Chrome
NarratorWindows (built-in)Edge

Key things to check: page title is announced, headings are navigable by H key, links have descriptive text (not “click here”), and the search modal announces itself correctly when opened.

Browser-level checks

  • Zoom to 200% in your browser — content should reflow without horizontal scrolling (we use responsive Tailwind layouts).
  • Forced colours / Windows High Contrast Mode — the site should remain readable (focus rings and UI states should be visible).
  • Disable CSS — page structure and reading order should remain logical.

Open source — audit the implementation

Because this site is fully open source, you can inspect every accessibility decision directly:

Reporting accessibility issues

If you encounter an accessibility barrier on this site, please tell us:

Please include: the page URL, a description of the barrier, the assistive technology and browser you were using, and steps to reproduce.