Accessibility

This site is built by an accessibility engineer. That's not a disclaimer — it's a promise.

Conformance status

neilosman.com targets WCAG 2.2 Level AA conformance throughout. Several criteria intentionally reach Level AAA — colour contrast ratios, focus appearance, and animation from interactions — because the bar is low enough to clear without meaningful trade-offs.

This is a personal blog with no login flows, no payment forms, and no complex interactions. That narrow scope makes full conformance realistic rather than aspirational.

What's in place

  • Skip-navigation link on every page, visible on keyboard focus.
  • Semantic landmark regions (header, main, nav, footer) with descriptive ARIA labels where needed.
  • Logical heading hierarchy on every page; headings describe structure, not style.
  • All interactive elements are keyboard-operable. Focus rings are 3 px solid, offset 3 px, and maintain at least 3:1 contrast against adjacent colours in both themes (SC 2.4.11 AAA).
  • Touch targets meet the WCAG 2.5.8 minimum of 24×24 px; primary controls are 44×44 px.
  • Foreground/background colour contrast meets AAA (≥ 7:1 for body text, ≥ 4.5:1 for supporting text) across both light and dark themes.
  • The type scale is fluid and rem-based. Text resizes without loss of content or functionality, and the layout reflows without horizontal scroll at a 320 px logical viewport width (SC 1.4.4, SC 1.4.10).
  • Dark mode honours both prefers-color-scheme and an explicit toggle that persists your choice across visits.
  • All motion respects prefers-reduced-motion: reduce — transitions are cut to near-zero, not just slowed (SC 2.3.3 AAA).
  • Audio posts satisfy SC 1.2.1 through the post text itself, which is the full text alternative. No separate transcript needed because the written content and the audio track are the same thing.
  • Nothing autoplays (SC 1.4.2).
  • Images that are decorative carry an empty alt attribute so screen readers skip them. Content images carry meaningful alternative text.

Technical approach

The site is vanilla HTML, CSS, and JavaScript — no framework, no client-side routing, no bundler. Reading content never requires JavaScript to execute. Web Components are used for progressive enhancements (audio player, theme toggle, comment section), but they layer on top of content that is fully available in plain HTML.

Pages are static files served directly. There are no third-party tracking scripts, no advertising iframes, and no consent popups.

Known limitations

The comment section loads content from a hosted third-party service. I don't control its accessibility and cannot make guarantees about it. If the comment interface is blocking you, reach out directly instead — contact details are below.

External links (GitHub, LinkedIn) open in a new tab and are labelled accordingly. I acknowledge that some users find unexpected tab behaviour disruptive; the labels are the mitigation I can apply without controlling those destinations.

Feedback

Found something broken? I'd genuinely like to know. Accessibility bugs embarrass me more than any other kind.

Reach out via LinkedIn or open an issue on GitHub. Please describe what you were trying to do, what happened, and what browser and assistive technology you were using if applicable.

Assessment approach

This site is self-assessed. I evaluate new pages against WCAG 2.2 during development, test keyboard navigation manually, and verify colour contrast values at design time. Automated tooling catches a subset of issues; manual review covers the rest.


Last reviewed: April 2026