Hoe deze controle werkt
Scanaris downloadt de HTML van je pagina precies zoals de server hem serveert, zonder JavaScript uit te voeren, verwijdert scripts, stijlen, noscript-tags, templates en SVG's, en meet hoeveel zichtbare tekst er in de body overblijft. Hij opent alleen een bevinding, van gemiddelde ernst, als twee voorwaarden tegelijk gelden: die tekst is korter dan 250 tekens, en de HTML bevat een lege single-page-app-container, dus een <div> met id root, app, __next, __nuxt of q-app zonder inhoud. Een site met server-side rendering of statische generatie heeft tekst in de initiële HTML en wordt nooit gemeld; een site met weinig inhoud maar zonder SPA-container ook niet. De drempel is bewust laag om valse positieven te vermijden.
Waarom dit belangrijk is
Googlebot voert JavaScript uit, maar in een tweede ronde die dagen kan duren en met een beperkt budget. De crawlers van AI-assistenten (GPTBot, ClaudeBot, PerplexityBot) voeren het doorgaans helemaal niet uit: ze lezen de HTML die ze krijgen, punt. Is je HTML een <div id="root"></div> en een script, dan is je site voor hen leeg. Ze kunnen niet indexeren wat ze niet zien en niet citeren wat ze niet lezen, dus wanneer iemand ChatGPT naar jouw productcategorie vraagt, besta je niet. Het is het meest voorkomende probleem van sites die met AI-tools zijn gebouwd die een pure client-side React- of Vue-app genereren, en het meest onzichtbare, omdat in de browser alles er perfect uitziet.
Hoe je het oplost
- Schakel server-side rendering in. In Nuxt staat het standaard aan (
ssr: true); heb je het uitgezet, zet het dan weer aan. In Next.js rendert de App Router op de server tenzij je het component helemaal bovenaan met'use client'markeert. In kale Vite met React of Vue is er geen SSR: stap over naar Next.js, Remix, Nuxt of Astro, of genereer de openbare pagina's als statische HTML. - Is migreren geen optie, prerender dan: genereer de HTML van de openbare routes tijdens de build (Nuxt
nitro.prerender, statische export van Next.js, Astro standaard) of gebruik een prerenderingdienst die gerenderde HTML aan bots serveert. - Zet minimaal de essentiële inhoud in de HTML: de kop, de beschrijving van wat je doet en de hoofdlinks, ook al vervangt de app ze bij het laden. Dat is wat bots zien.
- Controleer de pagina's die ertoe doen, niet alleen de homepage: de blog en productpagina's zijn wat assistenten citeren.
Controleer of het opgelost is
curl -s https://jouwdomein.nl | sed -e 's/<script[^>]*>.*<\/script>//g' -e 's/<[^>]*>/ /g' | tr -s ' \n' ' ' | wc -c
Blijft het resultaat steken op een paar dozijn tekens, dan rendert JavaScript de inhoud. Het zouden er duizenden moeten zijn. Andere manier: schakel in de browser JavaScript uit in de ontwikkelaarstools en herlaad; wat je ziet, zien de bots.
Veelgestelde vragen
Google indexeert me prima. Waarom zou ik me druk maken?
Omdat steeds meer mensen een assistent vragen in plaats van te zoeken, en die assistenten voeren je JavaScript niet uit. En omdat zelfs bij Google het uitgestelde renderen de indexering van je wijzigingen dagen vertraagt. De cijfers en de redenen staan in waarom met AI gebouwde apps onzichtbaar zijn voor AI.
Mijn app is een privédashboard achter een login. Geldt dit voor mij?
Nee: wat achter authenticatie zit, hoort niet geïndexeerd te worden. Deze controle telt voor de openbare pagina's, die je wilt laten verschijnen. Is je site alleen het dashboard plus een landingspagina, maak dan van de landingspagina HTML.
Ik heb SSR en er komt toch weinig tekst uit.
Dan levert de HTML structuur maar weinig echte inhoud, en loont het te controleren of de landingspagina wel iets vertelt. De koppen die die inhoud ordenen, worden bekeken door koppen.