JavaScript rendering check

    Does ChatGPT see your React site?

    GPTBot, ClaudeBot and PerplexityBot read the HTML your server returns and stop there. They never run your bundle. If you shipped a single-page app, some of your content never reaches them, and nothing in your analytics will tell you.

    Enter a public website URL to analyze.

    Free, unlimited, no card. We report the gap as a percentage and name the framework behind it.

    Which AI crawlers run JavaScript

    This is the whole problem in one table. The bots feeding the answer engines people actually ask are the ones that do not render.

    CrawlerFeedsRuns JavaScript
    GPTBotChatGPTNo
    OAI-SearchBotChatGPT SearchNo
    ClaudeBotClaudeNo
    PerplexityBotPerplexityNo
    GooglebotGoogle AI Overviews, GeminiYes
    BingbotMicrosoft CopilotYes

    How we measure the gap

    Not a guess from your framework’s name. An actual before-and-after on your page.

    1. 01

      Fetch it the way a bot does

      We take the raw HTML your server returns, run nothing, and extract the main content from it.

    2. 02

      Fetch it again in a real browser

      Headless Chromium loads the same URL and waits for your JavaScript to finish. Same extractor, second reading.

    3. 03

      Diff the two and name the framework

      The difference in main-content words becomes your gap percentage. Fingerprints in the HTML tell us whether it was Next.js, Vue, Angular or something else, and the fix text matches.

    How it is scored: anything at or above 10% is flagged. Past 30% it counts as a high-severity finding, and past 50% it is critical, because at that point most of your page is missing for most of the AI crawlers reading it.

    What to do, by framework

    Shipping fast with an AI coding tool usually means taking whatever rendering mode the starter template came with. Here is what that choice costs you, stack by stack.

    Next.js

    Usually fine, until it is not

    App Router server components ship real HTML. The gap opens when a page is marked "use client" end to end, or when the content arrives from a useEffect fetch after hydration.

    Fix: Move the data fetch into a server component, or export dynamic = "force-static" for pages that do not need per-request data.

    Vite + React

    The common problem case

    A plain Vite SPA serves one <div id="root"></div> and a bundle. Crawlers that skip JavaScript get an empty page, whatever is on screen for a human.

    Fix: Prerender the routes you want cited with vite-plugin-ssr, react-snap, or move the marketing pages to a static build.

    Vue / Nuxt

    Depends on the mode

    Nuxt in universal mode renders on the server and is fine. Nuxt with ssr: false, or a bare Vue SPA, hands crawlers the same empty shell a Vite app does.

    Fix: Keep ssr: true, or add nuxt generate for content routes that rarely change.

    Astro

    Safe by default

    Astro ships HTML and hydrates islands on top. A gap here almost always means one island was given client:only instead of client:load.

    Fix: Swap client:only for client:load or client:visible so the server still renders the initial markup.

    SvelteKit

    Safe by default

    Server rendering is on unless someone turned it off. Check for export const ssr = false in a +page.ts, which is the usual culprit.

    Fix: Remove the ssr: false export, or use prerender = true for static content routes.

    Angular

    Needs opting in

    A default Angular build is client-rendered. The page exists only after the bundle runs, so the HTML a crawler receives carries your title and almost nothing else.

    Fix: Add Angular SSR (@angular/ssr) or prerender routes at build time.

    Questions people ask

    How do you measure the gap?
    We fetch your page twice. Once the way GPTBot does, taking the raw HTML your server returns and nothing else. Once in a headless Chromium instance that runs your JavaScript to completion. Both versions go through the same main-content extractor, and we report the difference in words as a percentage. A reading of 62% means roughly six words in ten exist only after your bundle runs.
    Which frameworks do you detect?
    Next.js, React, Vue and Nuxt, Angular, SvelteKit, Remix, Astro, and generic webpack or chunked bundles. When we can name the framework, the finding names it, so the fix instruction matches the stack you actually shipped.
    My site ranks fine on Google. Am I safe?
    Not necessarily, and this is why the problem stays hidden. Googlebot runs a headless browser, so a client-rendered site can rank normally in Google while GPTBot, ClaudeBot and PerplexityBot receive an empty shell. Search traffic looks healthy right up until you check what the AI crawlers got.
    Does every page need server rendering?
    No. Start with the pages carrying content you want quoted: your docs, your landing pages, your posts. A logged-in dashboard has nothing to cite, so leaving it client-rendered costs you nothing.
    Can I check this without a tool?
    Yes, roughly. Disable JavaScript in your browser and reload the page. Whatever vanishes is what the non-rendering crawlers get. View-source works too: search the raw HTML for a sentence from the middle of your page, and if it is missing, it was rendered client-side. We do the same comparison, but we count it and tell you which pages are worst.

    The rendering gap is one of the checks in every scan. See what else we look at, or read the step-by-step rendering fix guide.

    Find out what the bots actually got

    One URL, about thirty seconds, and you will know the number.

    Enter a public website URL to analyze.