kaide checks a rendered page against an accessibility norm — identify → normalize → prove. You mark elements, kaide verifies the real DOM and returns findings with fixes. It is analyse-only: the page is checked in memory and discarded; only the report is kept. Do not send pages carrying personal data.
1. Get a credential
Sign in and mint an API key on the service tokens page — give it a name and
an expiry; it is shown once. Set it as the environment variable KAIDE_API_KEY.
Your organisation is derived from your sign-in automatically. (CI can instead use keyless
workload-identity federation where kaide already trusts the CI issuer.)
2. Get the client
Vendor kaide_check.py into your repo, pinned and verified by sha256. Get it in
whichever way suits your environment:
- From kaide (same origin, no git access needed, works airgapped once mirrored):
curl -O https://kaide.ac/client/kaide_check.py— and, for local capture,.../client/a11y-capture.js. Integrity:/client/manifest.jsonlists every file's sha256; fail your build if it drifts. - From the repo at a pinned commit, or the copy shared in the room.
- Ready-made templates — a modes file
curl -O https://kaide.ac/client/kaide-modes.jsonand a GitLab CI job.../client/gitlab-a11y.yml, so you wire the gate in minutes.
The client speaks MCP, so it needs mcp and httpx for the API calls (e.g.
mcp==2.2.0, httpx==0.28.1); Playwright + Chromium are needed only for the
local capture command. It picks up KAIDE_API_KEY on its own.
3. Mark and verify — several ways
Add data-a11y="<archetype>" to the elements you want checked deterministically
(kaide_check.py list / spec <id> for the archetypes). Then pick the
path that fits — kaide accepts more than one:
- Public URL —
python tools/kaide_check.py verify "$URL" --fail-on must(kaide renders it). - Private / preview page, Python —
captureit locally to a payload, thenverify --payload cap.json. - Private page, your own browser run — reuse
a11y-capture.js(A11yCapture.serialize()) inside an existing Playwright/Puppeteer suite to emit the samecapture/1payload, thenverify --payload— no second browser. - Direct MCP — call the
verifytool over MCP yourself if you don't want the client at all.
4. Gate your pipeline
verify … --fail-on must exits non-zero on must-level findings, so it fails the
pipeline. Start it advisory while you read the first runs, then make it a hard gate. The human
report for any run is at /report/<run_id>.
Check from your browser
To check the page you're looking at, make a bookmark whose address is this (then click it on any
page) — it loads /client/kaide.js, captures the page, and shows findings in a panel:
javascript:(function(){var s=document.createElement('script');s.src='https://kaide.ac/client/kaide.js';(document.head||document.documentElement).appendChild(s);})();First run asks for your KAIDE_API_KEY and remembers it (per site). A strict
site CSP can block the injected script; the Chrome/Firefox extensions (on the roadmap) avoid that.
Reference
The detection catalogue (sign in) lists every check. Per-tenant rate
limits: server-driven verify <url> 30/min, verify --payload 600/min.
Need more, or federation for a new CI host? Ask in the room.