← Back to Blog

GPTBot Doesn't Run JavaScript — What Your Site Looks Like To It

GPTBot Doesn't Run JavaScript — What Your Site Looks Like To It

Googlebot renders JavaScript. AI crawlers mostly don't.

GPTBot (OpenAI), ClaudeBot (Anthropic), PerplexityBot, and CCBot (Common Crawl) fetch your raw HTML, parse it as a string, and move on. If you're running a client-side React or Vue app without server-side rendering, your raw HTML is a 1-2 KB shell that says "loading…" — and that's all the AI crawler sees.

The Render-Block Audit fetches your URL's raw HTML and scores it for what a non-JS crawler would actually extract.

What it checks

  • Word count in raw <body>. Under 200 = critical (SPA shell only). 200-500 = thin. 500+ = healthy.
  • H1 in raw HTML. Missing = crawlers have no title anchor. Multiple = pick one canonical.
  • JS framework fingerprint. React / Next / Nuxt / Vue / Angular / Svelte / Gatsby / Remix / Astro signatures in the head + SPA containers (#__next, #app, [data-reactroot]).
  • Render-blocking <script> in <head>. Any non-async, non-defer script is a bottleneck.
  • Stylesheet <link> count in <head>. 1-2 is fine; 3-4 is acceptable; 5+ delays first paint.
  • Inline CSS + JS in <head>. Under 20 KB is clean; 20-60 KB is heavy; 60+ KB is rendering downstream.
  • Title + meta description present in raw HTML. Both should be server-rendered; client-injected versions are invisible to non-JS crawlers.

What to do if the audit fails

If JS framework detected + thin raw HTML:

  1. Static export where possible. Next.js output: 'export', Astro static mode, Gatsby build.
  2. SSR for critical routes. Next.js getServerSideProps, Remix loaders, Nuxt asyncData. Non-critical marketing pages can stay static.
  3. Pre-rendering as a middle ground. Tools like react-snap, Rendertron, or Cloudflare's HTML Rewriter inject server HTML for bot UAs.
  4. Hybrid. Render critical content (title, meta, headings, first paragraph) server-side; hydrate the rest client-side.

For render-blocking scripts:

  • Add async for analytics (doesn't depend on DOM).
  • Add defer for scripts that need DOM but don't block render.
  • Move non-critical scripts to just before </body>.

For head-heavy CSS:

  • Inline critical CSS (above-the-fold rules only).
  • Defer the rest via <link rel="stylesheet" media="print" onload="this.media='all'"> or equivalent.
  • Combine stylesheets — fewer round trips.

The AI fix prompt

Emits a prioritized migration plan ordered by CTR impact: title/meta first (easiest to fix, biggest SERP effect), content next, performance last.

Related reading

Fact-check notes and sources


The $100 Network covers server-rendered static sites as the default — the AI-crawler-readiness baseline. The audit is how you verify it ships.

← Back to Blog

Accessibility Options

Text Size
High Contrast
Reduce Motion
Reading Guide
Link Highlighting
Accessibility Statement

J.A. Watte is committed to ensuring digital accessibility for people with disabilities. This site conforms to WCAG 2.1 and 2.2 Level AA guidelines.

Measures Taken

  • Semantic HTML with proper heading hierarchy
  • ARIA labels and roles for interactive components
  • Color contrast ratios meeting WCAG AA (4.5:1)
  • Full keyboard navigation support
  • Skip navigation link
  • Visible focus indicators (3:1 contrast)
  • 44px minimum touch/click targets
  • Dark/light theme with system preference detection
  • Responsive design for all devices
  • Reduced motion support (CSS + toggle)
  • Text size customization (14px–20px)
  • Print stylesheet

Feedback

Contact: jwatte.com/contact

Full Accessibility StatementPrivacy Policy

Last updated: April 2026