Your AI-Built Site Is Invisible to ChatGPT

Lovable, v0, and Bolt ship client-rendered SPAs that serve a blank page to ChatGPT, Claude, and Perplexity. Here is the technical reason why, how to test your own site in 8 seconds, and why server-side rendering is the fix.

Open your AI-built site, right-click, and choose View Page Source (not Inspect). If you see something close to this, you have a problem:

<body>
  <div id="root"></div>
  <script type="module" src="/assets/index-Bk3xY9mP.js"></script>
</body>

That roughly 400-byte file is the entire page that an AI crawler receives. No H1. No copy. No meta description. No structured data. Everything a human visitor sees is injected later by JavaScript — and most AI crawlers never run it (Ranking Lens).

You can rank perfectly well in Google while being completely invisible to ChatGPT, Claude, and Perplexity. As AI answers eat a growing share of zero-click search, that is no longer a footnote — it is the whole game.

Why this happens

Lovable and Bolt generate client-side rendered (CSR) Vite + React single-page apps by default. The server sends an almost-empty HTML shell, and the browser builds the real page only after downloading and executing a 500 KB–2 MB JavaScript bundle (Fokal).

Google spent over a decade building infrastructure to render JavaScript, so Googlebot eventually sees your content — but on a deferred second wave that independent audits clock at 3–6 weeks, and that render can silently fail if your content depends on API calls (Visively).

The newer AI crawlers never made that investment. They fetch raw HTML and stop. Research from Merj and Vercel found that ChatGPT and Claude download JavaScript files but read them as text — they do not execute them as code (Visively). To them, your <div id="root"> stays empty forever.

The silent part: your site still looks perfect to you, still works for users, still ranks in Google. The failure is invisible until you go looking for it.

Who actually sees your content

Only one major crawler reliably renders JavaScript — and even it is weeks behind.

CrawlerPowersExecutes JavaScript?Sees your CSR site
GooglebotGoogle SearchYes — deferred 3–6 wksEventually
GPTBotChatGPTNoNever
OAI-SearchBotChatGPT SearchNoNever
ClaudeBotClaudeNoNever
PerplexityBotPerplexityNoNever
Google-ExtendedGemini trainingNoNever
ApplebotSiri & SpotlightNoNever

Crawler rendering behavior documented by Visively and Ranking Lens.

What each AI builder ships by default

The pattern is consistent: AI coding tools optimize for working code shipped to humans, not for what machines read. Schema, sitemaps, and server rendering are left as homework.

BuilderDefault renderingSchemaSitemapVisible to AI crawlers
LovableClient-side (Vite)NoneNoNo
Bolt.newClient-side (Vite)NoneNoNo
v0 by VercelNext.js (SSR-capable)None by defaultNo by defaultOnly if configured
CursorDepends on stackNoneDependsDepends
PloyServer-side renderedBuilt inAutoYes

Test your own site in 8 seconds

You do not need a tool to confirm this:

  1. View Page Source (Cmd/Ctrl + U). If the <body> is just an empty <div> and a script tag, your content is not in the HTML.
  2. Disable JavaScript in Chrome DevTools (Cmd/Ctrl + Shift + P → “Disable JavaScript”) and reload. What remains is what AI crawlers see (Visively).
  3. Ask ChatGPT to summarize your URL. A generic answer — or an explicit “I can’t read this page” — confirms the rendering gap.

Why the usual fixes fall short

  • React Helmet / document.title set tags during JavaScript execution. Crawlers reading raw HTML never see them (DataJelly).
  • Prerender proxies (Prerender.io and similar) work, but they are a $15–99/mo bolt-on layer that serves bots a separate snapshot — another service, another bill, another thing to break.
  • “Just migrate to Next.js” is the honest advice in most of these guides — which means exporting and rebuilding the site you just shipped (Fokal).

Every path points to the same root requirement: the content has to be in the initial HTML response. Structured data, in particular, must be server-rendered — JSON-LD injected via a useEffect hook is invisible to non-rendering crawlers (SearchForged).

How Ploy fixes it

Ploy builds and publishes server-rendered marketing sites, so the full page — headings, copy, internal links, and JSON-LD schema — is in the HTML on the first byte, before any JavaScript runs. That is exactly the format GPTBot, ClaudeBot, and PerplexityBot read.

  • SSR by default — every page ships real content in the raw HTML response, not an empty <div>. No prerender proxy, no re-platform.
  • AEO built in — server-rendered structured data, clean heading hierarchy, sitemaps, and crawlable internal links, so AI engines can extract and cite you.
  • No migration tax — you do not export, rebuild, or bolt on a second service to be visible. It is the default.

A vibe-coded site that looks great and is invisible to ChatGPT is not done. The fix is not a clever prompt or a proxy — it is shipping HTML the machines can actually read.

FAQ

Why does my Lovable or Bolt site rank in Google but not appear in ChatGPT? Googlebot renders JavaScript on a delayed second wave, so it eventually sees client-rendered content. ChatGPT’s crawlers (GPTBot, OAI-SearchBot) do not execute JavaScript at all — they read the raw HTML and find an empty page.

How do I test if my site is invisible to AI crawlers? View Page Source, or disable JavaScript in DevTools and reload. Whatever is missing is what AI crawlers see. You can also ask ChatGPT to summarize your URL.

Does a prerender service fix this? It can, but it is a paid proxy layer serving bots a separate snapshot. Server-side rendering puts the content in the HTML natively — no extra service, no cloaking risk.

Do I have to rebuild my site in Next.js? Not on a server-rendered platform. Ploy renders every page server-side by default, so content is crawlable without a re-platform.


Sources: Fokal — Bolt.new SEO · Visively — AI Crawlers and JavaScript · Ranking Lens — Lovable HTML Indexing · DataJelly — Bolt.new SEO Guide · SearchForged — JavaScript Rendering & AEO