← Guides

Why ChatGPT and Claude can't read your JavaScript site

AI crawlers fetch your HTML and stop. If your content only exists after JavaScript runs, they see an empty page. Here is how to check, and how to fix it.

A single-page app sends the browser a near-empty HTML shell and builds the page in JavaScript. That works fine for people. It does not work for the crawlers that feed AI answers.

The crawlers behind AI citations, OAI-SearchBot for ChatGPT, Claude-SearchBot, and PerplexityBot, fetch your URL, read the bytes that come back, and move on. They do not run your JavaScript. Googlebot does run it, but on a second pass that happens later and is not guaranteed. So the version of your page that reaches an answer engine is the shell: a title, a root div, and nothing to quote.

How to check your own site in one minute

  1. Fetch the raw HTML without a browser: curl -s https://yoursite.com | wc -w
  2. Open the same page in a browser, select all the visible text and count the words there.
  3. Compare the two. If the raw fetch is a few dozen words and the rendered page is hundreds, your content is invisible to AI crawlers.
  4. Check the headline specifically: curl -s https://yoursite.com | grep -i "<h1". No match means the crawler never sees what the page is about.

How to fix it

The fix is always the same shape: produce the HTML before the response leaves the server.

  1. Pick the rendering mode your framework already supports. Next.js: server components or getStaticProps. Nuxt: nuxt generate or SSR. SvelteKit: the default server renderer. Astro: static by default. A plain Vite or Create React App build: add a prerender step that renders each public route to its own HTML file at build time.
  2. Start with the pages that have to be found: the homepage, pricing, product pages, docs, anything you would want quoted in an answer. Application screens behind a login do not need this.
  3. Make sure the markup lands inside the response body, not in a script tag that rebuilds it on load.
  4. Verify with the same curl from step one. The word count should now match what you see in the browser.
  5. Re-run a scan afterwards. A page that passes this check is a page an answer engine can quote.

What does not count as a fix

  • A client-side head library such as react-helmet or vue-meta. It runs in the browser, after the crawler has already read the response.
  • A loading skeleton. It is still an empty page as far as the crawler is concerned.
  • Relying on Googlebot's rendering pass. It helps Google and does nothing for ChatGPT, Claude or Perplexity.

One honest caveat

Server rendering makes your content readable. It does not make it worth citing. The content still has to answer the question someone asked.

Geoify checks all of this on your site and ranks what to fix first. Run the free scan.