Legal and security

Accessibility

Specific claims, each backed by a test that runs on every build, and an honest list of what has not been done.

Measured, not reviewed

Checked by a machine on every build, not by somebody once a year

This page covers both the Consonas application and the site you are reading, and it separates the two wherever the honest answer differs. Most accessibility statements are a paragraph of intent. We are committed to accessibility. We aim to meet the guidelines. We welcome feedback. Those cost nothing to write, promise everything, and give a reader no way to check any of it.

The alternative that organisations reach for is an annual audit, which is genuinely useful and has one structural weakness: it is accurate on the day it happens and out of date within a month, because the site keeps changing and the audit does not.

What we do instead is put the checks in the build. Contrast is computed for every text colour against every surface it can appear on. Touch targets are measured. Heading structure, alt text and accessible names are read out of the built pages. If any of them regresses, the build fails and it does not deploy.

This is not sufficient, and we will say so

Automated checks catch a specific and limited set of problems. They cannot tell you whether a page makes sense when read aloud, whether an interaction is comprehensible without sight, or whether a form is genuinely usable by somebody navigating with a keyboard under time pressure.

Those require testing with assistive technology and with disabled users, and we have not done it. That is the largest gap on this page and it is stated here rather than omitted.

Why measuring rather than looking

Because looking does not work, and we have the evidence. The muted text colour on this site measured 4.06 to 1 against one of its backgrounds, which is below the minimum. It had been reviewed by eye repeatedly and looked completely reasonable. Nothing in a screenshot says this is 4.06 to 1.

The same applies to touch targets. Every control in the product was under 44 pixels on a phone, 269 of them, and none of it was visible in a screenshot. Both were found by tests that compute, and both would still be there if we had relied on review.

Enforced

What a test checks on every build

Each of these fails the build if it regresses, and each was written against a real defect rather than in the abstract.

Contrast
Every text colour is checked against every surface it can appear on, in both light and dark, by a test that computes the ratio rather than by somebody looking. It fails the build below 4.5 to 1.
Touch targets
Everything a finger has to hit is at least 44 pixels tall on a touch screen, with links inside a sentence exempt as the standard permits. Also enforced by a test.
Keyboard
Every interactive element is reachable and operable by keyboard, including the menu on this site, which opens on focus as well as on hover and traps nothing.
Focus visibility
A visible focus ring on everything focusable. Removing it is the single most common accessibility failure on the web and it is never done here.
Reduced motion
Everything that animates stops under prefers reduced motion, enforced once globally rather than remembered in twenty places.
Semantic structure
One heading level one per page, headings in order, real landmarks, real lists, and a skip link. Checked by a test that reads the built pages.
Text alternatives
Every image has alt text and every illustration is either described or explicitly hidden from assistive technology. Also checked by a test.
No motion or colour alone
Nothing is communicated by colour by itself. The current navigation item carries a rule as well as a colour change.

The muted grey on this site measured 4.06 to 1 against one of its own backgrounds. It had been looked at many times and looked entirely reasonable. Nothing in a screenshot tells you a colour is below the minimum.

Which is why the checks compute rather than review, and why this page lists them individually.

The decision underneath

Why the checks read the built page and never the files somebody edited

It sounds like an implementation detail. It is the reason several of the defects further down this page were found at all, and it is also the reason for most of what the checks cannot see.

The document is assembled, so the document is what gets read

A page here is put together out of components. A section supplies its own frame. A component supplies its own headings. A layout supplies the parts every page shares. No single source file contains the finished document, which means no check that reads a single source file can see the finished document either.

Heading order is a property of the assembled page, not of any file. So is a page frame nested inside another page frame, which is what happened on eleven pages here: the section already supplied the frame, the markup inside it supplied a second one, and every file involved was perfectly correct on its own. The contents started twenty four pixels further in than everything else and finished forty eight pixels narrower. Nothing you could open would have told you.

What was rejected, and what it would have cost

A linter reading the source was the obvious option and the wrong one. To know what a page will contain it would have to model what every component does, which means keeping a second description of the site alongside the first and hoping the two never disagree. The day they disagree is the day the check becomes worse than nothing, because it still passes.

