Why AI Crawlers Don't Run JavaScript, and What That Costs You
Googlebot renders your page. GPTBot, ClaudeBot and PerplexityBot generally do not. Here is how to measure the gap between what users see and what AI systems receive.
Most AI crawlers do not execute JavaScript. Content your framework injects client-side simply doesn't exist for GPTBot, ClaudeBot, PerplexityBot or the on-demand fetchers reading links your users share. This checker fetches your page's raw HTML (byte-for-byte what those crawlers receive) counts the words that survive, flags the framework markers that reveal client-side rendering, and, when you paste the rendered DOM alongside, produces the exact list of content only a JavaScript-running browser ever sees.
The JS Rendering Checker shows your page as AI crawlers see it: without JavaScript. It fetches the raw HTML, counts the words that survive, detects client-rendering framework markers with the evidence quoted, and estimates prose trapped in serialized JS data. Paste the rendered DOM alongside and it diffs the two, reporting exactly what percentage of the page is invisible to GPTBot, ClaudeBot and PerplexityBot.
Googlebot renders JavaScript. Almost nobody else does. OpenAI, Anthropic and Perplexity's crawlers read the raw HTML response and move on, which means a React SPA whose <div id="root"> fills in client-side can rank in Google while being an empty page to every AI system: invisible not by policy but by architecture. The JS Rendering Checker makes that gap measurable. Fetch a URL and it analyzes the raw HTML exactly as served: how many words of real content exist before any script runs, which framework fingerprints are present (Next.js flight data, __NUXT__ payloads, empty SPA mount points, Angular version markers. Each quoted as evidence), how much prose is trapped inside serialized JSON data islands where browsers will unpack it but crawlers won't, and whether a meta robots tag is quietly excluding you from the search indexes AI answers retrieve through. Then the optional second step turns estimate into proof: copy document.documentElement.outerHTML from your live page's DevTools console, paste it beside the raw fetch, and the checker diffs the two: reporting what percentage of your rendered content is invisible to AI crawlers and listing the invisible passages sentence by sentence. We built this because our own FAQ answers failed the test. It's the tool we needed, made public.
Last updated
Enter the URL. The proxy fetches it without executing anything and fills the raw pane. This alone yields the word count, framework markers and data-island estimate.
Words visible without JavaScript, each rendering signal with its evidence, and any meta robots problem, scored 0–100.
On the live page, run copy(document.documentElement.outerHTML) in the DevTools console and paste into the second box.
The invisible percentage plus every sentence that exists only after hydration: the precise content AI systems never see.
Server-render, pre-render or statically generate the invisible content, then re-run until the diff approaches zero.
Fetched with no JavaScript execution, no rendering, no tricks: byte-for-byte what GPTBot, ClaudeBot and PerplexityBot get, with the surviving word count front and center.
Next.js Pages and App Router payloads, Nuxt, SvelteKit, Remix, Angular, Astro islands, empty React mount points, WordPress asset paths. Each detection names the marker it found, and says whether that pattern implies client rendering.
Prose trapped in __NEXT_DATA__ and similar serialized JSON is counted separately: the browser turns it into your page, a crawler sees script soup. The word estimate quantifies what's locked up.
Paste the rendered DOM (one DevTools command, shown in the tool) next to the fetched raw HTML and get the precise invisible percentage plus the missing passages, listed sentence by sentence.
A noindex or nosnippet meta robots tag also removes you from the search indexes AI answers retrieve through: flagged whenever present, because it silently overrides everything else you fix.
URL fetches go through a stateless proxy (fetch, return, discard). Pasted HTML (including internal or staging pages) is analyzed entirely in your browser and never uploaded.
No amount of content optimization helps a page whose content doesn't exist in the HTML. This is the two-minute test that tells you whether to fix words or fix rendering.
"AI can't see our site" starts arguments. "The raw HTML contains 12 words and here's the diff" ends them. The report quotes markers and lists invisible passages: a ticket, not a vibe.
Comparing a prototype's raw HTML against the current site's is the cheapest possible rendering-strategy review, before the migration ships the regression.
Paste mode analyzes staging, localhost and authenticated pages without anything leaving your browser.
From quick one-off fixes to daily workflows, see how people put this tool to use.
A site that ranks in Google but never appears in AI answers is the classic symptom. This test confirms or eliminates rendering as the cause in one fetch.
Frameworks make it easy to believe you're server-rendering while a layout-level 'use client' quietly hollows the HTML. The raw fetch is ground truth.
FAQ accordions, tabbed specs, load-more sections: interactive patterns often hide their content client-side. Test the money pages, not just the homepage.
The framework fingerprints tell you what you're dealing with before anyone opens the repo, and the diff quantifies how much is at stake.
Boundaries stated plainly, with the right tool for each neighbouring job.
Accepts URL and HTML, and produces Report, all processed locally in your browser.
See how the js rendering checker fits into a step-by-step journey with related tools.
One URL in, one AI-visibility report out: crawler access with Cloudflare detection, JS rendering, citability scored with published methodology, retrieval chunks, answer snippets and schema. Each finding linked to the free tool that fixes it.
Check whether GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot, Bingbot and every other AI crawler can read your site. Real RFC 9309 robots.txt matching with the deciding rule quoted, plus Cloudflare default-blocking detection. Free, instant, no signup.
Score any page or draft on the factors a published study (KDD 2024) measured as increasing AI citation: fact density, source citations, quotability, answer-first openings, question headings and self-containment. Every sub-score shows its formula and what it counted.
See your page the way a RAG system does: split into retrieval chunks and read one at a time, with no surrounding context. Flags every fragment that collapses alone: pronoun openers, 'as mentioned above', sections that never name their subject.
Drop a server access log and see which AI crawlers actually visit: per-bot hit counts, first and last seen, most-fetched pages, status-code health, daily trend, and the pages no AI crawler has ever touched. Parsed in your browser: logs contain visitor IPs and never leave your device.
Generate a correct robots.txt policy for every AI crawler (GPTBot, ClaudeBot, OAI-SearchBot, PerplexityBot and 11 more) with per-bot allow/block toggles and a plain-language line on what each choice costs. Free, in your browser.
Hit a snag? Here are quick fixes for the issues people run into most.
Some sites block automated fetches at the firewall (worth noting: that may be blocking AI crawlers too). Fall back to paste: open the page, View Source (Ctrl/Cmd-U), copy everything into the raw pane. That's the same bytes a crawler gets.
Rendering is necessary, not sufficient. Run the full GEO Audit: crawler access (robots.txt/Cloudflare) and content citability are the other usual suspects, and the audit checks all of them in one pass.
Correct behavior. Those ARE invisible to AI crawlers. Decide whether that matters per content type: a live stock ticker probably doesn't. Your product description and FAQ answers absolutely do.
The flight-data marker indicates the framework, and the checker pairs it with the actual visible word count. If your words are high, the flag reads as informational: the framework is present but server-rendering is doing its job. The word count is the verdict. The marker is context.
Googlebot renders JavaScript. GPTBot, ClaudeBot, PerplexityBot and the user-fetch bots don't. 'It's fine in Google' proves nothing about AI visibility.
Server-side rendering, static generation and pre-rendering all pass this test: the fix isn't abandoning your framework, it's making it emit HTML.
Check View Source, not DevTools Elements: Elements shows the rendered DOM (after JavaScript), which is exactly the misleading view this tool exists to correct.
Content inside <noscript> is a fallback for humans, not a fix: treat it as a signal that someone knew about the problem.
The pages users most often paste into ChatGPT (docs, pricing, comparisons) are the ones where ChatGPT-User hitting empty HTML hurts most. Test those first.
Recent updates and improvements to the js rendering checker.
Initial release: raw-HTML fetch + analysis (visible words, framework fingerprints with quoted markers, data-island prose estimate, meta-robots flags), optional rendered-DOM paste with sentence-level invisibility diff, staging-safe paste mode.
URL fetches pass through our stateless proxy: fetched, returned to your browser, discarded. No URLs or content are stored. Pasted HTML (raw or rendered) never leaves your browser at all, so staging and internal pages are safe to test.
Free and instant, JS Rendering Checker processes your file securely and removes it right after.