Self-assessed, and unaudited
Accessibility statement
This product targets WCAG 2.1 Level AA. It has not been audited, no third party has assessed it, and no visual review has happened on any screen in this build — the verification browser pane never composited, so nothing in it has been looked at. What follows separates what was measured from what was not, and the measurements are taken in your browser as this page loads.
The standard this targets
- Standard
- WCAG 2.1, Level AA, with the WCAG 2.2 target-size criterion (2.5.8) adopted as an additional target.
- Conformance claim
- None is made. This product targets that standard; it has not been assessed against it end to end, and the known gaps below are the ones that are known — not the ones that exist.
- Evidence
- Self-assessment, programmatic. The contrast and structural checks on this page are the whole of the automated evidence; everything else on this page is a statement about what was and was not done.
- Scope
- The standard pages and the terminal application served from this machine. There is no other deployment.
- Feedback
- There is no support address, because there is no service behind this — you are running the software and you have the source.
Measured contrast, in your browser, just now
not measured0 of 13 token pairs resolved to an opaque colour and were measured. 0 sit below the floor for their role, and 13 could not be measured at all. Every figure is computed from getComputedStyle on this page, in this theme, at load.
--i-ink-1 on --i-voidnot measurednot measurablefloor 4.5:1
Headings and hero figures on the page background
--i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
--i-ink-2 on --i-voidnot measurednot measurablefloor 4.5:1
Body text on the page background
--i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
--i-ink-3 on --i-voidnot measurednot measurablefloor 4.5:1
Labels and units on the page background
--i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
--i-ink-4 on --i-voidnot measurednot measurablefloor 3:1
Rules and disabled text — non-essential, 3:1 floor
--i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
--i-ink-2 on --i-surface-1not measurednot measurablefloor 4.5:1
Body text on a panel
--i-surface-1 did not resolve — background-color fell back to transparent, so there is nothing to measure against.
--i-ink-3 on --i-surface-1not measurednot measurablefloor 4.5:1
Labels on a panel
--i-surface-1 did not resolve — background-color fell back to transparent, so there is nothing to measure against.
--i-ink-3 on --i-surface-2not measurednot measurablefloor 4.5:1
Labels on a nested surface
--i-surface-2 did not resolve — background-color fell back to transparent, so there is nothing to measure against.
--i-orchid on --i-voidnot measurednot measurablefloor 4.5:1
The accent as text on the page background
--i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
--i-orchid-bright on --i-voidnot measurednot measurablefloor 3:1
The focus ring against the page background
--i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
--i-ink-on-accent on --i-orchidnot measurednot measurablefloor 4.5:1
Text on a filled accent button
--i-orchid did not resolve — background-color fell back to transparent, so there is nothing to measure against.
--i-bull on --i-surface-2not measurednot measurablefloor 4.5:1
A gain, on a table row
--i-surface-2 did not resolve — background-color fell back to transparent, so there is nothing to measure against.
--i-bear on --i-surface-2not measurednot measurablefloor 4.5:1
A loss, on a table row
--i-surface-2 did not resolve — background-color fell back to transparent, so there is nothing to measure against.
--i-amber on --i-voidnot measurednot measurablefloor 4.5:1
The live / streaming marker
--i-void did not resolve — background-color fell back to transparent, so there is nothing to measure against.
--i-token-that-does-not-exist on --i-voidnot measurednot measurablefloor 4.5:1
CONTROL — a token this build does not define. If this row reports a ratio, the instrument is broken and no other row on this table should be believed.
--i-token-that-does-not-exist did not resolve — the probe inherited the control colour, so this build does not define that token.
The control row is deliberate. It names a token that does not exist, so it must come back unmeasurable; if it ever reports a number, this whole table is withdrawn rather than shown. An instrument with no way to fail is not evidence.
Token reference
Every value below is READ OUT OF THIS PAGE, not copied from a stylesheet. Four sheets redeclare parts of this scale and the last one wins, so a reference built from the source would be a second way to be wrong — that mistake once put a pink price line on the screen the app opens on. Switch theme or accent in Settings and reload: these figures follow.
Ink
Four tiers, brightest first. Anything that must be READ uses 1 to 3; tier 4 is for rules and disabled text and is held to 3:1, not 4.5:1.
Ground
The page, then the surfaces that sit on it. A panel is lighter than the page; nothing is lighter than a raised panel.
Direction
Bull and bear are perceptually matched in lightness on purpose, so the pair survives being read by someone who cannot tell the hues apart — colour is never the only signal.
Type scale
One multiplier, --i-t-scale, drives all of it — that is what makes the text-size setting move labels as well as body copy.
Accents, measured
Four named accents. Each one is applied to this page, the colour it actually resolves to is read back, and the ratio against each ground it is drawn on is computed with the same function every other figure on this page uses. An accent is decoration rather than text, so 3:1 is the floor that applies — the number is shown either way, because a reader choosing one deserves to know which is faintest.
What has NOT been verified
6 entriesThis is the longer half of the page, and it is meant to be. A statement that lists only what passes is not a statement.
No visual review has happened, on any screen
The verification browser pane used throughout this build has never composited: window.innerWidth reports 0, screenshots time out, and requestAnimationFrame and ResizeObserver callbacks never fire. Nothing in this product has been looked at. Reading order as rendered, focus order as rendered, reflow at 320 px, text spacing, content on hover — all of 1.3.2, 1.4.10, 1.4.12 and 1.4.13 — are unverified, and the programmatic checks on this page cannot stand in for any of them.
No assistive technology has been used to drive this product
There is no record of it having been operated with a screen reader, a switch device, voice control or screen magnification. The measurements here are computed ratios, rendered rectangles and attribute counts. That catches one category of problem and misses another category entirely — a page can pass every check on this page and still be unusable through a screen reader.
There is no third-party audit, no VPAT, and no certification
Nobody outside this build has assessed it. This page is self-assessment, and self-assessment is the weakest form of accessibility evidence there is.
The contrast table covers the pairs it knows about, not every pair on screen
It measures named token pairs. A colour set directly by an older stylesheet layer, or a composite over a semi-transparent surface, is outside what it can see. The semi-transparent cases are reported as unmeasurable above rather than assumed to pass.
The terminal screens are not covered by the checks on this page
The structural checks run against THIS document. The terminal renders into a different document with its own stylesheets and its own components, and none of the results above transfer to it.
There is no designed mobile layout and no print stylesheet
The interface targets a wide screen. On a phone it is a compressed desktop layout, which is a usability failure before it is an accessibility one, and printing renders the interface chrome along with the content.
Settings that change what you get
- Theme
- Follows your operating system by default, with a manual override that persists. The contrast table above re-measures in whichever theme you choose.
- Density
- Comfortable, compact or terminal row heights. Comfortable gives the largest targets and the most spacing.
- Motion
- Follow the system, or force reduced regardless of what the system reports.
- Accent
- Three hues. Only three are offered because those are the ones whose contrast is measurable from tokens — and you can check the current one in the table above.
Fixing something yourself
There is no issue tracker to file this against
Which is the one genuinely good thing about self-hosted software: an accessibility problem here is a file on your disk. Colour and the density scale live in static/instrument.css, the shared data table in frontend/kit/table.js, and page structure in frontend/page_kit.js. There is no build step between an edit and the running product — change the file, reload, and this page re-measures.
Structural checks, on this page
6 checksThese run against this document only. They are not a statement about the terminal screens, and a check that cannot run says so instead of returning a value.
The first focusable element is a skip link, and its target existsbelow the floor
The first focusable element is "Terms", which does not resolve to an in-page target.
How: document.querySelector over the focusable selectors, in this document, now.
Live regions are present on this pagenot measured
0 elements on this page carry aria-live, role=status or role=alert. This says nothing about the terminal screens, which are a different document.
How: querySelectorAll, in this document, now.
Exactly one h1, and no heading level is skippedpass
1 h1 and 18 headings in total.
How: Reading the heading elements of this document in source order.
Interactive targets are at least 24x24 CSS px (WCAG 2.2, 2.5.8)pass
4 links and buttons measured in the main region of this page; 0 fall below 24 px on one axis.
How: getBoundingClientRect on every link and button in the main region, now.
Reduced motion is honourednot measured
Your system currently asks for full motion, and this document is set to data-motion="system". Whether every animation in every stylesheet respects that is not something this page can measure — it can only report the two inputs.
How: matchMedia and the data-motion attribute this page applies.
The theme follows the operating systempass
Your system asks for the dark theme, and the contrast figures above were measured in the theme you are actually looking at rather than in the shipped default.
How: matchMedia, read at the same moment as the contrast probe.