Jakub Sawa

Jakub Sawa

Senior technical SEO consultant, 25 years in the field (ex-Onet, ex-Agora/Gazeta Wyborcza). Independent owner of SAWA PROJEKT, co-founder of FratreSEO. Building JS SEO Lab as an open research instrument on what bots and LLM fetchers actually see when JavaScript renders content.

ClaudeBot crawled our content once, then pinged robots and sitemap every two hours for a month

ClaudeBot crawled our content once, then pinged robots and sitemap every two hours for a month

Across 871 requests, ClaudeBot spent 80% on /robots.txt and /sitemap.xml and 18% on content. The shape explains it: it swept the test bed once through 2026-07-05, then switched to a machine-regular heartbeat - robots and sitemap fetched as a pair every two hours, twelve times a day, zero content - and held it for a month. Amazonbot and Meta sit at the opposite pole: zero robots.txt, straight to content.

JavaScript execution has two depths, and bots split cleanly between them

JavaScript execution has two depths, and bots split cleanly between them

Our JS-execution beacon fires through two channels - an inline script and a React client component. Over 80 days the bots sort into four tiers: renderers that evaluate React but skip inline scripts (Applebot, Googlebot-WRS, Read Aloud, NotebookLM), one that runs only the inline script (GPTBot), full executors (real browsers, Bing, GSC inspection), and a large zero-JS majority. Applebot rendered ~100% of what it crawled. Every batch AI crawler rendered nothing.

One IP claimed to be Google, OpenAI, Anthropic, Apple and Meta - while hunting for our .env file

One IP claimed to be Google, OpenAI, Anthropic, Apple and Meta - while hunting for our .env file

We flagged most of our Perplexity and ChatGPT crawler traffic as spoofed. Then we checked whether that was our mistake. It was not. The entire apparent Perplexity, ChatGPT-User and OpenAI-search 'crawl' traces to nine cheap-VPS IPs, each rotating up to twelve vendor identities while scanning for secrets. Cloudflare 403s fake Googlebot but lets the fake AI-fetchers through as a 200 - so counting AI crawlers by user-agent overcounts Perplexity and ChatGPT roughly tenfold.

Most AI batch crawlers never fetched our robots.txt

Most AI batch crawlers never fetched our robots.txt

In 15 days of JS SEO Lab data, the Next.js test bed saw 6,125 hits across 25 user-agent classes. GPTBot, Meta-external, Amazonbot, and three Google sub-bots together produced 862 hits with zero requests to /robots.txt. ClaudeBot read the rules seven times in 169 hits. OAI-SearchBot read them 38 times in 42. Three robots.txt behaviours, one rulebook, and a caveat for how to read your access logs.

NotebookLM ran our JavaScript

NotebookLM ran our JavaScript

We thought NotebookLM was scraping static HTML. A runtime-entropy probe proved otherwise: NotebookLM executed React, generated a UUID at runtime, fetched client-side content, and only appeared once we changed the beacon from an image request to fetch().

OAI-SearchBot only fetched robots.txt

OAI-SearchBot only fetched robots.txt

In the first week of JS SEO Lab data, OAI-SearchBot made 10 requests. Every one hit robots.txt. No homepage, no sitemap, no content cell. That does not prove how OpenAI crawls every site, but it does raise a useful question about what OAI-SearchBot is actually doing on cold-start domains.

Rendering mode was the wrong axis

Rendering mode was the wrong axis

Vercel and MERJ already settled that batch crawlers don't execute JavaScript. So why was I building a 6-mode renderability experiment? Here's why I rebuilt it as a pattern-axis instead — and what the new test bed measures.