This is a personal website, not an airport procurement portal, but that is not an excuse for making it hostile to use. The working target is WCAG 2.2 Level AA. This page records what the site currently does, where it may still fall short, and what future changes are expected not to break.

All navigation, filters, disclosure controls, copy buttons, and links are intended to work with a keyboard. A skip link moves directly to the main content, focus indicators are deliberately visible, and the mobile menu closes with Escape as well as its toggle button. Moving focus out of the menu closes it; changing to a compact layout keeps focus on a visible control. Navigation remains available if JavaScript is unavailable or fails to load.

Nothing should require precise pointer movement or a hover state. Heading permalink controls remain visible on touch devices and through keyboard focus. Code-copy and search controls announce their results, including failures. Full-size images open in a keyboard-operable dialog; Escape closes it and returns focus to the image link.

Text sizes respect the browser’s default font size. Layout checks include narrow screens, 200% text enlargement, and increased line, letter, word, and paragraph spacing. Long code samples and wide tables scroll within their own regions, which can receive keyboard focus.

Pages use named navigation, a main landmark, and a heading hierarchy. Tag and series indexes are lists, and data tables identify their column headings. Decorative identity artwork is kept out of the reading order.

The site respects the prefers-reduced-motion setting. Smooth scrolling, animations, and transitions are reduced to effectively no motion when that preference is active. Content does not autoplay, flash, or move merely because a product manager once saw an engagement chart.

The site provides light and dark palettes. Light is the default, independent of browser or operating-system colour preferences. The theme selector is in the site header on wider screens and inside the main menu on compact screens. Choosing Light or Dark stores that choice on this device for later visits.

Both palettes are designed for readable contrast rather than being mechanical inversions of each other. Reading surfaces remain restrained, large inverse panels avoid sudden glare in dark mode, and important state is communicated with text, borders, symbols, or labels rather than colour alone. Keyboard focus uses a high-contrast outline suited to its background, including the dark code and image inspection surfaces and the contact form.

Syntax highlighting uses colour to make code easier to scan, but the code remains understandable without it. The print stylesheet uses dark text on white independently of the selected screen theme, retaining code indentation and line breaks without relying on syntax colours.

The site has not yet had an independent accessibility audit or exhaustive testing across every screen reader, browser, zoom level, and operating-system combination. I do not claim formal WCAG conformance yet.

Long code samples and wide tables may require horizontal scrolling on narrow screens. Alternative text and heading structure are reviewed during publishing, but that process is still manual and therefore vulnerable to the traditional automation gap known as “a human forgot.”

If a design flourish, third-party browser behaviour, or future change creates a barrier, that is a bug—not an aesthetic difference visitors are expected to negotiate around.

The contact form is embedded from Raindrops and requires JavaScript for its Mosparo spam check. Its controls inherit the site’s typography and colours, with square controls, visible focus, and primary targets of at least 44 × 44 CSS pixels. Mosparo adds an offscreen decoy field whose instruction currently comes from a tooltip; this remains a third-party accessibility limitation. The contact page also links to the standalone form, Matrix, and Mastodon if the embed is difficult to use.

Please use the contact page, or reach me through Matrix or Mastodon. If possible, include the page URL, what you were trying to do, your browser or assistive technology, and what happened instead. You do not need to diagnose the implementation before reporting it; providing a reproduction is already unpaid QA labour.

Last updated: 9 October 2026.

IMAGE INSPECTION