Fixing JavaScript Rendering for AI Visibility
Step-by-step guide to making JavaScript-rendered content visible to AI crawlers using SSR, pre-rendering, and hybrid approaches.
The goal
Make your content appear in the raw HTML response so AI crawlers (GPTBot, ClaudeBot, PerplexityBot) can read it without executing JavaScript. Here are the practical approaches, ordered from most to least recommended.
Option 1: Server-Side Rendering (SSR)
The gold standard. Your server executes the JavaScript and sends fully-rendered HTML to every visitor — human or bot.
Next.js (React)
If you're using React, Next.js is the most straightforward path to SSR:
- Pages using
getServerSidePropsare rendered on each request - Pages using
getStaticPropsare pre-rendered at build time (SSG) - The App Router (Next.js 13+) uses Server Components by default — already SSR
Nuxt (Vue)
Nuxt provides SSR out of the box. Ensure your nuxt.config has ssr: true (the default). Pages using useAsyncData or useFetch will have their data included in the server-rendered HTML.
SvelteKit
SvelteKit defaults to SSR. Data loaded in +page.server.ts load functions is rendered server-side automatically.
Option 2: Static Site Generation (SSG)
Pre-build all pages as static HTML at deploy time. Ideal for content that doesn't change on every request — blogs, documentation, marketing pages.
- Next.js — Use
getStaticProps+getStaticPaths - Gatsby — SSG by design
- Astro — Static-first with optional islands of interactivity
- Hugo / Jekyll / 11ty — Pure static generators, always AI-visible
Option 3: Pre-rendering services
If you can't switch frameworks, a pre-rendering service sits between your server and crawlers, executing JavaScript and serving the resulting HTML to bots:
- Prerender.io — detects bot user-agents and serves cached static HTML
- Rendertron — Google's open-source headless Chrome renderer
- Puppeteer/Playwright scripts — roll your own with a headless browser on a schedule
Pre-rendering adds complexity and a caching layer, but it works when a full framework migration isn't practical.
Option 4: Hybrid approach
Render critical content (article text, product details, key information) server-side, while keeping interactive elements (comments, filters, modals) client-side. This gives AI crawlers the important content while preserving interactivity.
Verification checklist
| Check | How to test | Pass criteria |
|---|---|---|
| Raw HTML contains content | curl -s your-url | grep "key phrase" | Content appears in output |
| No-JS browser test | Disable JS in DevTools, reload | Main content still visible |
| GenReady report | Run a scan on genready.ai | Content Extraction score is Good |
| Mobile rendering | Test with mobile user-agent | Same content as desktop |
💡 Priority order
Fix your most important pages first — homepage, key product/service pages, and top blog posts. These are the pages AI is most likely to crawl and cite. Use GenReady to identify which pages need attention.