A browser driven audit runner inside the build was the serious option. It genuinely catches things a static read cannot, and it was rejected for two reasons. It needs a browser in the build, which is slower and less reliable than reading a file, and slow unreliable checks get switched off. More importantly it produces a score. A score is a thing organisations improve rather than a thing they fix, and the distance between a good score and a page somebody can actually use is exactly where the interesting failures live. A list of named checks that either ran or did not is harder to game because there is nothing to average.

On every build, rather than on a schedule

A nightly run tells you a regression shipped. A run inside the build tells you it did not. That difference matters most for the failures no one would ever report. A contrast failure does not generate a support message. The reader simply does not read the sentence, and quite reasonably assumes it was not important. So the check has to sit before deployment, or it is a record of harm instead of a prevention of it.

What this design cannot see

Reading markup is not the same as seeing a page. Nothing in the built HTML tells you what colour a word ended up, how tall a control is once the browser has laid it out, or whether a line of text overflows its container at a particular width. Those questions are answered somewhere else entirely: the contrast ratios are computed from the design token values, the target sizes are measured in the component library that owns the controls, and the focus rings, the keyboard order and the skip link inside the application are held by the application's own suite, which resolves the stylesheet cascade rather than reading the markup, because a focus outline can be removed by a rule written three files away. Four separate suites hold the claims on this page and none of them holds more than its quarter. If you take one sentence from this section, take that one, because it explains why the list of what is checked is oddly shaped.

There is a second limit and it is harder to admit. A check computes against the surfaces someone listed. A colour placed on a surface that is not in that list is not safe because it passed. It is unmeasured, because no one asked the question. No test finds that for you. It is found the way the first one was found, by someone wondering whether the list was complete.

The exemptions, which are the part worth arguing with

Every check has carve outs written into it, and the carve outs are where a check quietly becomes weaker than its description. Ours are small and they are listed so that you can disagree with them rather than discover them.

The target size rule exempts a link sitting inside a sentence, which the standard permits and which is the difference between a readable paragraph and a paragraph of buttons. The accessible name rule accepts a link that wraps only an image, taking its name from that image instead, because that is what a browser does. It also accepts the wordmark in the header, which is an empty element with the logo applied as a mask and a written label attached, since there is no text there to read.

The illustration rule allows two outcomes and refuses the third. An illustration may be hidden from assistive technology or it may carry a name, and it may not be neither, because an unlabelled graphic that is not hidden is announced as an object with no description, which is worse than either choice made deliberately. That one is the exemption we would defend hardest, and it is also the one most likely to be wrong in some case no one has met yet.

Every result here is a negative one

A passing suite says a specific bad thing did not happen. No page skipped a heading level. No image is missing its attribute. No link is nameless. None of that says the headings are informative, the alternative text is accurate, or the link tells you where it goes. These checks raise the floor and say nothing whatever about the ceiling. The section on where a check passes and a person is still stuck, further down, is about the distance between the two.

The check that was missing until the day this was written

This page has said for some time that heading structure is checked by a test that reads the built pages. Until today no such test existed. The sentence sat in a list beside claims that were true, in the same typeface, and no one noticed that one of them was describing something that had never been written.

It exists now. It walks every heading on every built page in document order and fails the build if any level is more than one deeper than the one before it. It caught something on its first run: the product index went from its heading level one straight to thirteen level threes, because a grid of tiles carried headings with nothing above them to be under. To a reader using headings to move around, that page had thirteen answers and no question.

We are recording that here instead of editing the history, because a statement about testing that is itself untested is precisely the failure this page was written to argue against, and it happened on this page. If you find another sentence here in the same condition, the address below is the one to use.

Never tested

What has not been done

No testing with assistive technology

The product has not been systematically tested with a screen reader, with voice control, or with a switch device. The structure is built correctly and checked automatically, which is necessary and not sufficient. This is the largest gap and the thing most worth doing next.

No testing with disabled users

No one has been paid to try to do their job in this product using the tools they actually use. Everything on this page is what a small team has done carefully, and careful is not the same as verified.

No conformance claim

