Open methodology · Open data

JS SEO Lab

Empirical research on what JavaScript content patterns deliver to bots and LLM fetchers in 2026. Open methodology, open data, reproducible findings.

What we measure

Eight JavaScript content patterns × five page types × three rendering modes, open to every crawler. Per-cell signals captured in a public tracker.

Live test bed: next.jsseo.dev: 55 cells running now.

Open data

Raw bot tracker data, hypothesis pre-registration, methodology - all open from day one. CC0 / CC-BY for data, MIT for code.

GitHub repo · Data & citation

By Jakub Sawa

Senior technical SEO consultant, 25 years in the field. Independent owner of SAWA PROJEKT, co-founder of FratreSEO.

About · jakubsawa.pl · LinkedIn

Latest findings

Reflectionbot runs JavaScript only when the HTML is empty

Reflectionbot runs JavaScript only when the HTML is empty

Reflection AI's crawler visited our test bed 69 times between 18 September and 25 October. On 12 of its 13 visits to client-side-rendered pages, a second address fetched the page again and ran the React app within three seconds. On 56 visits to server-rendered and static pages, including pages whose main content needs JavaScript, it fetched the HTML once and ran nothing. Every address it fetched pages from is on Reflection's published IP list and resolves to reflection.ai.

Why this experiment

In 2024 Vercel and MERJ reported that major AI crawlers don't execute JavaScript. That's the rendering-mode answer, and on our cells it mostly holds, with exceptions: as of 2026-10-06, ClaudeBot, Amazonbot and CCBot never fired a beacon and GPTBot only ran the inline script, but Applebot rendered React, and meta-external and ShapBot ran both the inline script and React. Real client audits don't ask "is this site SSR or CSR?" though: they ask "is this specific JS pattern (a click-to-reveal, a useEffect-fetched price, a hash-routed navigation) costing me visibility in this specific bot's index?"

What's measured

Eight JS content patterns (clean / js-images / js-links / click-reveal / js-fetched / hash-routing / late-loaded / mixed) × five page types × three rendering modes (SSR / CSR / optional SSG). As of 2026-10-06, 28 named bots had visited the test cells, among them verified GPTBot, ClaudeBot, Googlebot, Bingbot, Applebot, ChatGPT-User and Claude-User.

How it's verified

Bot claims are checked wherever the vendor publishes a way to check them: reverse DNS for Google/Bing/Apple/Baidu, IP-range CIDR matching against published OpenAI/Perplexity/Anthropic/Amazon/Parallel manifests, and either path for Amazonbot and CCBot. Meta's crawlers are checked against Meta's own network (AS32934). Claude Code fetches stay visible but unresolved, since there is no public verification path. Deprecated anthropic-ai/Claude-Web UAs and the Google-Extended/Applebot-Extended tokens, which their vendors never send as a user agent, are automatically flagged as unverified. As of 2026-10-06, 31,881 of 39,962 hits (80%) have no verification result; 29,007 of them come from human visitors and clients the classifier can't name.