maakeencv.nl

Toegankelijkheids­onderzoek maakeencv (app.maakeencv.nl)

Onderzoeksdatum7 oktober 2026
Soort onderzoekVolledig onderzoek (eerste meting), herstel, eindmeting en gerichte hermeting
OnderzoekerSMITO B.V., leverancier van maakeencv — eigen onderzoek van de leverancier
UitvoeringGeautomatiseerd en gescript onderzoek met axe-core en de Chrome DevTools, met AI-ondersteuning (Claude, Anthropic) voor meten, beoordelen en schrijven; vastgesteld door SMITO B.V. Er is geen tweede menselijke beoordelaar en er zijn geen tests met gebruikers met een beperking gedaan (zie §1 en §9).
OpdrachtgeverSMITO B.V. (algemeen rapport voor gemeenten en uitvoerders die maakeencv gebruiken)
NormWCAG 2.1 niveau A en AA (EN 301 549 v3.2.1, hoofdstuk 9); daarnaast WCAG 2.2 niveau A en AA
MethodeWCAG-EM 2.0 (W3C Group Note, 23 juli 2026)
Onderzochte versieWeb-app maakeencv, git-commit bc14c97 (volledige meting op 5c3c000, gerichte hermeting na herstel op bc14c97)
Documentversie1.0
Vaste linkhttps://www.maakeencv.nl/toegankelijkheid/onderzoek-2026-10

1. Samenvatting

1.1 Totaalscore

NormVoldoetNiet van toepassingTotaalVoldoet niet
WCAG 2.1 A + AA (50 criteria, de wettelijke norm)48250/500
WCAG 2.2 A + AA (55 criteria, de komende norm)53255/550

"Niet van toepassing" telt mee als voldaan: de app heeft geen live-video (1.2.4) en geen bediening door bewegen of schudden (2.5.4). Criterium 4.1.1 (parsen) geldt alleen in WCAG 2.1 en telt volgens de noot in WCAG 2.1 bij HTML altijd als voldaan.

1.2 Wat er gebeurd is

In de eerste meting voldeden 21 van de 50 criteria (plus 2 niet van toepassing); 15 voldeden niet en 12 moesten nog handmatig worden beoordeeld. Er waren 23 bevindingen. De belangrijkste:

  • In het Arabisch, Farsi en Dari lag het menu óver de inhoud, zodat een deel van de knoppen en tekst onbereikbaar was.
  • In de lesspeler kon de focus met de Tab-toets achter de les verdwijnen; na het sluiten van een venster stond de focus nergens.
  • Elk scherm heette "maakeencv.nl"; de focusring en de randen van invoervelden waren te licht; knoppen en schuifregelaars zonder naam; verplichte velden zonder aanduiding; volgorde alleen met slepen te veranderen.

Al deze bevindingen zijn hersteld. Daarna is alles opnieuw gemeten (eindmeting), en de punten die de eindmeting nog vond, zijn hersteld en gericht opnieuw gemeten (§6 en §7).

1.3 Wat deze uitkomst wel en niet zegt

  • De uitkomst geldt voor de onderzochte versie, in de onderzochte configuratie, op de onderzochte datum. Een steekproef levert geen garantie voor elk scherm van het product (WCAG-EM).
  • Dit is een eigen onderzoek van de leverancier. Dat mag (DigiToegankelijk: "Je mag als organisatie zelf het toegankelijkheidsonderzoek uitvoeren"), maar het is geen onafhankelijk onderzoek en geen certificaat.
  • Er is geen test met een echte schermlezer of spraakbediening en geen test met gebruikers met een beperking gedaan; alleen Chrome op Windows is gebruikt. Wat een schermlezer werkelijk voorleest, is beoordeeld via de toegankelijkheidsboom van de browser en de code. Zie §9 en het verbeterplan (§10): die tests zijn gepland.
  • De status in een toegankelijkheidsverklaring (A tot en met E) bepaalt de gemeente. Wij adviseren een gemeente om status A pas te kiezen na de schermlezertest uit §10, of na een onafhankelijke toets.

2. Scope

Onderzocht: de web-app maakeencv (app.maakeencv.nl) in alle rollen: publiek (inloggen, registreren, wachtwoord vergeten, privacy, voorwaarden, cookies), deelnemer (start, cv-editor, cv-voorbeeld, lessen en eindvragen, Mijn MAP, opdrachten, profiel, instellingen, sollicitaties, brieven, Ontdekken, route, vacatures, Mijn woorden), begeleider (Deelnemers, kaart per deelnemer, groepen, MAP-groep, lesplannen, eindoverzicht, overzicht voor de gemeente, kwartaalrapport), beheerder bij een gemeente (organisatie, team) en platformbeheer, inclusief de tweede inlogstap, dialogen, foutmeldingen en lege toestanden. In het Nederlands volledig; daarnaast in het Arabisch (rechts-naar-links), Frans, Engels, Tigrinya en Russisch, in de kleurthema's standaard, februari, maart en juni, en op 320 CSS-pixels breed.

Niet onderzocht: de pdf's die de app maakt (cv en sollicitatiebrief, gemaakt door de dienst DocRaptor), inloggen met Google, Microsoft, LinkedIn en de inloglink, betalen (Stripe) en de e-mails die de app verstuurt. De afdrukweergave van het MAP-eindoverzicht is wel onderzocht. De website www.maakeencv.nl is een aparte website en valt buiten dit onderzoek. Zie §10 voor het vervolg.

Conformiteitsdoel: WCAG 2.1 niveau AA; daarnaast WCAG 2.2 niveau AA.

Basisniveau van toegankelijkheidsondersteuning (doel): de laatste twee versies van Chrome, Edge, Firefox en Safari op Windows 11, macOS, iOS en Android, met NVDA (Windows), VoiceOver (macOS en iOS) en TalkBack (Android). Getest in dit onderzoek: alleen Google Chrome 155 (headless) op Windows 11.

Aanvullende eisen: alle elf talen van de app (getest: zie hierboven), alle dertien kleurthema's (contrast van de focusindicator en van tekst op het inlogscherm in alle dertien gemeten), en per afwijking alle plekken waar dezelfde fout voorkwam.

3. Verkenning van het product

Technologieën: HTML, CSS (Tailwind), JavaScript (React 18, Vite), WAI-ARIA (componenten op Radix UI en vaul), SVG (iconen, grafieken met recharts), audio en video (HTML5 met WebVTT-ondertitels), een iframe van Cloudflare Turnstile op de inlogschermen.

Essentiële functies: inloggen en registreren; een cv maken en downloaden; lessen volgen met oefeningen en eindvragen (met voorlezen en taalhulp in de eigen taal); de MAP: thema's, opdrachten, praktijkuren vastleggen en het eindgesprek voorbereiden; als begeleider deelnemers uitnodigen en begeleiden, groepen beheren, het eindoverzicht en de rapportage voor de gemeente bekijken; beheer van organisaties en teams.

Soorten schermen en componenten: formulieren (ook met verplichte velden en foutmeldingen), lijsten en tabellen, tabbladen, dialogen en lades, menu's, keuzelijsten, schuifregelaars, voortgangsbalken, een teksteditor, slepen en neerzetten, de lesspeler met ongeveer vijftien soorten oefeningen, audio en video, grafieken, de afdrukweergave en de tweede inlogstap.

4. Steekproef