We do not claim conformance with WCAG 2.2 at Level AA. Conformance is a claim about every page and every state of every component, and asserting it without the testing above would be asserting something we have not established. Listing what is checked is less impressive and more useful. The W3C's own overview of the guidelines is the place to start if you want to judge that gap for yourself.

Untested combinations

Very large text combined with very small screens. High contrast modes on some operating systems. Older assistive technology. Each of these is a plausible place for something to be wrong and none has been systematically checked.

No overlay, deliberately

There is no accessibility widget and there is not going to be one. Disabled users have said repeatedly and publicly that overlays frequently make things worse, and hundreds of them have put their names to the overlay fact sheet saying so. Installing one substitutes for fixing the page. If a page needs an overlay to be usable, the page needs fixing.

How the list was arrived at

Each check on this page is a defect that already shipped

None of these were written in the abstract from a standard. Every one of them is a specific thing that was wrong on a specific number of pages, found late, and turned into a check so that it could only happen once.

A button that was present, correct and invisible

The one that started it. The main call to action was painted the same colour as the surface behind it. The element was there. It was the right size, in the right place, with the right label, and the label could not be seen. It was like that on twenty pages for an unknown number of deployments.

It was found by someone opening the site and looking, which is the part worth dwelling on. Looking had already happened many times without finding it, because a person who knows where a button is will see a button there. The check that holds it now compares colours as numbers, and numbers do not know where the button is meant to be.

A grey that measured 4.06 to 1

The muted text colour on this site, against one of its own backgrounds, came out at 4.06 to 1. The minimum is 4.5. It had been reviewed by eye repeatedly and looked entirely reasonable, because it is entirely reasonable looking. There is no version of a screenshot that tells you a colour is four hundredths under a threshold.

The check now computes the ratio for every text colour against every surface it can appear on, in both colour schemes, and fails the build under 4.5 to 1. It is the single most boring test in the repository and it has justified itself more than once.

Two hundred and sixty nine controls too small to hit

In the product, on a phone, two hundred and sixty nine interactive controls were under forty four pixels tall. Not a few of them. Effectively all of them, because the size came from one shared definition and the shared definition was wrong. Every screenshot of the product looked like a normal application, because a mouse pointer is one pixel wide and the person taking the screenshots was using one.

A table column that no keyboard could reach

The comparison tables scroll sideways on a narrow screen. Measured on the pricing page at three hundred and ninety pixels wide, the visible region was four hundred and thirty five pixels across and its contents were seven hundred and four. Something had to be off screen, and the something was the last column, which on a pricing table is the one a buyer is looking for.

A region that scrolls, with nothing focusable inside it and no place of its own in the tab order, cannot be scrolled without a pointer. That is a failure of a Level A criterion, 2.1.1, and it was on forty four pages. The fix is two attributes: a position in the tab order and a name, so that landing on it announces something instead of nothing. The check now refuses any scrolling region that has neither.

Status marks drawn in a colour meant for edges

The roadmap timeline says the state of an item is carried by its mark, then drew the hollow marks in a border colour. Measured against the two surfaces those marks sit on, that is 1.48 to 1 and 1.60 to 1: a hairline you can only find if you already know it is there. The two states drawn that way were not started and decided against, which are exactly the two a reader most needs to tell apart.

The check for this one does not compute a ratio. It enforces the choice: a mark that carries meaning may not take its colour from a border token, because border tokens exist for edges no one needs to see. Writing it that way means a future change to the grey scale cannot quietly undo the fix.

Thirteen headings under nothing

Described above, and it belongs in this list too. The heading order check was written on the day this section was, and immediately found a page that jumped two levels because a grid of tiles had no heading over it.

The pattern, which is the only general thing here

Every defect above was fully visible on screen and completely invisible to review. Not one of them was subtle in the browser. They were subtle to a person, which is a different property, and the difference is that a person arrives already knowing what the page is supposed to say.

The other thing they have in common is less comfortable. Not one of them was reported by someone who could not use the page. That is not a boast about response times. It means no one told us, and the most likely explanation is that the people these failures hurt most had not started using it yet. A defect that is discovered before anyone is harmed by it was still a defect for the whole time it existed.

