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.
| Crawler | Powers | Executes JavaScript? | Sees your CSR site |
|---|---|---|---|
| Googlebot | Google Search | Yes — deferred 3–6 wks | Eventually |
| GPTBot | ChatGPT | No | Never |
| OAI-SearchBot | ChatGPT Search | No | Never |
| ClaudeBot | Claude | No | Never |
| PerplexityBot | Perplexity | No | Never |
| Google-Extended | Gemini training | No | Never |
| Applebot | Siri & Spotlight | No | Never |
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.
| Builder | Default rendering | Schema | Sitemap | Visible to AI crawlers |
|---|---|---|---|---|
| Lovable | Client-side (Vite) | None | No | No |
| Bolt.new | Client-side (Vite) | None | No | No |
| v0 by Vercel | Next.js (SSR-capable) | None by default | No by default | Only if configured |
| Cursor | Depends on stack | None | Depends | Depends |
| Ploy | Server-side rendered | Built in | Auto | Yes |
Test your own site in 8 seconds
You do not need a tool to confirm this:
- 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. - Disable JavaScript in Chrome DevTools (
Cmd/Ctrl + Shift + P→ “Disable JavaScript”) and reload. What remains is what AI crawlers see (Visively). - 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.titleset 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