Find accessibility problems while you type. Not months later in an audit.
Contrastic is a WCAG 2.2 linter. It checks your code in the editor and in the pull request. Each finding names the success criterion it fails and suggests a fix. A pull request with a blocking finding cannot merge.
The problem: teams test too late
1 in 6 people has a significant disability. For them, a website works only when it is accessible. Since June 2025 the European Accessibility Act asks for it too.
An afterthought
Accessibility is not in the story and not in the planning.
Too late
Teams find problems in the audit, after the release.
No feedback
A linter warns about code style. Nothing warns about accessibility.
Too much noise
False positives and duplicate findings teach the team to ignore the tool.
AI copies the problems
Agents learn from web code, with its accessibility bugs. Without feedback they repeat them, faster than ever.
The later you find a bug, the more it costs
- Cost of a bug: 1 of 5UI/UX
- Cost of a bug: 1 of 5. Contrastic finds the bug here.Code / IDEDev server
- Cost of a bug: 1 of 5. Contrastic finds the bug here.Pull request
- Cost of a bug: 2 of 5UAT deployment
- Cost of a bug: 4 of 5StagingProduction
- Cost of a bug: 5 of 5. Today, teams find the bug here.Audit
The euro signs show the cost of a bug at each step, as an indication. They are not a measurement.
Shift left: Contrastic in five places
The arrows point left: we move the work to the start, where it is fastest and cheapest.
- Speed: onceDesignComponent library
- Speed: millisecondsEditorWhile you type
- Speed: secondsPre-commit hookChanged files only
- Speed: minutesPull requestBlocks the merge
- Speed: whateverLive auditingNightly or after each deployment · planned
Design
Check the components of the component library. Fix a bug in a component once, and every page that uses it gets the fix.
Editor
The language server shows findings while you type, in VS Code, Zed and IntelliJ.
Pre-commit hook
The command line checks only the files you changed.
Pull request
CI runs the static rules and the browser scan. A blocking finding stops the merge.
Live auditing
A scan of all pages every night or after each deployment. This step is planned and does not exist yet.
Static first
When the source code can decide, a static rule decides. It reads JSX and TSX with oxc and runs in milliseconds.
The browser as a safety net
When the source cannot decide, the rule says cantTell and does not guess. The browser scan checks focus order, keyboard traps and content that changes, with axe-core and our own rules.
How it works
Static analysis
Rules on the syntax tree of your components.
Browser scan
Headless Chrome opens the rendered pages.
Merge
One finding per problem, not one per tool.
Report
Console, SARIF for the pull request, and an HTML report per WCAG principle.
error[jsx-a11y/alt-text]: Missing `alt` attribute.
--> src/ProductCard.tsx:12:5
= WCAG 1.1.1 Non-text Content (Level A)
= help: Add an `alt` attribute with meaningful
text, or alt="" for a decorative image.
- FastIn the loop, not after the release.
- PreciseRule, place, criterion and fix.
- Honest
cantTellwhen the rule does not know: the browser decides.
Three layers: the rule does not know the standard
Rule
Gives
passed,failedorcantTell, with no WCAG ids in the code.Mapping
Data that ties each rule to one WCAG 2.2 success criterion.
Policy
Decides what blocks. By default: level A and AA findings from a sure source. AI findings never block.
When WCAG 3.0 arrives, Contrastic gets a new mapping. The rules stay the same.
Results
167 rules
- 78
static rules, in the source code
- 68
axe-core rules, in the browser
- 19
own browser rules
- 2
AI checks, which never block
Each rule has a mapping to WCAG, tests and a snapshot.
Fast enough for every pull request
- < 10 ms
static check of a file with 2,000 lines
- ~0.6 s
browser scan of the demo webshop
Goal: less than 10% false positives
| Demo webshop | 2.2% |
|---|---|
| W3C ACT test cases | 2.9% |
WCAG 2.2 coverage
Success criteria with at least one rule that can fail them.
| Level | Criteria checked | Percentage |
|---|---|---|
| A | 31 of 31 | 100% |
| AA | 22 of 24 | 91% |
| A and AA | 53 of 55 | 96% |
| AAA | 28 of 31 | 90% |
An automated check covers only part of a criterion. So 100% does not prove that a site conforms to WCAG. A person still tests what a tool cannot decide.
Who makes Contrastic
Contrastic is a hackathon project of the/experts, made in 2026 by Tobias, Andrea, Lennard and JP. AI agents wrote the code under strict quality gates; the team steered and checked it.
Do you want to know more, or use Contrastic in your project? Contact the/experts.