The suite that holds these is not purely an accessibility suite. It also catches pages nothing links to, links pointing at hosts that do not exist, and page frames inside page frames. They sit together because the method is the same, not because the subject is. The method is that anything a person would have to notice will eventually not be noticed.

Where the assumption fails

Every check can pass while somebody is still stuck

These are the gaps between a green build and a usable page. They are listed because a reader who takes the enforced list at face value would come away believing more than it supports.

Text alternatives that exist and describe nothing

The check asserts that every image carries an alternative text attribute. An attribute reading image, or photo, or the file name it was uploaded with, satisfies that check completely and helps no one. The presence of a description is machine readable. The quality of one is not, and never will be. Every alternative text on this site was written by a person and is only as good as that person was on the day.

The same applies in the other direction. A decorative illustration that has been given an earnest paragraph of description is also a defect, because it makes a reader listen to something that carried no information. The check cannot tell the two situations apart. It only knows that a decision was recorded.

Headings in the right order that say nothing

The new heading check is a syntax check. It knows that a level three follows a level two and never a level one. It has no opinion at all about whether the heading says anything worth navigating to. A page of headings reading Overview, Details, More and Other would pass on the first run and be useless to anybody moving through a document by its structure, which is the main reason the structure exists.

This is why the house rule for headings on this site is that they are fragments with content in them rather than labels. That rule is enforced by editing, not by a test, and editing is the weaker of the two.

An accessible name that is technically present

The check takes the text of a link or button and requires that it is not empty. A link whose entire text is read more passes. Announced on its own, out of the sentence around it, read more is a link to nowhere in particular, and a list of them is a list of identical entries. The check would report that page as clean.

Contrast computed against the surfaces we listed

The colour checks compute every text token against every surface token. Text over a photograph, over a gradient or over an illustration is not a token on a token, so it is not in the computation. Nothing failed and nothing was measured, and those are not the same result even though the build reports them identically.

Targets that are big enough and too close together

The target check measures height. It does not measure the distance between one control and the next. Two controls that each clear forty four pixels, sitting flush against each other with a destructive action on one of them, would pass. Somebody with a tremor would find that out before we did.

A focus ring that is visible and off screen

Every focusable thing keeps its focus outline, and that is checked. Whether the thing that just received focus is inside the part of the page you can currently see is a question about layout, scrolling and the size of the window, and no check that reads markup can answer it. A focus ring you cannot see because it is below the fold is the same experience as no focus ring at all.

Motion that is not CSS

The reduced motion rule is a rule in a stylesheet, applied once globally, and it stops the things a stylesheet controls. It is not a general instruction to the page to hold still. Anything that moves for another reason, a video that plays by itself or an image format that animates on its own, would keep moving under a preference that has explicitly asked it not to. The rule would still be reported as present.

Everything about forms, timing and error recovery

None of the checks here read a form. Whether an error message is associated with the field it belongs to, whether it is announced when it appears rather than only painted red, whether a required field says so before you submit rather than after, whether a session that is about to expire warns anyone: none of that is covered by anything on this page. Forms are where an application is most likely to fail someone, and they are the part with the least automated coverage here. That is stated plainly because leaving it out would let the enforced list stand in for a completeness it does not have.

What follows from all of that

The checks are a floor. They stop a category of failure returning after it has been found once, and they do it without anyone having to remember. They are not evidence that the product works for somebody using a screen reader, a switch device or voice control, because none of those has been tested, which is written in full further up.

If you are deciding whether to trust this page, the useful question is not whether the list of checks is long. It is whether the list of things the checks cannot see is honest. That is what this section is for, and if you can think of a gap that belongs in it, we would rather add it than be asked about it later.

Reporting a barrier

What happens when you report something

Write to hello@consonas.com. Describe what you were trying to do, what happened, and what you were using if you are willing to say. You do not have to explain the standard to us or prove that something is a problem.

You will get a reply from a person. We will tell you honestly whether it is something we can fix quickly, something that will take a while, or something we do not know how to fix yet. If it is the last of those we will say so rather than going quiet, which is the response people report getting most often and the one that is hardest to argue with.

