What the Publish Gate Actually Checks
Windrow's publish gate runs before a page can go live. If it finds a failure, the page does not publish. It does not warn you and move on, and it does not hand you a score to feel good about.
Here is what it checks, why each check is there, and the things it reports without blocking, because a computer cannot honestly decide them.
What is on the list?
The gate has two layers. The first is a set of checks I wrote for Windrow's own blocks. The second is axe-core, the open-source testing engine, running the page in a real browser.
Every row below blocks the publish.
| Check | Label it shows | What it decides |
|---|---|---|
| Image has a description, or is marked decorative | WCAG 1.1.1 | Description present, or decorative chosen |
| Link has text | WCAG 2.4.4 | Accessible name is not empty |
| Link text is not "click here" or a bare web address | WCAG 2.4.4 | Text matched against a fixed list |
| Button has a name | WCAG 4.1.2 | Accessible name is not empty |
| Embedded video has a title | WCAG 4.1.2 | Title is not empty |
| Video captions are confirmed | WCAG 1.2.2 | The author confirmed captions exist |
| Audio has a transcript link | WCAG 1.2.1 | The link is on the page |
| Control is at least 24 by 24 pixels | WCAG 2.5.8 | Measured size |
| Page has a main heading | Heading structure | Count is not zero |
| Page has only one main heading | Heading structure | Count is not more than one |
| No skipped heading levels | Heading structure | Sequence |
| Figure has a text version | Figure check | Text version is present |
| Every footnote has a note, and every note a reference | Footnote check | References and notes match |
Then axe-core runs every rule tagged WCAG 2.0, 2.1, or 2.2 at level A or AA. That is where text contrast, form labels, the page language, the page title, table header cells, and valid ARIA get checked. Any one of those failing blocks the publish too.
It scans the page four times: at a desktop width and a phone width, each in light mode and dark mode. A contrast failure that only shows up in dark mode on a phone is still a contrast failure.
And if the scan cannot run at all, the page does not publish. A gate that lets pages through when it breaks is not a gate.
Why only what a machine can decide?
Because a gate that guesses is a gate people learn to route around.
A machine can tell you an image has a description. It cannot tell you the description is any good. It can tell you a heading exists at level two. It cannot tell you the heading describes the section. Any product that claims otherwise is selling you a confidence score dressed as a verdict.
So the rule I settled on: the gate blocks on things it can prove. Contrast is math. Heading sequence is arithmetic. Label association is a lookup.
Two rows in that table are not pure measurement, and I want to be straight about them. The link-text row checks a short list of phrases that never describe a destination, like "click here." Anything vaguer only gets a warning. The captions row cannot see captions at all, because they live on YouTube. It checks that you said they are there.
The moment a gate produces one false block, the person on the other side stops trusting all of it. Then they find the override, and now you have a warning system with extra steps.
So what happens with alt text?
The gate checks that an author made a decision. That is all it can honestly check.
- You place an image. Until you write a description, the gate holds the page.
- Your other choice is to tick "This image is decorative." Windrow renders it with an empty alt and hides it from screen readers. That is a real, recorded choice, not a skip.
- Windrow does not write the description for you. You do.
The gate cannot tell you the description is good. It can tell you nobody skipped it.
That extra step is the whole design. It is friction on purpose. Twenty years of audits taught me that the failure is not that people write bad alt text. It is that the tool let them write none at all and publish anyway.
What only gets a warning?
Four checks report on the page without blocking it. Each one points at a real problem, and each one would block pages that are fine.
- Vague link text, like "learn more." The words around a link can make it clear, and the gate cannot read the room.
- A link with no destination. An author halfway through a page may have a placeholder in it on purpose. The editor allows that, so the gate should not punish it.
- A link to a page that is not published yet. Two new pages that link to each other would lock each other out. Neither could go first.
- The reading level of a plain-language summary. The formula counts sentence length and syllables. It cannot tell plain English from short jargon, so it is labeled a guide and cites no WCAG number.
The pattern is the same in all four. A check that is right most of the time is not a gate. It is a nag.
What did I take back?
The three heading checks used to say "WCAG 1.3.1." They were wrong to.
No success criterion requires a page to have a main heading. HTML allows more than one, and no criterion forbids it. Skipping a level fails no criterion either. Axe-core files its own versions of these under best practice, with no WCAG tag at all.
They still block. A single clear main heading and an unbroken outline make a page much better to listen to, and that is a fair call for the product to make. What changed is the label. They now say "Heading structure," and a test in the codebase fails if anyone puts the WCAG number back. A procurement team that checks a citation should find something behind it.
What will the gate never catch?
Plenty, and I would rather say it plainly than let the gate imply otherwise.
- Whether your alt text is accurate.
- Whether your heading structure reflects the actual meaning of the page.
- Whether the page is usable with a screen reader on the task it exists for.
- Whether your error messages tell someone how to fix the problem.
- Whether the content is understandable to the person it is for.
- Whether a keyboard user can complete the thing the page is for without losing their place.
Automated testing covers roughly a third of WCAG. A green gate means you did not ship the third that machines can catch. It is not a conformance certificate.
Before you launch anything that matters: keyboard the top three tasks, zoom to 200%, and run a screen reader through the single most important flow. Fifteen minutes. It finds things no gate will.
Key points
- The gate blocks. It does not warn and move on.
- Two layers: Windrow's own checks for its blocks, and every WCAG A and AA rule in axe-core, at two widths, in light and dark mode.
- Alt text and captions are handled by requiring a recorded human decision, not by judging the result.
- Four checks only warn, because blocking on them would be wrong too often.
- The heading checks still block, but they stopped claiming a WCAG number they could not back up.
- A passing gate covers about a third of WCAG. Manual review before launch is still required, and always will be.
Windrow is live and open now. Start free, or pick a paid plan: $19 a month for individuals, $29 for nonprofits and schools, $49 for organizations, $199 for agencies. See every plan on windrow.app.