4.1 Opzet

  • Gestructureerde steekproef (3.1): alle gemeenschappelijke schermen (inloggen, registreren, wachtwoord vergeten, juridische pagina's, hulp/contact, tweede stap), elk soort scherm per rol, elke essentiële functie (cv maken en pdf, les volgen met eindvragen, MAP, begeleiden, rapporteren, beheren) en elke technologie die we tegenkwamen (formulieren, eigen componenten op Radix, slepen, audio, video met ondertitels, iframe van Cloudflare Turnstile, afdrukweergave). Een scherm met meer toestanden (cv-editor per sectie, lesspeler per bloktype, tabbladen) staat er per toestand in, onder één schermnaam.
  • Willekeurige steekproef (3.2): 10% van het aantal schermen in de gestructureerde steekproef, bovenop die steekproef; zie §4.4.
  • Complete processen (3.3): zie §4.5. Elk proces is met alleen het toetsenbord doorlopen (Tab, Shift+Tab, Enter, spatie, pijltjes, Esc) en per stap vastgelegd.
  • Varianten: alle schermen in het Nederlands op 1280×900 (thema standaard). Daarnaast een selectie in het Arabisch (rtl), in de thema's februari (donkerste gekleurde thema; dit thema staat live) en maart (laagste contrast van de merkkleur), en op 320 px mobiel. Elk scherm is bovendien gemeten op 320 CSS-px (venster en telefoon), met tekstafstand, op 200% zoom en met alleen-tekst 200%.

4.2 Omvang per rol

RolSchermenToestanden
Publiek (niet ingelogd)78
Platformbeheerder (tweede stap)11
Deelnemer2146
Begeleider1014
Beheerder bij een gemeente27
Platformbeheerder15
Totaal gestructureerd4181
Willekeurig (§4)55

Testaccounts (lokaal, geen echte personen): deelnemer = demo-inburgeraar@test.nl; gemeente = demo-gemeente-westland@test.nl (coach bij Werkt! Westland, MAP-groep); gemeenteBeheer = demo-gemeente-westland@test.nl (beheerder bij Demo Gemeente Westland); beheer = beheerder@werkpad.test (met tweede stap); beheerZonderMfa = beheerder@werkpad.test (zonder tweede stap).

4.3 Gestructureerde steekproef

Kolom "Hoe" is de handeling in de app; "Pad" is het adres dat de meetscripts openden (soms met een toestand vooraf, bijvoorbeeld de stap in een les via de sessieopslag die de app zelf ook gebruikt).

KenmerkSchermTitel / toestandPadRol (account)TaalThemaHoe
S01InloggenInloggen; leeg formulier/loginpubliek (publiek)nlstandaardapp.maakeencv.nl/login openen
S02InloggenInloggen met e-maillink; modus e-maillink/loginpubliek (publiek)nlstandaard/login → "Inloggen met een e-maillink (zonder wachtwoord)"
S03Wachtwoord vergetenWachtwoord vergeten; formulier herstellink/loginpubliek (publiek)nlstandaard/login → "Wachtwoord vergeten?"
S04Account aanmakenAccount aanmaken; leeg formulier/signuppubliek (publiek)nlstandaard/login → "Registreren"
S05Nieuw wachtwoordNieuw wachtwoord instellen; zonder geldige herstellink/reset-passwordpubliek (publiek)nlstandaardlink uit de herstelmail (hier zonder token geopend)
S06PrivacyverklaringPrivacyverklaring; standaard/Privacypubliek (publiek)nlstandaardlink "Privacy" onder het inlogscherm
S07Algemene voorwaardenAlgemene voorwaarden; standaard/Termspubliek (publiek)nlstandaardlink "Voorwaarden" onder het inlogscherm
S08CookiebeleidCookiebeleid; standaard/Cookiespubliek (publiek)nlstandaardlink "Cookies" in de privacyverklaring
S09TweestapsverificatieTweestapsverificatie instellen (beheerder); na inloggen, nog geen app gekoppeld/beheerder (beheerZonderMfa)nlstandaardinloggen als platformbeheerder zonder gekoppelde authenticator
S10Eerste startEerste start, stap 1; stap 1 (uitnodiging)/EersteStartdeelnemer (deelnemer)nlstandaardeerste keer inloggen als deelnemer van een organisatie (hier: /EersteStart direct)
S11StartStart (dashboard deelnemer); met één cv en open taken/Dashboarddeelnemer (deelnemer)nlstandaardna inloggen; menu "Start"
S12Mijn cv'sMijn cv's; één cv/MijnCvsdeelnemer (deelnemer)nlstandaardmenu "Mijn cv's"
S13Cv-editorCv-editor: persoonlijke gegevens; tab Inhoud, sectie persoonlijke gegevens open/Editor?id=7b479087-7f28-4750-ba14-0ba2b831eb55&sectie=personaldeelnemer (deelnemer)nlstandaardMijn cv's → cv openen → sectie "persoonlijke gegevens"
S14Cv-editorCv-editor: werkervaring; tab Inhoud, sectie werkervaring open/Editor?id=7b479087-7f28-4750-ba14-0ba2b831eb55&sectie=experiencedeelnemer (deelnemer)nlstandaardMijn cv's → cv openen → sectie "werkervaring"
S15Cv-editorCv-editor: opleiding; tab Inhoud, sectie opleiding open/Editor?id=7b479087-7f28-4750-ba14-0ba2b831eb55&sectie=educationdeelnemer (deelnemer)nlstandaardMijn cv's → cv openen → sectie "opleiding"
S16Cv-editorCv-editor: vaardigheden; tab Inhoud, sectie vaardigheden open/Editor?id=7b479087-7f28-4750-ba14-0ba2b831eb55&sectie=skillsdeelnemer (deelnemer)nlstandaardMijn cv's → cv openen → sectie "vaardigheden"
S17Cv-editorCv-editor: talen; tab Inhoud, sectie talen open/Editor?id=7b479087-7f28-4750-ba14-0ba2b831eb55&sectie=languagesdeelnemer (deelnemer)nlstandaardMijn cv's → cv openen → sectie "talen"
S18Cv-editorCv-editor: certificaten; tab Inhoud, sectie certificaten open/Editor?id=7b479087-7f28-4750-ba14-0ba2b831eb55&sectie=certificatesdeelnemer (deelnemer)nlstandaardMijn cv's → cv openen → sectie "certificaten"
S19Cv-editorCv-editor: nevenactiviteiten; tab Inhoud, sectie nevenactiviteiten open/Editor?id=7b479087-7f28-4750-ba14-0ba2b831eb55&sectie=activitiesdeelnemer (deelnemer)nlstandaardMijn cv's → cv openen → sectie "nevenactiviteiten"
S20Cv-editorCv-editor: eigen secties; tab Inhoud, sectie eigen secties open/Editor?id=7b479087-7f28-4750-ba14-0ba2b831eb55&sectie=customdeelnemer (deelnemer)nlstandaardMijn cv's → cv openen → sectie "eigen secties"
S21Cv-editorCv-editor: ontwerp; tab Ontwerp/Editor?id=7b479087-7f28-4750-ba14-0ba2b831eb55deelnemer (deelnemer)nlstandaardcv openen → tab "Ontwerp"
S22Cv-voorbeeldCv-voorbeeld en pdf; voorbeeld van het cv/CVPreview?id=7b479087-7f28-4750-ba14-0ba2b831eb55deelnemer (deelnemer)nlstandaardcv-editor → "Preview & download"
S23LerenLeren: overzicht; lessen klaargezet, één module af/Lerendeelnemer (deelnemer)nlstandaardMAP → "Al je lessen" (of menu Leren)
S24ModuleLeren: module-overzicht; module niet begonnen/Leren?module=beroepskansendeelnemer (deelnemer)nlstandaardLeren → module "Beroepskansen" → "Bekijken"
S25LesspelerLesspeler: welkomvenster (met voorleesspeler); beroepskansen / vraag-naar-werk, venster 0/Leren?module=beroepskansen&les=vraag-naar-werkdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 0
S26LesspelerLesspeler: blok voorvraag; beroepskansen / vraag-naar-werk, venster 1/Leren?module=beroepskansen&les=vraag-naar-werkdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 1
S27LesspelerLesspeler: blok afbeelding; beroepskansen / vraag-naar-werk, venster 2/Leren?module=beroepskansen&les=vraag-naar-werkdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 2
S28LesspelerLesspeler: blok tekst; beroepskansen / vraag-naar-werk, venster 3/Leren?module=beroepskansen&les=vraag-naar-werkdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 3
S29LesspelerLesspeler: blok kaarten; beroepskansen / vraag-naar-werk, venster 4/Leren?module=beroepskansen&les=vraag-naar-werkdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 4
S30LesspelerLesspeler: blok volgorde; beroepskansen / vraag-naar-werk, venster 6/Leren?module=beroepskansen&les=vraag-naar-werkdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 6
S31LesspelerLesspeler: blok sorteren; beroepskansen / vraag-naar-werk, venster 7/Leren?module=beroepskansen&les=vraag-naar-werkdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 7
S32LesspelerLesspeler: blok scenario; beroepskansen / vraag-naar-werk, venster 8/Leren?module=beroepskansen&les=vraag-naar-werkdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 8
S33LesspelerLesspeler: blok oefening (meerkeuze); beroepskansen / vraag-naar-werk, venster 9/Leren?module=beroepskansen&les=vraag-naar-werkdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 9
S34LesspelerLesspeler: blok onthoud; beroepskansen / vraag-naar-werk, venster 10/Leren?module=beroepskansen&les=vraag-naar-werkdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 10
S35LesspelerLesspeler: blok aantikken; beroepskansen / waar-zoeken, venster 5/Leren?module=beroepskansen&les=waar-zoekendeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 5
S36LesspelerLesspeler: blok voorbeeld; beroepskansen / twee-vacatures, venster 5/Leren?module=beroepskansen&les=twee-vacaturesdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 5
S37LesspelerLesspeler: blok invullen; beroepskansen / twee-vacatures, venster 6/Leren?module=beroepskansen&les=twee-vacaturesdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 6
S38LesspelerLesspeler: blok woorden; beroepskansen / twee-vacatures, venster 10/Leren?module=beroepskansen&les=twee-vacaturesdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 10
S39LesspelerLesspeler: blok lijst; beroepskansen / kiezen, venster 9/Leren?module=beroepskansen&les=kiezendeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 9
S40LesspelerLesspeler: blok reflectie; beroepskansen / kiezen, venster 11/Leren?module=beroepskansen&les=kiezendeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 11
S41LesspelerLesspeler: blok opdracht; beroepskansen / kiezen, venster 12/Leren?module=beroepskansen&les=kiezendeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 12
S43LesspelerLesspeler: les klaar; werknemersvaardigheden / eerste-werkweek, venster 12/Leren?module=werknemersvaardigheden&les=eerste-werkweekdeelnemer (deelnemer)nlstandaardLeren → module → les starten → "Verder" tot venster 12
S42LesspelerLesspeler: blok video (lesvoorbeeld, basisvariant); werkervaring-2 / vier-delen, venster 4 (video met ondertitels); de inburgeringsvariant van deelnemers heeft geen video/Leren?module=werkervaring-2&les=vier-delen&voorbeeld=1begeleider (gemeente)nlstandaardDeelnemers → tab Lessen → les bekijken (voorbeeld) → venster 4
S44EindvragenEindvragen van een module; alle lessen af, eindvragen open/Leren?module=werknemersvaardigheden&eindvragen=1deelnemer (deelnemer)nlstandaardmodule met alle lessen af → "Eindvragen"
S45Mijn MAPMijn MAP; MAP-groep, met praktijkuren/Mapdeelnemer (deelnemer)nlstandaardmenu "MAP"
S46MAP-overzichtMAP: overzicht voor het eindgesprek; standaard/MapOverzichtdeelnemer (deelnemer)nlstandaardMAP → "Bekijk je overzicht"
S47BewijsmapBewijsmap; leeg (nog geen bewijsstukken)/Bewijsmapdeelnemer (deelnemer)nlstandaardmenu "Bewijsmap"
S48RouteMijn route; voorstel/Routedeelnemer (deelnemer)nlstandaardmenu "Mijn route"
S49MeedoenMeedoen; met activiteiten/Meedoendeelnemer (deelnemer)nlstandaardmenu "Meedoen"
S50ProfielMasterprofiel; ingevuld/Profiledeelnemer (deelnemer)nlstandaardaccountmenu → "Profiel"
S51InstellingenInstellingen; standaard/Settingsdeelnemer (deelnemer)nlstandaardaccountmenu → "Instellingen"
S52SollicitatiesMijn sollicitaties; lege toestand/Applicationsdeelnemer (deelnemer)nlstandaardmenu "Solliciteren"
S53BrievenMijn sollicitatiebrieven; lege toestand/CoverLettersdeelnemer (deelnemer)nlstandaardSolliciteren → tab "Brieven"
S54Nieuwe briefNieuwe brief (wizard); stap 1/CoverLetterWizarddeelnemer (deelnemer)nlstandaardBrieven → "Maak je eerste sollicitatiebrief"
S55HelpcentrumHelpcentrum; standaard/HelpCenterdeelnemer (deelnemer)nlstandaardmenu "Hulp"
S56ContactContact; formulier/Contactdeelnemer (deelnemer)nlstandaardHelpcentrum → "Contact"
S57VandaagVandaag (begeleider); met signalen/Vandaagbegeleider (gemeente)nlstandaardna inloggen als begeleider
S58DeelnemersDeelnemers: tab Deelnemers; MAP-groep met 13 deelnemers/Deelnemersbegeleider (gemeente)nlstandaardmenu "Deelnemers"
S59DeelnemersDeelnemers: tab MAP; tab MAP/Deelnemers?tab=mapbegeleider (gemeente)nlstandaardDeelnemers → tab "MAP"
S60DeelnemersDeelnemers: tab Lessen; tab Lessen/Deelnemers?tab=lessenbegeleider (gemeente)nlstandaardDeelnemers → tab "Lessen"
S61DeelnemersDeelnemers: tab Opdrachten; tab Opdrachten/Deelnemers?tab=opdrachtenbegeleider (gemeente)nlstandaardDeelnemers → tab "Opdrachten"
S62DeelnemersDeelnemers: tab Groep; tab Groep/Deelnemers?tab=groepbegeleider (gemeente)nlstandaardDeelnemers → tab "Groep"
S63KaartKaart van een deelnemer; MAP-deelnemer met eindadvies/Kaart?id=8fd3aa96-7b81-421e-8da7-5a87bfbc5f44&org=3e511e73-e97e-4827-ade3-2ab442deaaf0begeleider (gemeente)nlstandaardDeelnemers → naam van de deelnemer
S64MAP-eindoverzichtMAP-eindoverzicht van een deelnemer; klaar voor het eindgesprek/MapEindoverzicht?id=8fd3aa96-7b81-421e-8da7-5a87bfbc5f44&org=3e511e73-e97e-4827-ade3-2ab442deaaf0begeleider (gemeente)nlstandaardDeelnemers → tab MAP → "Eindoverzicht"
S65Intake-samenvattingSamenvatting intake vooraf; intake ingevuld/IntakeSamenvatting?id=8fd3aa96-7b81-421e-8da7-5a87bfbc5f44&org=3e511e73-e97e-4827-ade3-2ab442deaaf0begeleider (gemeente)nlstandaardDeelnemers → "Voorbereiding verstuurd"
S66LesplannenLesplannen MAP; thema A/MapLesplannenbegeleider (gemeente)nlstandaardDeelnemers → tab MAP → "Lesplannen en handouts per thema"
S67EindrapportEindrapport van een groep; MAP-groep/Cohortrapport?cohort=ba9fa688-5b0e-4d83-bef0-0f09ad9aeed1begeleider (gemeente)nlstandaardDeelnemers → "Eindrapport"
S68AI-geletterdheidAI-geletterdheid voor begeleiders; standaard/AiGeletterdheidbegeleider (gemeente)nlstandaardmenu "AI-geletterdheid"
S69OntdekkenOntdekken (voorbeeld voor begeleider); voorbeeldweergave/Ontdekken?voorbeeld=1begeleider (gemeente)nlstandaardBeheer/Organisatie → Ontdekken bekijken (voor leerlingen: menu "Ontdekken")
S70Overzicht (regie)Overzicht trajecten (gemeente); tab Overzicht/Regiebeheerder gemeente (gemeenteBeheer)nlstandaardna inloggen als beheerder bij een gemeente
S71Overzicht (regie)Kwartaalrapport (gemeente); tab Kwartaalrapport/Regiebeheerder gemeente (gemeenteBeheer)nlstandaardOverzicht → tab "Kwartaalrapport"
S72Overzicht (regie)Overzicht per persoon (gemeente); tab Per persoon/Regiebeheerder gemeente (gemeenteBeheer)nlstandaardOverzicht → tab "Per persoon"
S73OrganisatieOrganisatie: algemeen; tab Algemeen/Organisatiebeheerder gemeente (gemeenteBeheer)nlstandaardmenu "Organisatie"
S74OrganisatieOrganisatie: groepen; tab Groepen/Organisatiebeheerder gemeente (gemeenteBeheer)nlstandaardOrganisatie → tab "Groepen"
S75OrganisatieOrganisatie: team; tab Team/Organisatiebeheerder gemeente (gemeenteBeheer)nlstandaardOrganisatie → tab "Team"
S76OrganisatieOrganisatie: privacy en logboek; tab Privacy en logboek/Organisatiebeheerder gemeente (gemeenteBeheer)nlstandaardOrganisatie → tab "Privacy en logboek"
S77BeheerBeheer: overzicht; tab Overzicht/AdminDashboardplatformbeheerder (beheer)nlstandaardna inloggen als platformbeheerder (met tweede stap)
S78BeheerBeheer: Organisaties; tab Organisaties/AdminDashboard?tab=organisatiesplatformbeheerder (beheer)nlstandaardBeheer → menu "Organisaties"
S79BeheerBeheer: Gebruikers; tab Gebruikers/AdminDashboard?tab=usersplatformbeheerder (beheer)nlstandaardBeheer → menu "Gebruikers"
S80BeheerBeheer: Lesmateriaal; tab Lesmateriaal/AdminDashboard?tab=lesmateriaalplatformbeheerder (beheer)nlstandaardBeheer → menu "Lesmateriaal"
S81BeheerBeheer: Thema; tab Thema/AdminDashboard?tab=themaplatformbeheerder (beheer)nlstandaardBeheer → menu "Thema"

Varianten van de gestructureerde steekproef

VariantSchermen
Arabisch, rtl (1280×900, volledige batterij incl. 320 px)S01, S04, S06, S11, S12, S13, S14, S22, S23, S24, S25, S31, S33, S37, S44, S45, S47, S50, S51, S52
Thema februari en thema maart (axe, randen, focus, doelgrootte)S01, S04, S06, S11, S13, S23, S25, S31, S45, S50, S57, S58, S59, S63
Mobiel 320×640 (axe, focus, doelgrootte; telefoonemulatie)S01, S04, S11, S13, S22, S23, S25, S31, S45, S50, S57, S58, S63
Productie, alleen lezen (ter vergelijking)P-S01 inlogscherm, P-S04 registreren op app.maakeencv.nl

Niet in de steekproef, met reden: /HOME, /Pricing, /Invites en /FAQ zijn voor deelnemers van een organisatie omgeleid (deelnemerPaginas.js) of verwijzen door; /SjabloonLab staat uit; /Overzicht stuurt de deelnemer door naar Start; Stripe-betalen (consumentendeel) valt buiten het gemeentelijke product en is lokaal niet ingesteld; de inloglink per e-mail en inloggen met Google, Microsoft en LinkedIn zijn lokaal niet ingesteld (op productie wel aanwezig, zie P-S01).

4.4 Willekeurige steekproef

Methode. Populatie: alle routes van de app (src/App.jsx en src/pages.config.js) die niet als eigen scherm in de gestructureerde steekproef staan, plus een onbekende route (404) en twee extra beheertabbladen; 21 adressen, alfabetisch gesorteerd. Omvang: 10% van 41 schermen, naar boven afgerond = 5. Generator: mulberry32 met seed 20261007; per trekking eerst het adres (zonder terugleggen), dan een taal uit de elf en een kleurthema uit de dertien, uit dezelfde reeks. opnieuw draaien geeft dezelfde trekking.

KenmerkSchermPadRol (account)TaalThema
W01Vacatures/Vacaturesdeelnemer (deelnemer)frstandaard
W02Kopersdossier/Kopersdossierplatformbeheerder (beheer)armaart
W03Terugkeer na inloggen via Google/Microsoft/LinkedIn (zonder code)/auth/callbackpubliek (publiek)tistandaard
W04Mijn woorden/MijnWoordendeelnemer (deelnemer)enfebruari
W05Praktijkplek bevestigt MAP-uren (onbekend token)/bevestig/onbekend-tokenpubliek (publiek)rujuni

Vergelijking (WCAG-EM 4.3): de willekeurige steekproef toonde geen nieuwe soorten inhoud, wel twee nieuwe varianten van bekende fouten: in het Arabisch ligt ook in Beheer de zijbalk over de inhoud (W02, zie B-01), en een pagina die alleen in het Nederlands bestaat houdt de taal van de gekozen schermtaal op <html> (W02 lang="ar", W05 lang="ru"; de inhoud zelf staat in een element met lang="nl", zie 3.1.1). Uitbreiding: daarom zijn de Arabische metingen aangevuld met Beheer (W02) en is 3.1.1 apart nagelopen op de Nederlandstalige pagina's.

4.5 Complete processen

Alle processen zijn met alleen het toetsenbord doorlopen; elke stap is vastgelegd met adres, titel, element met focus, statusberichten (aria-live, role=status/alert), foutteksten, aria-invalid en een axe-meting. De ruwe stappen en beelden zijn op aanvraag beschikbaar (bijlage B).

ProcesRolStappen (standaardroute en zijroutes)Uitkomst
P1 Inloggendeelnemer/login → leeg versturen (Enter op Inloggen) → ongeldig e-mailadres → fout wachtwoord → wachtwoord tonen met spatie → juist wachtwoordFormulier volledig met toetsenbord bedienbaar; plakken niet geblokkeerd; autocomplete = email/current-password. Na het versturen verschijnt lokaal een Cloudflare Turnstile-vak ("Ik ben geen robot"); in een geautomatiseerde browser komt de controle niet door, dus de laatste stap (ingelogd) is via de API gedaan, niet via het formulier (zie B-21).
P2 Wachtwoord vergetenpubliek/login → "Wachtwoord vergeten?" (Enter) → leeg versturen → e-mailadres → "Stuur resetlink"Bedienbaar tot en met versturen; daarna wacht "Stuur resetlink" op Turnstile (zelfde als P1), dus er is geen mail verstuurd. De kop blijft "Inloggen" terwijl het formulier een herstelformulier is (zie 2.4.6).
P3 Les volgen tot en met de eindvragendeelnemerLeren → module "Goed beginnen in je nieuwe baan" → les 1 → "Begin de les" → elf vensters met "Verder" → oefeningen (sorteren, volgorde, scenario, meerkeuze) met spatie/Enter beantwoord en "Controleer" → "Les afronden" → module → "Eindvragen" → tien vragen met spatie in de radiogroep → "Inleveren" → uitslagBedienbaar met toetsenbord; focus gaat bij elk venster naar de kop; feedback en uitslag via aria-live. Fouten: focus valt naar <body> na "Controleer" (B-09) en Tab gaat de verborgen zijbalk in (B-02). Om verder te kunnen na een fout antwoord is de oefening in de sessieopslag als goed gemarkeerd (testsnelweg); de overige drie lessen zijn lokaal als afgerond gezaaid zodat de eindvragen konden worden ingeleverd.
P4 Cv-gegevens invullen en pdf makendeelnemerMijn cv's → "Bewerken" → telefoonnummer typen → autosave → ongeldig e-mailadres → "Preview & download" → "Exporteer PDF"Opslaan wordt aangekondigd ("Niet opgeslagen" → "Opslaan…" → "Opgeslagen om 17:48", aria-live=polite). Ongeldig e-mailadres wordt zonder melding opgeslagen. De pdf zelf is niet te maken: DocRaptor is lokaal niet ingesteld (foutmelding via role=status, geen externe aanroep).
P5 MAP-praktijk vastleggendeelnemerMAP → "Praktijk toevoegen" (67× Tab) → leeg opslaan → soort, plek, datum, uren, wat gedaan, onderwerp → "Opslaan"Opslaan is grijs zolang verplichte velden leeg zijn, zonder aanduiding welke (B-13). Na opslaan: melding "Opgeslagen" (role=status), focus naar <body> (B-09).
P6 Groep maken en deelnemer uitnodigenbeheerder gemeenteOrganisatie → tab Groepen → "Nieuwe groep" → naam → "Aanmaken" → Deelnemers → "Uitnodigen" → ongeldig adres → geldig adres → "versturen"Melding "Groep aangemaakt" en "uitnodigingen verstuurd" via role=status; fout "1 regel bevat geen e-mailadres" via role=alert. Focus naar <body> na sluiten (B-09).
P7 MAP-eindoverzicht afdrukkenbegeleiderDeelnemers → tab MAP → "Eindoverzicht" → "Afdrukken of opslaan als pdf"window.print aangeroepen; printweergave zonder zijbalk en knoppen; pdf uit de browser is getagd (/StructTreeRoot, /Lang (nl)).
Tweede stap (beheer)platformbeheerderinloggen → "Stel eerst tweestapsverificatie in" → code uit de app (S09)Veld met autocomplete="one-time-code" en inputmode="numeric"; scherm zonder kop (B-14). Voor de beheermetingen is lokaal een authenticator gekoppeld (TOTP).

De kolom "Uitkomst" beschrijft de eerste meting. In de eindmeting zijn alle processen opnieuw met alleen het toetsenbord doorlopen: de gemelde problemen (focus na sluiten, verplichte velden zonder aanduiding, ongeldig e-mailadres zonder melding, kop van de tweede stap) waren toen opgelost; zie §7. Gebruikte testgegevens: zie bijlage B.

5. Werkwijze en hulpmiddelen

  • Browser en platform: Google Chrome 155.0.8059.39 (headless) op Windows 11 Home (build 26200, ARM64); eerste meting met Chrome 154.0.8037.97.
  • Automatische toets: axe-core 4.14.0 (een implementatie van de W3C ACT-regels), met de tags wcag2a, wcag2aa, wcag21a, wcag21aa en wcag22aa; best-practice apart gerapporteerd.
  • Gescripte metingen per scherm (Chrome DevTools-protocol, Node.js 24.15.0): weergave op 320 CSS-pixels (als venster en als telefoon), tekstafstand volgens de bookmarklet van 1.4.12, 200% zoom en alleen-tekst 200%, een Tab-ronde tot 60 stappen met de zichtbaarheid, het contrast en de bedekking van de focus, toetsenbordvallen, dialogen (openen, Esc, terug naar de opener), doelgrootte, randcontrast van velden en knoppen, autocomplete, live regions, paginatitel, taal van de pagina en van onderdelen, en de toegankelijkheidsboom (rol, naam, toestand).
  • Handmatige beoordeling (met AI-ondersteuning): alt-teksten van alle 70 beelden in de lessen, video en ondertitels beeld voor beeld, koppen en labels, linkdoelen, consistente namen, foutmeldingen en suggesties, contrast van korte tekst die axe overslaat.
  • Testomgeving: een lokale testomgeving met dezelfde code als de onderzochte versie en een lokale database met testaccounts (geen echte personen). Verschil met productie: lesbeelden, audio en video kwamen lokaal uit de projectmap in plaats van uit de online opslag; inloggen met externe diensten, betalen en pdf-productie zijn lokaal niet ingesteld.
  • Rekenregel: een criterium voldoet als het op elk onderzocht scherm voldoet of daar niet van toepassing is. Een fout op één scherm betekent "voldoet niet" voor het hele product.

6. Resultaten per succescriterium

SCCriteriumNiveauIn normOordeelOnderbouwing
1.1.1Niet-tekstuele contentA2.1 + 2.2VoldoetAlle 70 beeldblokken in de 28 lesmodules hebben een alt-tekst (code); steekproefsgewijs naast het beeld gelegd (beroepskansen l1/l4, werknemersvaardigheden l1/l4, werkervaring-2 l1/l2): de tekst beschrijft wat er te zien is en wat ertoe doet (personen, handeling, voorwerpen). Portretten in scenario's alt="" met de naam in de tekst ernaast (decoratief, juist). Geen naamloze knoppen, links of velden in de toegankelijkheidsboom (0 in de 114 metingen met toegankelijkheidsboom: Nederlands, Arabisch, willekeurig). Grafieken in Beheer → Statistieken hebben nu een tabel met de cijfers ("Gegevens als tabel", caption en th). Turnstile: het iframe heeft een titel van Cloudflare; op productie bestaan andere inlogwegen (Google, Microsoft, LinkedIn). Kanttekening (B-23, geen fout): decoratieve lucide-iconen zonder aria-hidden staan nog als naamloze "image" in de boom.
1.2.1Louter geluid / louter videoA2.1 + 2.2VoldoetDe enige louter-geluid-media zijn de voorgelezen lessen ("Luister naar deze les", met AI-label): een media-alternatief voor tekst die op het scherm staat, als zodanig gelabeld. Geen louter-video.
1.2.2Ondertitels (vooraf opgenomen)A2.1 + 2.2VoldoetNa de eindmeting vernieuwd: de uitlegvideo (werkervaring-2, les 2, "De vier delen", nu 85 s) heeft geen ingebrande ondertitels meer, alleen ondertitels via <track kind="captions"> in elf talen, opnieuw gemaakt uit de uitgeschreven tekst en de tijdlijn van de nieuwe stem. Gecontroleerd: elke zin met spraakherkenning teruggezet naar tekst (16 van 16 woord voor woord gelijk), de tijdvakken van de ondertitels bevatten precies hun eigen zin, en in de speler staat op elk gecontroleerd moment de juiste ondertitel; geen muziek of andere relevante geluiden. Eindmeting op de vorige versie: Eén video in het product (werkervaring-2, les 2, "De vier delen", 64 s; S42). Ingebrande ondertitels én <track kind="captions"> in 11 talen. Tijdcodes van de VTT vergeleken met de stiltes in het geluid (ffmpeg silencedetect): synchroon; de tekst is gelijk aan wat er gezegd wordt; geen muziek of andere relevante geluiden. Beoordeeld met de bestanden uit de projectmap (lokaal staat de video niet in de opslag, §9).
1.2.3Audiodescriptie of media-alternatiefA2.1 + 2.2VoldoetNa de eindmeting hersteld (R-01): de uitlegvideo "De vier delen" is opnieuw ingesproken; de stem zegt nu ook wat er in beeld staat (het voorbeeld van Samir: bedrijf, plaats, jaren, de twee zinnen over zijn werk, en de vergelijking "minder goed" en "goed"). De uitgeschreven tekst en de ondertitels in elf talen zijn bijgewerkt. Daarmee zit alle beeldinformatie in het geluid en is aparte audiodescriptie niet nodig. Bij de eindmeting nog niet: de video toont het uitgewerkte voorbeeld van Samir ("Bakkerij Al-Noor · Aleppo (Syrië)", "2014 – 2020", "Bakte elke dag 300 broden.", "Werkte samen met twee collega's.", "Minder goed"/"Goed"); dat staat niet in het geluid en niet in de uitgeschreven tekst onder de video (die is gelijk aan de gesproken tekst). Geen audiodescriptie.
1.2.4Ondertitels (live)AA2.1 + 2.2Niet van toepassingGeen live-media.
1.2.5Audiodescriptie (vooraf opgenomen)AA2.1 + 2.2VoldoetNa de eindmeting hersteld (R-01): de uitlegvideo "De vier delen" is opnieuw ingesproken; de stem zegt nu ook wat er in beeld staat (het voorbeeld van Samir: bedrijf, plaats, jaren, de twee zinnen over zijn werk, en de vergelijking "minder goed" en "goed"). De uitgeschreven tekst en de ondertitels in elf talen zijn bijgewerkt. Daarmee zit alle beeldinformatie in het geluid en is aparte audiodescriptie niet nodig. Bij de eindmeting nog niet: Zelfde video: geen audiodescriptie, en niet alle beeldinformatie zit in het geluid.
1.3.1Info en relatiesA2.1 + 2.2VoldoetOpgelost uit B-14 en B-13: tweede stap met h1 en main; één main in de lesspeler, editor en juridische pagina's; dl's goed opgebouwd; verplichte velden met "(verplicht)" én aria-required; keuzes in "Praktijk toevoegen" in een fieldset met legend; grafiektabellen met th. axe (list, definition-list, dlitem, aria-required-*, label): 0 in alle rondes. Het cv-voorbeeld behoudt de naam als h1, binnen een benoemd gebied ("Voorvertoning van je cv"); de 23 miniaturen op Ontwerp zijn aria-hidden. Over: best-practice heading-order op S52/S53/S70 (een niveau overgeslagen; geen fout). Zonder schermlezer beoordeeld (boom en code).
1.3.2Betekenisvolle volgordeA2.1 + 2.2VoldoetDOM-volgorde = visuele volgorde in het Nederlands (Tab-rondes, 3.520 stappen) en in het Arabisch: de zijbalk staat nu rechts naast de inhoud, niets ligt eronder (20 schermen + W02; ). De lesspeler maakt de achtergrond inert (B-02). Dialogen en vellen staan aan het eind van de DOM maar de achtergrond is dan voor hulptechnologie verborgen. Zonder schermlezer beoordeeld.
1.3.3Zintuiglijke eigenschappenA2.1 + 2.2VoldoetAlle Nederlandse teksten en alle lesteksten doorzocht op plaats, kleur, vorm en geluid ("rechts", "links", "groene", "rode", "hiernaast", "het rondje", "de pijl" …). Gevonden: "hieronder/hierboven" (volgt de leesvolgorde), "in het voorbeeld hiernaast/ernaast" (het voorbeeld heeft een naam), en in les 4 van Beroepskansen "De pijl is doorgaan. Het trapje is …" (beschrijft kaarten die ook in de tekst staan). Geen instructie die alleen op een zintuiglijke eigenschap steunt.
1.3.4WeergavestandAA2.1 + 2.2VoldoetGeen orientation-mediaqueries; Vandaag, Deelnemers en Kaart op 640×360 liggend zonder overloop.
1.3.5Doel van invoer identificerenAA2.1 + 2.2VoldoetOpgelost (B-10): naam name, e-mail email, telefoon tel, woonplaats address-level2, geboortedatum bday, website url in editor en masterprofiel; Contact name/email; inloggen email/current-password; tweede stap one-time-code. Geboorteplaats heeft geen woord in de HTML-lijst en valt dus niet onder 1.3.5.
1.4.1Gebruik van kleurA2.1 + 2.2VoldoetStatussen staan ook als tekst ("account actief", "uitgenodigd", stap op Vandaag); afgeronde MAP-thema's verschillen ook in lichtheid (gevuld groen tegen wit, 3,77:1) en hebben een schermlezertekst ("gedaan"/"nog niet"); gekozen antwoorden in oefeningen zijn gevuld donker (niet alleen een andere tint); fouten staan in tekst met icoon; verplichte velden met "(verplicht)"; grafieken hebben een legenda met tekst en een tabel. axe link-in-text-block: 0.
1.4.2GeluidsbedieningA2.1 + 2.2VoldoetGeen autoplay; video en audio preload="none"; voorlezen pas na een klik.
1.4.3Contrast (minimum)AA2.1 + 2.2VoldoetNa de eindmeting hersteld (R-02): de letters van afgeronde thema's en stappen staan nu wit op emerald-700 (5,5:1, was 3,8:1); in de grafieken van Beheer → Statistieken donkere as- en waardelabels (#64748b en #334155, ≥ 4,7:1). Opnieuw gemeten op S46, S59, S64 en S77s: axe 0. Eerder al: opgelost (B-08): axe color-contrast 0 in alle 155 metingen (drie thema's, Arabisch, 320 px). Tekst op het gekleurde verloop van inloggen/registreren in alle 13 thema's minstens 5,0:1.
1.4.4Herschalen van tekstAA2.1 + 2.2Voldoet200% (venster 640×450 zonder herladen): op geen enkel scherm horizontale overloop of afgekapte tekst. "Alleen tekst 200%" (benadering, wortel op 200%) geeft nog afkapping in inklapvakken; in Chrome bestaat die zoom niet, dus niet als fout geteld (zoals in de eerste meting).
1.4.5Afbeeldingen van tekstAA2.1 + 2.2VoldoetLestekeningen bekeken: geen ingebakken tekst (kaarten met pictogrammen, een landkaart zonder namen). Sjabloonvoorbeelden zijn HTML. Het logo is uitgezonderd. De tekst in de uitlegvideo valt onder 1.2.x.
1.4.10ReflowAA2.1 + 2.2VoldoetOpgelost (B-12): het cv-voorbeeld in het Arabisch is op 320 px 320 px breed. Geen overloop op 320 px in de 114 metingen met de 320-px-controle (venster én telefoon; Nederlands, Arabisch, willekeurig) en in de 13 metingen van de telefoonronde, ook niet op Vandaag met de actiebalk (320/320).
1.4.11Contrast niet-tekstuele contentAA2.1 + 2.2VoldoetNa de eindmeting hersteld (R-03): alle gewone keuzelijsten hebben nu dezelfde rand als de andere velden (#808080, 3,95:1). Opnieuw gemeten op S66 en S80: geen rand onder 3:1. Eerder al: opgelost: randen van tekstvelden, tekstvakken, keuzelijsten (shadcn), schakelaars, keuzerondjes en sleepgrepen ≥ 3:1 (3,78–7,58:1); focusindicator minstens 3,39:1 in alle 68 focusweergaven (standaard 3,39, februari 3,97, maart 3,49).
1.4.12TekstafstandAA2.1 + 2.2VoldoetNa de eindmeting hersteld (R-04): vacaturetitels en namen in Beheer → Organisaties breken af in plaats van af te kappen. Opnieuw gemeten op W01 en S78 met de tekstafstand van de bookmarklet: niets meer afgekapt. Eerder al: opgelost (B-16): accountknop, werkplekkiezer, MAP-kaart, Mijn cv's.
1.4.13Content bij hover of focusAA2.1 + 2.2VoldoetTooltips (samenvatting, omschrijving/prestaties, ATS-uitleg in de galerij) openen bij hover én focus, blijven staan als de muis erop gaat en sluiten met Esc zonder dat de focus verspringt (losse-checks2).
2.1.1ToetsenbordA2.1 + 2.2VoldoetOpgelost (B-18): uitleg bij samenvatting, omschrijving en prestaties is een knop; "Upgrade naar Pro" is een link; "Upload foto" is een knop; de ATS-uitleg in de galerij opent bij toetsenbordfocus. Geen klikbare elementen zonder rol (nepknoppen: 0). Alle processen P1–P7 met alleen het toetsenbord doorlopen; vier oefenvormen met spatie/Enter en "Controleer". Volgorde wijzigen zonder slepen: knoppen omhoog/omlaag. De knoppen in het woordhulp-vel zijn bereikbaar, maar pas na 43 Tab-stappen (zie 2.4.3, R-07).
2.1.2Geen toetsenbordvalA2.1 + 2.2VoldoetIn geen enkele Tab-ronde blijft de focus hangen (datumvelden: 4 stops per veld, daarna verder); Turnstile op /login (4 stops) en /signup heen en terug met Shift+Tab; dialogen houden de focus vast en sluiten met Esc.
2.1.4Enkel-teken-sneltoetsenA2.1 + 2.2VoldoetAlleen sneltoetsen met Ctrl/Cmd (editor, zoekpalet).
2.2.1Timing aanpasbaarA2.1 + 2.2VoldoetGeen tijdslimieten in de app; meldingen pauzeren bij hover/focus; supabase/config.toml zet geen timebox/inactivity_timeout. Na een verlopen sessie meldt de app "Je bent uitgelogd … wat al was opgeslagen, staat er nog" en de editor slaat automatisch op. De instelling op productie is niet bekeken (beperking).
2.2.2Pauzeren, stoppen, verbergenA2.1 + 2.2VoldoetOpgelost (B-20): "Hallo stilzetten" op de eerste start (S10, Tab-stop vóór "Begin"). Tips op het inlogscherm wisselen elke 8 s en staan stil met "Tips stilzetten" (gemeten: na 9,5 s gepauzeerd dezelfde tip).
2.3.1Drie flitsenA2.1 + 2.2VoldoetGeen flitsende inhoud; de uitlegvideo bestaat uit rustige overgangen tussen dia's (beelden om de 4 s bekeken).
2.4.1Blokken omzeilenA2.1 + 2.2VoldoetLandmarks op elk scherm (nav met naam, main, header), nu ook in editor, juridische pagina's, Helpcentrum en Contact; koppen. Geen skiplink (niet vereist).
2.4.2PaginatitelA2.1 + 2.2VoldoetOpgelost (B-03): elk scherm een eigen titel ("Cv bewerken · maakeencv.nl", "Kaart van een deelnemer · …", "Statistieken – Beheer · …", in de lesspeler de naam van de les), ook in ar, fr, en, ti, ru ("تسجيل الدخول · maakeencv.nl", "Offres d'emploi · …"). Tabbladen binnen één pagina (Deelnemers, Organisatie, Overzicht) delen de paginatitel; Beheer zet de tab in de titel.
2.4.3FocusvolgordeA2.1 + 2.2VoldoetNa de eindmeting hersteld (R-07): het woordhulp-vel zet bij openen de focus in het vel, Tab blijft in het vel, en na Esc staat de focus weer op het woord. Opnieuw gemeten in de cv-editor (S13). Eerder al: opgelost (B-02, B-09): 0 Tab-stappen buiten de lesspeler (S24–S43, S35v–S41v); bij elk lesvenster focus op de kop; na "Controleer" focus op "Opnieuw proberen"/de volgende knop; 19 van de 20 met het toetsenbord geopende dialogen/menu's/keuzelijsten houden de focus vast en geven hem bij Esc terug aan hun opener (ook Praktijk toevoegen, Bewijsstuk, Werkervaring, Uitnodigen, Afmelden, Afspraak, Nieuwe groep); na opslaan in P5/P6 focus op de opener.
2.4.4Linkdoel (in context)A2.1 + 2.2VoldoetInventaris van alle links op 88 schermen (alle S-schermen behalve S09, plus S35v–S41v en S77s; ): geen vage linknamen ("hier", "lees meer", "bekijk") zonder context; herhaalde links met hetzelfde woord en een ander doel ("Eindoverzicht" op S59/S72) staan in een rij met de naam van de deelnemer; "Bekijken : CV Elektricien" op Start draagt de naam van het cv; externe links tonen hun domein (bv. "www.autoriteitpersoonsgegevens.nl"). Grensgeval: op Mijn cv's (S12) heten de links "Bekijken" en "Bewerken" zonder de naam van het cv, en de naam staat ná de links (geen programmatisch bepaalde context); in de geteste toestand met één cv is het doel eenduidig, met meer cv's niet. Advies A-8.
2.4.5Meerdere manierenAA2.1 + 2.2VoldoetMenu, overzicht op Start/Vandaag, zoekpalet (Ctrl+K) voor begeleiders en beheer; juridische pagina's vanaf registreren en uit elkaar.
2.4.6Koppen en labelsAA2.1 + 2.2VoldoetAlle koppen en veldlabels nagelopen (inventaris per scherm): ze beschrijven het onderwerp ("Wat ik wil", "De acht thema's …", "Voorbereiding op het eerste gesprek", "Stel eerst tweestapsverificatie in"); geen lege koppen of labels; de lesspeler koppelt "Stap 4 van 11" (positie) aan de naam van de les in de dialoognaam en titel, met per blok een h2 over het onderwerp. Grensgeval: het formulier "Wachtwoord vergeten" staat onder de kop "Inloggen" (de kop van de pagina), met direct eronder "Vul je e-mailadres in; we sturen je een link om een nieuw wachtwoord in te stellen." en de knop "Stuur resetlink"; als voldoet beoordeeld, met advies A-1.
2.4.7Focus zichtbaarAA2.1 + 2.2VoldoetOpgelost (B-04, B-01, B-02, B-06): elke Tab-stap heeft een zichtbare indicator; contrast minstens 3,39:1 (standaard), 3,97:1 (februari), 3,49:1 (maart) over 2.537 Tab-stappen ná de overgang; witte ring op het gekleurde inlogvlak 5,9–8,5:1; sjabloonkaarten met ring om de kaart; datumvelden met ring en gemarkeerd segment, kalenderknop met de omlijning van de browser.
2.4.11Focus niet bedekt (minimum)AA2.2VoldoetOpgelost (B-01, B-02, B-06): 0 volledig bedekte focusstappen in alle 155 batterijmetingen en 68 focusweergaven, ook op 320 px met de onderbalk en de actiebalk van Vandaag, met Shift+Tab onder de plakkende kop, in de cv-editor en in het Arabisch. (Achter het woordhulp-vel kan de focus op 320 px onder het vel liggen; de gebruiker heeft dat vel zelf geopend en sluit het met Esc zonder de focus te verplaatsen, en dat telt volgens noot 2 bij 2.4.11 niet als bedekt. Het probleem valt onder 2.4.3, R-07.)
2.5.1AanwijzergebarenA2.1 + 2.2VoldoetGeen veeg- of padgebaren nodig.
2.5.2AanwijzerannuleringA2.1 + 2.2VoldoetKnoppen reageren op click; menu's openen bij pointerdown en zijn met Esc te sluiten.
2.5.3Label in naamA2.1 + 2.2VoldoetOpgelost (B-07): axe label-content-name-mismatch 0 in alle 155 metingen; taalknop "NL, taal kiezen", taalhulp "AR – Laat zien in العربية", opmaakbalk "Utrecht, Sjabloon", stopknop "Stoppen. Terug naar overzicht".
2.5.4BewegingsactiveringA2.1 + 2.2Niet van toepassingGeen devicemotion/deviceorientation.
2.5.7SleepbewegingenAA2.2VoldoetOpgelost (B-17): "… omhoog/omlaag" bij cv-onderdelen (32×32) en secties (28×28), met melding "Verplaatst. Nu op plek 2 van 3."
2.5.8Grootte aanwijsgebied (minimum)AA2.2VoldoetOpgelost (B-15): woordhulp 24 px hoog, sluitknop vertaalmelding 24×24, selectievakjes klikvlak 26×26. Overgebleven meldingen van de meetfunctie: "CompetentNL"/"CC BY 4.0" (in een zin, uitzondering "inline") en elementen die op 320 px net onder een vaste balk schuiven (stand van het scrollen, geen vaste afstand).
3.1.1Taal van de paginaA2.1 + 2.2Voldoet<html lang> en dir volgen de schermtaal (nl, ar/rtl, fr, en, ti, ru gemeten). Pagina's die alleen in het Nederlands bestaan (W05 Praktijk bevestigen, W02 Kopersdossier, juridische teksten) zetten de inhoud in een element met lang="nl" (bv. <main lang="nl">); daarmee is de taal van alle inhoud bepaalbaar. Alleen de tabtitel valt onder de taal van <html>; advies A-4.
3.1.2Taal van onderdelenAA2.1 + 2.2VoldoetNa de eindmeting hersteld (R-05): het blok "Nieuws en acties" in Instellingen, de namen van vaardigheden uit de landelijke lijst en de vacaturegegevens hebben lang="nl". Opnieuw gemeten in het Arabisch op S50 en S51: alleen de naam van de organisatie (een eigennaam) en een vaardigheid die de deelnemer zelf intypte staan nog zonder taal; de taal van eigen invoer is de app niet bekend. Eerder al: opgelost (B-19): Privacy, Voorwaarden, Cookies, intake-samenvatting; taalmenu met lang per taal en aria-current; hulptaal in lessen en eindvragen met eigen lang.
3.2.1Bij focusA2.1 + 2.2VoldoetIn alle Tab-rondes geen contextwissel door focus; de ATS-uitleg die bij focus verschijnt is een tooltip (geen contextwissel).
3.2.2Bij inputA2.1 + 2.2VoldoetTaalkeuze via een menu; keuzelijsten veranderen inhoud, geen context; geen formulier verstuurt zichzelf.
3.2.3Consistente navigatieAA2.1 + 2.2VoldoetMenu per werkplek op elk scherm in dezelfde volgorde (deelnemer, begeleider, beheer), ook in het Arabisch.
3.2.4Consistente identificatieAA2.1 + 2.2VoldoetKnopnamen per icoon en per werkwoord vergeleken over alle schermen: zelfde functie, zelfde naam ("Opslaan", "Sluiten", "Uitnodigen", "Afdrukken of opslaan als pdf", "NL, taal kiezen", "Tips stilzetten", "Stoppen. …"); het icoon met het streepje heeft per functie een eigen naam ("… afmelden" voor deelnemers, "… loskoppelen" in Beheer, "… verwijderen" in Team): andere functies, geen strijdigheid.
3.2.6Consistente hulpA2.2Voldoet"Hulp" onderaan in de zijbalk op elk ingelogd scherm.
3.3.1FoutidentificatieA2.1 + 2.2VoldoetLege en foute invoer in P1, P2, P4, P5, P6, P6b: melding in tekst bij het veld, aria-invalid, aria-describedby, focus naar het eerste foute veld ("Kies wat het was.", "Geef de groep een naam …", "Plak of typ minstens één e-mailadres …", "Dit lijkt geen goed e-mailadres …"). Inloggen/registreren gebruiken de browsermelding. (Buiten de geteste toestand: N-02.)
3.3.2Labels of instructiesA2.1 + 2.2VoldoetOpgelost (B-13): verplichte velden tonen "(verplicht)" en hebben aria-required; de opslaanknop blijft bedienbaar en zegt wat er ontbreekt; geen veld zonder zichtbaar label.
3.3.3FoutsuggestieAA2.1 + 2.2VoldoetMeldingen met een suggestie of voorbeeld: "Schrijf hoeveel uur het was, bijvoorbeeld 8 of 2,5.", "… bijvoorbeeld "Voorjaar Tilburg".", "… bijvoorbeeld jan.dekker@voorbeeld.nl", "Een e-mailadres ziet er zo uit: naam@voorbeeld.nl", "Kies een wachtwoord van minstens 8 tekens."; bij een fout wachtwoord bewust geen suggestie ("Onjuist e-mailadres of wachtwoord.", veiligheid). De browsermeldingen geven ook een suggestie ("@ ontbreekt").
3.3.4Foutpreventie (juridisch, financieel, gegevens)AA2.1 + 2.2VoldoetAccount verwijderen pas na het typen van "VERWIJDER"; deelnemer afmelden met bevestiging; eindvragen opnieuw te maken. Betalen (Stripe) valt buiten de steekproef.
3.3.7Overbodige invoerA2.2VoldoetGeen gegevens twee keer gevraagd in de processen; het cv haalt gegevens uit het masterprofiel.
3.3.8Toegankelijke authenticatie (minimum)AA2.2VoldoetGeen cognitieve test in de eigen code; plakken niet geblokkeerd; autocomplete op e-mail, wachtwoord en code; wachtwoord tonen met spatie. Turnstile toont hooguit een vakje "Ik ben geen robot" (geen puzzel) en is met Tab bereikbaar. Kanttekening B-21 blijft (zie §6).
4.1.1ParsenA2.1VoldoetVolgens de noot in WCAG 2.1 altijd voldaan voor HTML; gevolgen van foute code staan bij 1.3.1 en 4.1.2.
4.1.2Naam, rol, waardeA2.1 + 2.2VoldoetNa de eindmeting hersteld (R-06): de taartgrafieken in Beheer → Statistieken zijn niet meer focusbaar (rootTabIndex -1, en inert op het verborgen grafiekvak). Opnieuw gemeten op S77s: axe 0, ook geen aria-hidden-focus. Het woordhulp-vel (R-07) is hersteld, zie 2.4.3. Eerder al: opgelost (B-11, B-02): geen naamloze knoppen, keuzelijsten, schuifregelaars of voortgangsbalken (axe en boom: 0); schuifregelaars met naam en waardetekst ("32 pt"); voortgangsbalken met waarde; de lesspeler is nu echt modaal .
4.1.3StatusberichtenAA2.1 + 2.2Voldoet"Opgeslagen", "Groep aangemaakt", "0 uitnodigingen verstuurd …", "Verplaatst. Nu op plek 2 van 3.", autosave ("Niet opgeslagen" → "Opslaan…" → "Opgeslagen om 21:37"), feedback bij oefeningen en de uitslag van de eindvragen via role=status/aria-live; foutmeldingen bij invoer via role=alert of gekoppeld aan het veld. Vaste mededelingen hebben geen role=alert meer (B-22). Zonder schermlezer beoordeeld.

7. Bevindingen en herstel

De eerste meting vond 23 bevindingen (B-01 tot en met B-23); de eindmeting vond daarna nog 7 afwijkingen (R-01 tot en met R-07), waarvan 4 die al in de gegevens van de eerste meting zaten maar toen niet waren gemeld, en 1 die door het herstel was ontstaan (een grafiek die focusbaar was binnen een voor hulptechnologie verborgen gebied). Alle zijn hersteld en opnieuw gemeten.

KenmerkCriteriumWat er mis wasStatus
B-012.4.11, 2.4.7In het Arabisch, Farsi en Dari lag het menu over de inhoudHersteld
B-022.4.3, 2.4.7, 4.1.2Focus kon achter de lesspeler verdwijnenHersteld
B-032.4.2Elk scherm had dezelfde titelHersteld
B-042.4.7, 1.4.11Focusring te licht (1,8–2,0:1)Hersteld (nu ≥ 3,39:1 in alle thema's)
B-051.4.11Randen van invoervelden te lichtHersteld (zie ook R-03)
B-062.4.11Mobiele onderbalk bedekte de focusHersteld
B-072.5.3Taalknoppen met een naam die niet begon met de zichtbare tekstHersteld
B-081.4.3Te lichte grijze tekstHersteld (zie ook R-02)
B-092.4.3Focus op de pagina na het sluiten van een vensterHersteld
B-101.3.5Geen autocomplete op eigen gegevensHersteld
B-114.1.2Knoppen, keuzelijsten en schuifregelaars zonder naamHersteld
B-121.4.10Cv-voorbeeld te breed in het Arabisch op 320 pxHersteld
B-133.3.2, 3.3.1Verplichte velden niet aangegeven, geen foutmeldingHersteld
B-141.3.1Koppen en landmarksHersteld
B-152.5.8Te kleine klikvlakkenHersteld
B-161.4.12Tekst afgekapt bij grotere tekstafstandHersteld (zie ook R-04)
B-172.5.7Volgorde alleen met slepenHersteld (knoppen omhoog en omlaag)
B-182.1.1Uitleg alleen met de muisHersteld
B-193.1.2Nederlandse tekst zonder taalaanduidingHersteld (zie ook R-05)
B-202.2.2Wisselende "Hallo" zonder pauzeHersteld
B-21—Cloudflare Turnstile (inlogcontrole)Geen fout; zie §8
B-224.1.3Vaste mededelingen als waarschuwing voorgelezenHersteld
B-23—Decoratieve iconen zonder aria-hiddenGeen fout; advies in §10
R-011.2.3, 1.2.5Uitlegvideo: beeldinformatie niet in het geluidHersteld (nieuwe stem en ondertitels)
R-021.4.3Witte letters op groen; tekst in grafiekenHersteld
R-031.4.11Drie keuzelijsten met een te lichte randHersteld
R-041.4.12Vacaturetitels en namen afgekapt bij tekstafstandHersteld
R-053.1.2Nederlandse blokken zonder lang="nl" in een andere taalHersteld
R-064.1.2Focusbare grafiek in een verborgen gebied (door het herstel ontstaan)Hersteld
R-072.4.3Focus ging niet in het woordhulp-velHersteld

8. Vergelijking met de willekeurige steekproef en kanttekeningen

De willekeurige steekproef (§4.4) toonde geen nieuwe soorten inhoud, wel twee varianten van bekende fouten (de zijbalk in het Arabisch ook in Beheer, en de taal op pagina's die alleen in het Nederlands bestaan). Die zijn meegenomen in het herstel en in de eindmeting.

Kanttekeningen die geen afwijking zijn en niet in de score tellen:

  • Cloudflare Turnstile controleert op de inlogschermen of er een mens inlogt. Voor gewone gebruikers is die onzichtbaar; een geautomatiseerde browser kreeg wel een uitdaging. De uitdaging is met het toetsenbord bereikbaar en heeft geen toetsenbordval. Hoe Cloudflare reageert op mensen met hulptechnologie of strikte privacy-instellingen, is niet gemeten; daarom staat het in het verbeterplan.
  • Eigen invoer van gebruikers (bijvoorbeeld een vaardigheid die iemand zelf intypt) krijgt geen taalaanduiding, omdat de app de taal ervan niet kent.
  • Decoratieve iconen hebben niet allemaal aria-hidden; ze hebben geen naam en geen rol en worden door gangbare schermlezers overgeslagen.

9. Beperkingen van dit onderzoek

  • Geen echte schermlezer en geen spraakbediening. NVDA, JAWS, VoiceOver, TalkBack en Voice Access zijn niet gebruikt. Namen, rollen, toestanden, live regions, aria-modal/inert, leesvolgorde en uitspraak per taal zijn beoordeeld via de toegankelijkheidsboom van Chrome, attributen en code. Wat een schermlezer werkelijk voorleest (bv. bij het woordhulp-vel, de lesspeler en de statusberichten) is niet gehoord. Zie de criteria 1.3.1, 1.3.2, 4.1.2, 4.1.3, 3.1.2 en 2.5.3.
  • Eén browser, één platform. Alleen Chrome 155.0.8059.39 headless op Windows 11 ARM64, via het DevTools-protocol met gesimuleerde toets- en muisgebeurtenissen. Niet getest: Firefox (echte alleen-tekst-zoom, 1.4.4), Safari/iOS, Android, een echt mobiel toestel, Windows Hoog contrast/forced-colors. Het gedrag van de focus bij verdwijnende knoppen verschilt per browser.
  • Turnstile (B-21): de controle laat een geautomatiseerde browser niet door; inloggen via het formulier is daardoor niet tot het einde gedaan (ingelogd is via de API). Wat Cloudflare echte gebruikers met hulptechnologie of strikte privacy-instellingen toont, is niet gemeten.
  • Pdf niet getoetst. DocRaptor is lokaal niet ingesteld; de cv-pdf (kernproduct) is niet onderzocht (advies: een productie-pdf toetsen met PAC). Wel: de afdrukweergave van het MAP-eindoverzicht; Chrome maakt er een getagde pdf van (met structuur en taal).
  • Inloggen met Google, Microsoft, LinkedIn en de inloglink, betalen (Stripe) en de e-mails (uitnodiging, herstel) vallen buiten deze meting; ze zijn lokaal niet ingesteld.
  • Talen en thema's: gemeten zijn nl (alles), ar (20 schermen + W02), en via de willekeurige steekproef fr, en, ti, ru; thema's standaard, februari en maart volledig, juni (W05) en de 13 thema's alleen voor het inlogvlak. Fa en prs delen de rtl-opmaak met ar (niet apart gemeten). Vertalingen zijn niet door moedertaalsprekers beoordeeld.
  • Lokale verschillen met productie: de lokale opslag (bucket leren-media) is leeg: lesbeelden, het portret van de gids, de video en de voorgelezen lessen geven lokaal "Object not found" (de spelers en <track> staan er wel). Beelden, video, ondertitels en uitgeschreven tekst zijn daarom beoordeeld vanuit de projectmap en de lesmodules in de code (de bestanden die naar de opslag worden geüpload; de kopie op productie is niet vergeleken). De sessie-instelling van Supabase op productie is niet bekeken (2.2.1). Het cv-voorbeeld en de sjablonen (kleur door de gebruiker gekozen) zijn niet apart op contrast beoordeeld.
  • Tab-rondes van de batterij beginnen waar de pagina de startplek voor de focus legt en stoppen bij <body>; in de cv-editor viel de kop (terugknop, Preview, tabs) daardoor buiten de ronde (in de eerste meting ook). De focusmeting ná de overgang heeft die kop wel gemeten (editor op 1280 en 320 px, vooruit en met Shift+Tab).
  • Inhoudelijk oordeel (alt-teksten, koppen, instructies, ondertitels) is gegeven door de onderzoeker (AI-assistent) en niet door een tweede mens of door gebruikers met een beperking; WCAG-EM 2.0 beveelt dat laatste sterk aan.
  • Steekproef: een steekproef levert geen conformiteitsclaim voor het hele product (WCAG-EM). De uitkomst geldt voor commit 5c3c000 (volledige meting) en bc14c97 (gerichte hermeting van de herstelde onderdelen), in deze lokale configuratie, op 7 oktober 2026.
  • Eerste meting op S35–S41: die mat les 1, venster 10 in plaats van het genoemde blok (§4.3). De bevindingen van de eerste meting op die kenmerken gelden dus voor dat venster; de eindmeting heeft de bedoelde blokken alsnog gemeten (S35v–S41v).

10. Verbeterplan

#WatWaaromWanneer (voorstel)
1Test met een echte schermlezer (NVDA, VoiceOver, TalkBack) en spraakbediening, door een ervaringsdeskundige, op de processen uit §4.5Grootste beperking van dit onderzoekvóór 1 december 2026
2Pdf's van cv en sollicitatiebrief toetsen met PAC 2024 (en de tags verbeteren waar nodig)Niet in dit onderzoekvóór 1 december 2026
3Testen in Firefox, Safari en op echte telefoons (iOS en Android), en met Windows Hoog contrastAlleen Chrome getestvóór 1 december 2026
4Inloggen met Google, Microsoft, LinkedIn en de inloglink, en de e-mails van de app toetsenNiet in dit onderzoekvóór 1 december 2026
5Cloudflare Turnstile volgen: meldingen van gebruikers over de inlogcontrole verzamelen; zo nodig een andere controleNiet volledig te metendoorlopend
6Decoratieve iconen standaard aria-hidden (lucide-react bijwerken) en de adviezen uit de eindmeting (focus na "Wachtwoord vergeten", één link in plaats van link-met-knop)Kwaliteit, geen afwijkingvóór 1 januari 2027
7Vertalingen laten nalezen door moedertaalsprekersBegrijpelijkheid in elf talendoorlopend
8Onafhankelijke toets door een gespecialiseerd bureauAdvies VNG ("waar mogelijk onafhankelijk")eerste kwartaal 2027
9Hertest bij elke grote wijziging van de app, en ten minste jaarlijks een bijgewerkt rapportRapport mag maximaal 3 jaar oud zijn; verklaring jaarlijks bijwerkenjaarlijks, uiterlijk oktober 2027

Bijlagen

  • A. Export voor het W3C WCAG-EM Report Tool (JSON-LD), met de oordelen per criterium: WCAG 2.1 en WCAG 2.2. Open het bestand in het Report Tool met "Open evaluation".
  • B. Meetgegevens per scherm (axe-core en gescripte metingen) en schermafbeeldingen van de bevindingen; op aanvraag bij SMITO B.V.

SMITO B.V., Hoge Zand 39, 2512 EL Den Haag. Vragen over dit rapport of over de toegankelijkheid van maakeencv: support@maakeencv.nl.

Aan de slag met je cv

Vul je gegevens één keer in, kies een template en download je cv als pdf. Gratis beginnen, geen betaalgegevens nodig.