Where we fix something, we will add a test for it, so that it is a defect that happened once rather than a defect that comes back. That is how every item in the enforced list above got there. The same rule governs the rest of the legal and security shelf: a page here describes what the product does today, and a sentence that stops being true is a defect worth reporting.

Asked about access

Asked about accessibility

Do you claim WCAG AA conformance?

No, and we would rather explain why than claim it. Conformance is a claim about every page and every state of every component, and verifying it properly requires testing with assistive technology and with disabled users, which we have not done. What we can say precisely is which criteria are enforced by automated tests on every build, and that list is on this page.

Has the product been tested with a screen reader?

Not systematically, and that is the most significant gap on this page. The structure is built correctly and checked automatically, which is a necessary condition and not a sufficient one. Testing with real assistive technology and real users is the thing most worth doing next and it has not been done yet.

What if something does not work for me?

Write to hello@consonas.com and describe what you were trying to do and what happened. You will get a reply from a person. We will not ask you to prove it, and we will tell you honestly whether it is something we can fix quickly or something that will take a while.

Why do you not use an accessibility overlay?

Because disabled users have said, repeatedly and publicly, that overlays frequently make things worse rather than better, and because installing one substitutes for fixing the underlying page. If the page needs an overlay to be usable, the page needs fixing.

Does the product work at large text sizes?

It should. Sizes are set in relative units, the layout uses no fixed pixel widths for containers, and nothing depends on text being a particular size. It has not been tested at every level of magnification with every screen size, so if you find something broken please tell us.

Is the marketing site more accessible than the product?

Probably, and that is worth being honest about. This site is static HTML and CSS with no JavaScript, which removes an entire class of accessibility failure. The product is an application and applications are harder. Both are checked automatically, and the product has more surface area for something to be wrong.

What about the animated illustrations?

They stop completely under prefers reduced motion, enforced once globally. They are also decorative, hidden from assistive technology unless they carry meaning, and in that case described. Nothing on any page depends on seeing an animation.

How would I know if you broke something?

The automated checks would catch the categories they cover, on the build, before it deployed. They would not catch everything, which is why the address above exists and why we would genuinely rather hear from you than not.

Can you complete an accessibility conformance report?

No. A conformance report is a table of criteria with a claim written against each one, and filling one in honestly requires the testing described on this page, which has not happened. If your procurement process requires one, we will tell you we do not have it instead of producing a document no one verified. That may rule us out of your process, and being ruled out is better than signing a table we cannot stand behind.

Somebody on my team uses a screen reader. Should we buy this?

Trial it with that person before anybody signs anything, on the free plan, using the work they actually do instead of a tour of the features. We cannot tell you it works for them, because it has not been tested with assistive technology and saying otherwise would be guessing on their behalf. If it does not work, tell us what broke and then buy something that does.

The tests were written by the same people who wrote the site. Why would I trust them?

Partly you should not, and the page says why above: a check can be wrong in the same direction as the thing it checks, and each one only measures what someone thought to measure. What they give you is something specific to disagree with. A claim that we care about accessibility cannot be wrong. A claim that contrast is computed for every text colour against every listed surface, in both colour schemes, and fails the build below 4.5 to 1, can be.

Which success criteria do the automated checks correspond to?

We name one, because that test names it: the check that a scrolling table can be reached by keyboard was written against 2.1.1, which is Level A. The rest are not mapped, on purpose. Mapping a test to a criterion asserts that the test covers the criterion, and in nearly every case it covers a part of it. Describing what each check actually does is less convenient for a compliance form and more accurate about what runs.

Does the free plan get less of this?

No, and there is no mechanism by which it could. Accessibility here is a property of how the pages are built rather than a feature that can be switched on for one organisation and off for another. The same markup, the same tokens and the same checks apply on every plan, including free, permanently.

How often does this page change?

When a check is added, when a defect is found, or when something on the list of what has not been done stops being true. The heading order check described above was written on the day this answer was, and the page changed in both directions the same day: a claim that nothing was backing became one that something backs, and the fact that it had been unbacked was written down rather than quietly tidied away.

Tell us what does not work

You will get a reply from a person, and where we fix something we will add a test so it stays fixed.

Three people, a thousand relationships, no card and no time limit.