Ca11y crawlt een website, stelt een steekproef samen (incl. PDF's), voert een WCAG 2.2 AA audit uit op HTML én PDF, vergelijkt pagina's onderling en levert een rapport op in het W3C-standaardformaat.
Een URL of evaluatiedefinitie (WCAG-EM) wordt aangeboden, met een audittype: volledig (alle 55 criteria), quickscan (top-15, 5 pagina's), of deelonderzoek (inhoud of techniek, eigen criteria).
De crawler respecteert robots.txt, parset sitemaps en ontdekt pagina's via BFS link-discovery — inclusief PDF-links. Een classifier categoriseert in 10 typen (incl. PDF) waarna de sampler een WCAG-EM steekproef samenstelt.
De orchestrator routeert automatisch: HTML-pagina's naar 45 Puppeteer/CDP extractors, PDF-documenten naar 6 pdfjs-extractors. Gedeelde DOM-helpers worden geïnjecteerd via window.__ca11y.
Elk criterium krijgt een oordeel per pagina als EARL-assertion. Daarna draaien 3 cross-page comparators die navigatie-consistentie, componentbenaming en hulpmechanismen over pagina's heen vergelijken (LCS-based).
Claude beoordeelt de extractorresultaten met 24 beslisregels en schrijft bevindingen in een 7-punts patroon. Twee-lagen opbouw: site-brede bevindingen (≥80% pagina's) vs. per URL. Audittype-specifieke context bepaalt de beoordeling.
Het eindresultaat is een JSON-bestand in het WCAG-EM Report Tool formaat — de W3C-standaard. Direct importeerbaar in de officiële Report Tool of te verwerken in eigen rapportages.
45 HTML-extractors + 6 PDF-extractors + 3 cross-page comparators. De 10 overige criteria zijn fundamenteel niet automatiseerbaar.
geautomatiseerd handmatig +PDF PDF-extractor comparator cross-page
Principe 1 — Waarneembaar
| 1.1.1 | Non-text Content +PDF | |
| 1.2.1 | Audio-only and Video-only | |
| 1.2.2 | Captions (Prerecorded) | |
| 1.2.3 | Audio Description or Alt | |
| 1.2.4 | Captions (Live) | |
| 1.2.5 | Audio Description | |
| 1.3.1 | Info and Relationships +PDF | |
| 1.3.2 | Meaningful Sequence | |
| 1.3.3 | Sensory Characteristics | |
| 1.3.4 | Orientation | |
| 1.3.5 | Identify Input Purpose | |
| 1.4.1 | Use of Color | |
| 1.4.2 | Audio Control | |
| 1.4.3 | Contrast (Minimum) | |
| 1.4.4 | Resize Text | |
| 1.4.5 | Images of Text | |
| 1.4.10 | Reflow | |
| 1.4.11 | Non-text Contrast | |
| 1.4.12 | Text Spacing | |
| 1.4.13 | Content on Hover/Focus |
Principe 2 — Bedienbaar
| 2.1.1 | Keyboard | |
| 2.1.2 | No Keyboard Trap | |
| 2.1.4 | Character Key Shortcuts | |
| 2.2.1 | Timing Adjustable | |
| 2.2.2 | Pause, Stop, Hide | |
| 2.3.1 | Three Flashes | |
| 2.4.1 | Bypass Blocks | |
| 2.4.2 | Page Titled +PDF | |
| 2.4.3 | Focus Order | |
| 2.4.4 | Link Purpose (In Context) +PDF | |
| 2.4.5 | Multiple Ways | |
| 2.4.6 | Headings and Labels | |
| 2.4.7 | Focus Visible | |
| 2.4.11 | Focus Not Obscured | |
| 2.5.1 | Pointer Gestures | |
| 2.5.2 | Pointer Cancellation | |
| 2.5.3 | Label in Name | |
| 2.5.4 | Motion Actuation | |
| 2.5.7 | Dragging Movements | |
| 2.5.8 | Target Size (Minimum) |
Principe 3 — Begrijpelijk
| 3.1.1 | Language of Page +PDF | |
| 3.1.2 | Language of Parts +PDF | |
| 3.2.1 | On Focus | |
| 3.2.2 | On Input | |
| 3.2.3 | Consistent Navigation comparator | |
| 3.2.4 | Consistent Identification comparator | |
| 3.2.6 | Consistent Help +comparator | |
| 3.3.1 | Error Identification | |
| 3.3.2 | Labels or Instructions | |
| 3.3.3 | Error Suggestion | |
| 3.3.4 | Error Prevention | |
| 3.3.7 | Redundant Entry | |
| 3.3.8 | Accessible Authentication |
Principe 4 — Robuust
| 4.1.2 | Name, Role, Value | |
| 4.1.3 | Status Messages |
Vereisen menselijke beoordeling, device sensors, of analyses buiten browser-automatisering:
| 1.2.4 | Captions (Live) | Live video-streaming |
| 1.4.2 | Audio Control | Gebruikersinteractie |
| 2.3.1 | Three Flashes | Seizure-detectie |
| 2.5.1 | Pointer Gestures | Complexe gestures |
| 2.5.2 | Pointer Cancellation | Pointer timing |
| 2.5.4 | Motion Actuation | Device sensors |
| 2.5.7 | Dragging Movements | Menselijke interpretatie |
| 3.3.4 | Error Prevention | Formulier-context |
| 3.3.7 | Redundant Entry | Multi-staps formulier |
| 3.3.8 | Accessible Authentication | Authenticatiemethode |
| Fase 1 | Quick wins — contrast, reflow, text spacing, page titles, label in name, name/role/value | 7/7 |
| Fase 2 | Keyboard & interactie — keyboard, focus order, focus visible, info & relationships | 4/4 |
| Fase 3 | Visuele beoordeling — color use, images of text, non-text contrast, link purpose | 4/4 |
| Fase 4 | Batch 4 — language, forms, errors, bypass blocks, meaningful sequence, resize text | 10/10 |
| Fase 5 | Batch 5 — sensory, orientation, timing, shortcuts, hover/focus, multiple ways | 10/10 |
| Fase 6 | Batch 6 — media, keyboard trap, on focus, consistent help, target size | 8/8 |
| Fase 7 | PDF + comparators — 6 PDF-extractors, 3 cross-page comparators, 2 extra HTML-extractors | 9/9 |
HTML extractie: Puppeteer + Chrome DevTools Protocol. Accessibility tree via CDP Accessibility.getFullAXTree. DOM-helpers via window.__ca11y orchestrator-injectie.
PDF extractie: pdfjs-dist voor Node.js PDF-parsing. Orchestrator routeert automatisch HTML → Puppeteer, PDF → pdfjs.
Cross-page: 3 comparators (LCS-based navigatievergelijking, component-matching, hulpmechanisme-positie). Draaien automatisch na per-page extractie.
Crawling: 6 modules — URL-normalisatie, robots.txt, sitemap, BFS crawler met PDF-detectie, classifier (10 typen), WCAG-EM sampler.
Audittypen: 4 typen (volledig, quickscan top-15, deelonderzoek-inhoud, deelonderzoek-techniek) met criteria-filter per type.
Validatie: Zod schema's op alle outputs. 710 tests over 92 suites (45 HTML + 6 PDF + 3 comparators + 49 crawler + fixtures).
Output: WCAG-EM Report Tool JSON, JSON-LD @context, 55 EARL assertions, 5 WCAG-EM stappen, criteriafilter per audittype.
AI: Claude API, 24 beoordelingsregels, Jules Ernst schrijfstijl, twee-lagen bevindingen (site-breed vs. per URL). SHA-256 caching, 67% token-reductie, audittype-context.
Trainingsdata: 32.913 bevindingen uit 450 echte auditrapporten.
rijksoverheid.nl — crawl + assess, 3 pagina's:
45 HTML extractors + 3 comparators → 321 findings (52 errors, 73 warnings, 196 recommendations). 45 criteria beoordeeld: 19 voldoende, 18 onvoldoende, 8 n.v.t. Kosten: 32.270 tokens, $0,25. System prompt cache 100% hit.
gemeentewestland.nl — HTML + PDF + assess, 1 HTML + 1 PDF:
15 HTML extractors + 4 PDF extractors → 113 findings (19 errors, 39 warnings, 55 recommendations). 19 criteria beoordeeld: 7 voldoende, 11 onvoldoende, 1 n.v.t. Kosten: 14.912 tokens, $0,10. System prompt cache 100% hit.
Ca11y kan nu ook PDF-documenten testen — eerder de belangrijkste gap (86% van audits bevat PDF's).
| 2.4.2 | Page Titled — PDF-metadata titel |
| 3.1.1 | Language of Page — taaldefinitie in PDF-metadata |
| 3.1.2 | Language of Parts — taalattributen in structure tree |
| 1.3.1 | Info and Relationships — tagged PDF, heading/table structure |
| 1.1.1 | Non-text Content — alt-tekst op afbeeldingen |
| 2.4.4 | Link Purpose — linkdoelen in PDF |
Techniek: pdfjs-dist voor parsing. De orchestrator routeert PDF-URL's automatisch. De crawler detecteert PDF-links en voegt ze toe aan de steekproef.
| Medium | PDF formulier-validatie — complexere PDF-tests (formuliervelden, interactie) |
| Medium | dip backend-koppeling — EARL JSON is klaar voor import, nog niet gekoppeld |
| Laag | Whisper integratie — audio transcriptie voor diepere SC 1.2.x verificatie |
| Laag | 10 niet-automatiseerbare criteria — by design, wordt afgevangen door de auditor |
Op basis van 32.913 bevindingen uit 450 trainingsrapporten — hoe goed matchen de extractors de werkelijke bevindingen?
| SC | Criterium | Failed | Match | Unmatch | Dekking | ||
|---|---|---|---|---|---|---|---|
| 1.3.1 | Info and Relationships | 751 | 449 | 302 | 83% | ||
| 1.1.1 | Non-text Content | 655 | 435 | 220 | 73% | ||
| 1.4.3 | Contrast (Minimum) | 559 | 494 | 65 | 88% | goed | |
| 2.4.2 | Page Titled | 481 | 259 | 222 | 91% | ||
| 4.1.2 | Name, Role, Value | 479 | 321 | 158 | 64% | verbeter | |
| 2.4.4 | Link Purpose (In Context) | 430 | 224 | 206 | 74% | ||
| 1.4.11 | Non-text Contrast | 412 | 334 | 78 | 68% | goed | |
| 1.4.10 | Reflow | 378 | 227 | 151 | 55% | verbeter | |
| 2.5.3 | Label in Name | 314 | 79 | 235 | 68% | verbeter | |
| 1.4.1 | Use of Color | 304 | 67 | 237 | 57% | verbeter | |
| 3.1.1 | Language of Page | 302 | 2 | 300 | 89% | ||
| 2.4.3 | Focus Order | 291 | 145 | 146 | 60% | verbeter | |
| 2.1.1 | Keyboard | 286 | 57 | 229 | 57% | verbeter | |
| 1.3.2 | Meaningful Sequence | 270 | 2 | 268 | 74% | ||
| 2.4.7 | Focus Visible | 268 | 38 | 230 | 57% | verbeter | |
| 3.3.1 | Error Identification | 248 | 224 | 24 | 8% | goed | |
| 3.1.2 | Language of Parts | 245 | 156 | 89 | 34% | verbeter | |
| 2.4.6 | Headings and Labels | 235 | 20 | 215 | 66% | verbeter | |
| 1.3.5 | Identify Input Purpose | 221 | 81 | 140 | 61% | verbeter | |
| 4.1.3 | Status Messages | 202 | 23 | 179 | 63% | verbeter | |
| 3.3.2 | Labels or Instructions | 195 | 39 | 156 | 56% | verbeter | |
| 1.4.4 | Resize Text | 190 | 121 | 69 | 75% | ||
| 2.4.1 | Bypass Blocks | 187 | 63 | 124 | 58% | verbeter | |
| 1.4.5 | Images of Text | 164 | 116 | 48 | 67% | verbeter | |
| 1.4.12 | Text Spacing | 119 | 1 | 118 | 56% | verbeter |
goed Goed gedekt (<20% unmatched)
SC 3.3.1 Error Identification, 1.4.3 Contrast, 1.4.11 Non-text Contrast — de extractors vangen hier het overgrote deel van de bevindingen.
verbeter Hoog volume + verbeterbaar (>40% unmatched, <60% PDF)
Keyboard (229 unmatched), Use of Color (237), Focus Visible (230), Labels (156) — hier kunnen betere patronen ~40-45% van de unmatched findings vangen.
PDF Vooral PDF (>80% PDF in unmatched)
Language of Page, Page Titled, Contrast, Info and Relationships — betere patronen zijn hier zinloos, want de bevindingen gaan over PDF-documenten die de extractor niet test.
Ca11y dekt 45 van 55 WCAG 2.2 AA criteria (82%) met HTML-extractors, aangevuld met 6 PDF-extractors en 3 cross-page comparators. End-to-end operationeel: crawlen → steekproef (incl. PDF's) → extractie (HTML + PDF) → vergelijking → rapport → AI-beoordeling. Ondersteunt 4 audittypen. Geverifieerd op rijksoverheid.nl en gemeentewestland.nl.