Hallo Jamal! Welkom bij een speciale podcast-update over je Appel 2.0 cross-check examen. Ik ga je door het nieuwste technische rapport leiden, maar dan wel in klare taal, zodat je precies weet hoe je app ervoor staat. Dit examen is een grondige controle geweest, uitgevoerd met geautomatiseerde tools die de app nabootsen in verschillende schermformaten, en ook met handmatige vergelijkingen. We hebben ons gefocust op de ‘test-leerling’ en Dani’s gegevens zijn onaangeroerd gebleven – precies zoals we wilden. Alle live bestanden zijn vergeleken met lokale kopieën en zijn identiek, en je lokale test-suite staat strak op 55 van de 55 groene vinkjes. Dat is alvast een hele geruststelling!
Laten we beginnen met de voordeur, zeg maar de homepage van de app. We hebben deze getest in vier verschillende staten en op twee schermformaten. Goed nieuws: er waren geen consolefouten, geen horizontale scrollbalken die je layout verpesten, en ook geen afgeknipte teksten. De voorleestekst is overal netjes gevuld en zonder gekke woorden. Dit is een sterke basis.
Maar, er is wel een belangrijk aandachtspunt. Stel je voor dat je op de voordeur vier taken afvinkt, terwijl er in totaal acht verborgen items wachten. De app zegt dan vrolijk: "Alles af. Jij bent vrij, ik ook. 😎" Dit kan natuurlijk verwarrend zijn, want je bent nog niet klaar! Dit is iets waar we echt naar moeten kijken. Daarnaast viel op dat sommige klikgebieden, zoals de vinkjes of de knop ‘de planning’, kleiner zijn dan ideaal. Ook zagen we een kleine afwijking in het tijdstip van het eerste thuiskomstbericht en ontbrak de dagstart-speler op 9 september, wat overigens wel verwacht werd gezien de instellingen.
Vervolgens hebben we een 'waarheids-check' gedaan op de content van de thuiskomstberichten, zoals die van 8 september. We hebben Duits, Geschiedenis, Wiskunde en Engels gecheckt. Het goede nieuws is dat de teksten over het algemeen perfect overeenkomen met de onderliggende data. Titels, kernpunten, huiswerkopdrachten – alles klopt zoals het zou moeten. We hebben zelfs gecontroleerd of de app niet ten onrechte de tekst "geen huiswerk" toonde. Wat wel een detail is, is dat in de data soms letterlijk staat "Er is geen huiswerk", terwijl de voorleestekst het verwoordt als "In de les hoorde ik geen huiswerk". Een kleine nuance, maar wel een verschil.
Het afvinken van taken, een belangrijke functie, werkt uitstekend voor de test-leerling. Met een klik, of zelfs met de enter- of spatiebalk, verandert de status netjes naar ‘gedaan’, de teller past zich aan en de voortgangsbalk schuift op. De server registreert dit correct. En zoals gezegd, Dani’s teller bleef onaangeroerd, wat essentieel is. Een klein aandachtspunt: de "Straks"-knop onthoudt je keuze niet na een herlading, en de focus van het toetsenbord gaat verloren na het afvinken. Dit is niet kritisch, maar wel iets om te noteren.
Alle links in de app, dat zijn er maar liefst 35, zijn gecontroleerd en functioneren perfect. Geen 404-fouten, geen ongewenste redirects. Ook links naar de oude Appel-app of relatieve links binnen de nieuwe app werken zoals verwacht. Zelfs de mp3’s voor de audiofragmenten en de avatar-afbeeldingen laden allemaal zonder problemen. Echt top!
Door naar de toetspagina, `toets.html`. De bubbels die aangeven hoeveel je al kent en de tellers kloppen overal. De voorleestekst is weer prima gevuld en er is geen horizontale scroll. Er is echter wel een middelgrote bug bij het vak Frans: het aantal vragen dat in de oefentoets wordt genoemd, klopt niet helemaal, en de link daarheen leidt niet naar alle genoemde onderdelen. Verder viel op dat de links voor 'Toets-Mij-toetsen' soms naar een algemene lijst leiden als de specifieke toets nog niet bestaat. En een melding over nieuwe Toets-Mij-toetsen is nu nog hardcoded met een specifieke datum.
Op de lespagina, `les.html`, en het algemene lessenoverzicht (`lessen.html`), zagen we ook een aantal belangrijke punten. De lespagina's zelf zien er goed uit: vak, titel, tijd, docent, en de audiobestanden werken naar behoren. De inhoud van de lessen, zoals huiswerk en mededelingen, klopt ook. Maar hier is een **belangrijke bug**: wanneer een test-leerling huiswerk afvinkt op de lespagina, wordt dit **altijd toegeschreven aan Dani's account** in plaats van aan de test-leerling. Dit betekent dat je Dani's data onbedoeld beïnvloedt. Ook op kleinere schermen kan het tijdlabel soms net buiten de bubbel vallen, waardoor een minimale horizontale scroll ontstaat. Het algemene lessenoverzicht `lessen.html` functioneert verder perfect, met correcte tijden, docenten en huiswerkoverzichten per dag.
Wat betreft de voorlezen-knop: deze is op de homepage, toets- en lespagina’s aanwezig en werkt. De tekst is correct gevuld. Een aandachtspunt is wel dat de voorleestekst op de homepage wordt afgekapt na 1800 tekens. Met veel lessen kan dit betekenen dat de tekst midden in een zin stopt, wat niet prettig is.
We hebben ook diverse 'randgevallen' uit de code getest. Denk aan lege lessen-bestanden (wat netjes de melding "nog geen les binnen" oplevert), of situaties met twee lessen van hetzelfde vak op één dag (wat kan leiden tot een dubbel bericht). Het huiswerk vervalt trouwens nooit automatisch in de app; het blijft staan tot je het afvinkt. Kleine details, maar het is goed dat hierover nagedacht is.
Tot slot hebben we even gekeken naar de oude oefentoetsen-pagina van Appel, die werkt zonder consolefouten. En de toegankelijkheid: de kleinste lettertypes zijn 11-13 pixels, en de contrastratio’s zijn over het algemeen goed genoeg voor de toegankelijkheidsrichtlijnen. De aria-labels voor de vinkjes zijn correct geïmplementeerd, al zou de voorleesknop nog een extra aria-label kunnen gebruiken voor een nog betere toegankelijkheid.
Dus Jamal, samenvattend: je Appel 2.0 staat er technisch gezien erg goed voor. Veel zaken zijn geslaagd en de app is stabiel. De belangrijkste punten die nu aandacht vragen, zijn die misleidende "Alles af"-melding op de voordeur, het cruciale probleem met afvinken op de lespagina dat Dani's account raakt, en de inconsistenties bij de Franse oefentoets. Daar zit de focus voor de volgende stappen. Maar over het geheel genomen ben je heel goed bezig! Dit was je Appel 2.0 podcast update.
Gemeten met Playwright-MCP (headless), viewports 430x932 en 375x812, plus curl.
Alleen leerling=test aangeraakt; Dani's teller vóór en ná: 15 items (ongewijzigd). Test-leerling ná afloop leeg ({"items": {}}).
Live bestanden = lokale kopieën (md5 gelijk voor index/toets/les/lessen.html, appel2-data.js, appel2.css, alle live/*.json). Lokale test-suite: 55/55 groen.
Screenshots: exam-*.png in deze map (16 stuks; -klein = verkleind).
| stand | modus | .msg | console | scrollWidth 430/375 | buiten beeld | afgekapt |
|---|---|---|---|---|---|---|
| echte tijd (wo 9-9 00:05) | ochtend, doel 9-9 | 3 | 0 | 430 / 375 | 0 | 0 |
| 8-9 16:00 thuiskomst | thuiskomst, doel 9-9 | 7 | 0 | 430 / 375 | 0 | 0 |
| 9-9 07:30 ochtend | ochtend, doel 9-9 | 3 | 0 | 430 / 375 | 0 | 0 |
| 23-9 07:30 toetsdag | ochtend, doel 23-9 | 4 | 0 | 430 / 375 | 0 | 0 |
__appel2Ctx.tekst gevuld (1363 tekens thuiskomst), geen "undefined/null/[object".exam-1-echt-430.png). Oorzaak: de 4 getoonde items zijn af, de 4 verborgen ("… en nog 4") niet. Zie bug 1..vink 32x32 (index) en 30x30 (toets/les), "📷 foto (niet verplicht)" 151x17, "de planning" 72x17, .pil-knoppen 36 hoog, "‹ Vandaag" 67x20, "▶ start blok 1 nu" 111x17. Ja-knop 158x80, Straks 136x80 (Ja-knop wikkelt op 2 regels bij 375).lv[0].van).planner-wiskunde-w37-0 ✓.{} ✓.links.txt).planning.html ("de planning", "📅 hele week →"), index-oud-20260819.html?spar=… ("Ja, samen doen ▶" bij huiswerk-item), sparren.html ("🎙️ Sparren met Appel"), / ("📚"). Vanaf toets.html/les.html: sparren.html ("🎙️ Sparren"). feed.html (proefje) staat nog live met dezelfde links.huiswerk-foto.html, duits.html#apprkaart, leren.html?vak=…, oefentoetsen.html) lossen op naar appel2.haartips.nl → 200.| toets | bubbel "jij kent" | teller stap 1 | blokken | bewijs | console |
|---|---|---|---|---|---|
| wiskunde 23-9 | 0 van 3 | 0 van 3 | 0/3 komt | eerlijk "Nog geen officiële toets" | 0 |
| engels 24-9 | 0 van 2 | 0 van 2 | 0/3 | eerlijk "nog geen" | 0 |
| duits 25-9 | 0 van 6 | 0 van 6 | 0/4 | Kapitel 1 - Ich, 14 vragen, "2 van 4 zit erin" bij vnw+sein (pogingen test: vraag 5 en 6 reeks 4) ✓; los 10-14 ✓ | 0 |
| frans 30-9 | 0 van 3 | 0 van 3 | 0/3 | Voyages A (9) + Voyages B (12) | 0 |
| nederlands 30-9 | 0 van 4 | 0 van 4 | 0/4 | eerlijk "nog geen" | 0 |
oefentoetsen.html?set=havo2-toetsmij&vak=wiskunde|engels|nederlands|frans|duits. Voor wiskunde/engels/nederlands bestaat er geen Toets-Mij-toets: de pagina toont dan stilzwijgend de algemene lijst (gemeten via iframe). Zelfde knop op de toetsdag-kaart (index r.146).<audio preload=none> met werkende mp3 (200 audio/mpeg) ✓, __appelLes klopt (geschiedenis huiswerk 2, podcast 169 s, kern 8, mededelingen 3).?leerling= — POST en GET gaan altijd naar leerling:'dani' (les.html r.27 en r.117). Testen raakt dus Dani's teller..tijd nowrap, appel2.css r.131) steekt tot 377px → scrollWidth 377, horizontale scroll van 2px, label valt buiten de bubbel (duits, engels; geschiedenis 375 maar .wie sw 297 > cw 279). Bron: les.html r.42 datum_lang + tot.#voorlezen aanwezig (40x40); toets.html en les.html: "🔊 Voorlezen" in de voet. Tekst gevuld, geen undefined/null/[object. Niet geklikt.doelDag/iso() rekenen lokaal (setHours) → correct om 00:05 (gemeten: ochtend voor 9-9). Maar weekReeks (index r.51) vergelijkt AF[k].slice(0,10) = UTC-timestamp (server "+00:00", client toISOString) met lokale datum → een vinkje tussen 00:00 en 02:00 lokaal telt voor de vorige dag; les--ids tellen nooit mee (regex ^(tp-|planner-|hw-)).f() → null → lessenVanDag → [] → bericht "Van vandaag heb ik nog geen les binnen" ✓..filter(Boolean) → geen bericht, intro noemt alleen geladen lessen ✓. Twee lessen van hetzelfde vak op één dag (rooster 10-9: 2× Gym): index r.205-209 laadt hetzelfde bestand twee keer → dubbel bericht; podS[vak] overschreven. Niet gemeten, uit de code.komendeToetsen filtert dagen >= 0 (appel2-data.js r.44) → 's avonds na de toets nog "Eerstvolgende toets: Wiskunde · vandaag" met route-link.items.slice(0,4); verborgen items niet afvinkbaar op de voordeur; afCount/totaal tellen alles → bug 1 ("Alles af" bij 4 van 8) en voorleestekst "8 dingen" gevolgd door 4 genoemde.docentNaam("Tara van Ruijven") → "Tara van Ruijven zei:" (voor- én achternaam; regel zegt achternaam). "D.N. Zuiderwijk" → "Zuiderwijk" ✓, leeg → "de docent" ✓.deadline <= doel.datum (r.84) → blijft na de deadline staan tot afgevinkt.v2/img/appel-avatar-160.png (r.753), "ik doe mee" (r.653) en "We doen het anders, samen." (r.755). Avatar-URL → 200 image/png. Avatar staat alleen in de coach-overlay (niet in de DOM bij laden). PASS.innerWidth 468, scrollWidth 468 → de layout is breder dan het scherm (uitgezoomd/horizontaal scrollen). Oorzaak niet gemeten (buiten scope van vanavond).oefentoetsen.html (22:11) ≠ live (patch 23:48); ik heb live gemeten..badge KLASGENOOT), 12px (.tijd, .tag), 13px (item-small, .dag, teller in Wij-kaart).--sub #8ea0bd op --surface #1a2233 = 5,99:1 (AA ok); geel #ffd166 op #1a2233 = 11,03:1; --sub op --bg 6,93:1; citaat-kleur #6f82a3 op surface = 4,09:1 (onder 4,5 AA bij 14px); badge #9fd0ff op #1e3a5a 7,16:1; Ja-knop 10,25:1.role=button tabindex=0 aria-pressed aria-label="Afvinken: …" / "Ken ik al: …" / "Huiswerk afvinken: …" ✓. 🔊-knop is een <a href="#"> met alleen title.Hoog
1. "Alles af. Jij bent vrij, ik ook. 😎" terwijl 4 van 8 af — index.html r.90 (open=l.items.filter(...) kijkt alleen naar de 4 getoonde) en r.100 (else if(l.totaal && !eerste)). Reproduceren: https://appel2.haartips.nl/ nu (Dani heeft de 3 wiskunde- + 1 nederlands-item af, 4 nederlands-items verborgen). Screenshot exam-1-echt-430.png.
Middel
2. les.html negeert ?leerling= → alle vinkjes naar dani (les.html r.27, r.117).
3. Toetsdag-knop (index r.146) en trainingsplan-blok 3/4-links (trainingsplan.json oefentoetsen.html?…&vak=wiskunde|engels|nederlands) sturen naar een oefentoets die niet bestaat; pagina toont stil de algemene lijst. Reproduceren: ?test_datum=2026-09-23T07:30 → "▶ Doe eerst de oefentoets".
4. les.html 375px: tijdlabel steekt buiten beeld, 2px horizontale scroll (les.html r.42 + appel2.css r.131 white-space:nowrap). Reproduceren: les.html?datum=2026-09-08&vak=duits op 375 breed.
5. Frans-route: koppeling van 2 Toets-Mij-toetsen wordt opgeteld ("4 vragen", nummer 1 dubbel), oefen-link en voorlezen alleen toets 1 (appel2-data.js r.237/244, toets.html r.44-46, appel2-data.js r.267). Reproduceren: toets.html?vak=frans&datum=2026-09-30.
6. Les-huiswerk verloopt nooit + SO-aankondiging als huiswerk (appel2-data.js r.84; data lessen/huiswerk.json item -0). Reproduceren: ?test_datum=2026-09-23T07:30 → in "… en nog 3".
7. Toets van vandaag blijft 's avonds "eerstvolgende toets · vandaag" (appel2-data.js r.44). Reproduceren: ?test_datum=2026-09-23T16:00.
Laag
8. Eerste thuiskomst-bericht "vandaag 09:00" (index r.151).
9. weekReeks: UTC vs lokale datum, les--ids tellen niet (index r.43, r.51).
10. Straks doet niets en onthoudt niets; focus weg na elke render (index r.178, r.172).
11. Cosmetiek: "(Volgende week (15 september))" (appel2-data.js r.292), "We deden: Engelse les: …", "NaSk (natuurkunde)les" (index r.66), voornaam+achternaam bij docent zonder initialen (r.277).
12. Hard-coded "13 september" (toets.html r.114); voorleestekst hard op 1800 tekens (index r.190).
13. Citaat-kleur 4,09:1; badge 11px; klik-doelen onder 40px (vink 30/32, foto-link 17 hoog, pil 36, terug 20).
14. Pijplijn-output bevat "geen huiswerk" (duits.json r.41/r.74, engels.json r.82) en les.html toont die mededeling.
15. Twee lessen zelfde vak op één dag → dubbel bericht (index r.205-209) — uit de code, niet gemeten.