DEV Community

Cover image for I fetched 30 AI-built sites without JavaScript. 8 of 9 Bolt sites were empty pages.
gonghuiling
gonghuiling

Posted on AI-assisted

I fetched 30 AI-built sites without JavaScript. 8 of 9 Bolt sites were empty pages.

I build my own sites with AI tools, and after launching a couple of them I wanted a simple answer: can ChatGPT actually read them?

So I took 30 live sites built with tools like Bolt and Lovable, fetched each homepage the way most AI crawlers do (one plain HTTP request, no JavaScript), and looked at what came back.

Why the raw HTML matters

Most AI-built sites are single-page React apps. The server sends a nearly empty HTML file, and the browser builds the page after JavaScript runs.

That's fine for people. It's fine-ish for Google, which renders JavaScript, just later and less reliably than plain HTML. But a December 2024 study by Vercel and MERJ found that none of the major AI crawlers they observed render JavaScript, including OpenAI's, Anthropic's and Perplexity's. Link previews in Slack, X and WhatsApp mostly read raw HTML too.

So if your content only exists after JavaScript runs, those tools get this:

<div id="root"></div>
Enter fullscreen mode Exit fullscreen mode

What I found

I ran the check on 14 October 2026 and re-ran it on 23 October with better platform detection. These are the 23 October numbers:

Platform Sites Still reachable Blank without JS
Bolt 10 9 8
Lovable 10 9 6
Next.js, Astro, WordPress 7 7 0
Not identified 3 3 1

"Blank" means fewer than 200 visible characters in the raw HTML plus an empty app mount point or scripts that build the page. The split was not subtle: on the first run, blank sites had at most 163 visible characters, and every other site had at least 1,692.

A few other things showed up:

  • Soft 404s: 13 of 30 sites answered 200 OK for a page that doesn't exist. To a crawler, every junk URL looks like a real page with the same content.
  • No sitemap: on the first run, 16 of 30 had no sitemap I could find, including 9 of the 10 Bolt sites.
  • A canonical pointing at http://localhost:3000/: one site was telling search engines its real address was the developer's laptop.

The Lovable caveat

Lovable is more complicated than the table suggests. Lovable says projects created since May 2026 are server-rendered, and older projects get a prerendered copy that is served only to verified crawlers, including ChatGPT's, Perplexity's, Claude's and Gemini's. Base44 reportedly does the same on custom domains.

My check identifies itself as its own bot, so it can't see that crawler-only copy. An empty page from the outside doesn't prove ChatGPT sees nothing on a Lovable site. Bolt and plain Vite + React sites only get that fallback if you set one up yourself.

Check your own site in 10 seconds

curl -s https://yoursite.com | grep -o "<title>.*</title>"
curl -s https://yoursite.com | wc -c
curl -s -o /dev/null -w "%{http_code}\n" https://yoursite.com/this-page-does-not-exist
Enter fullscreen mode Exit fullscreen mode
  • If the title is still Vite + React + TS, fix that first. It's what Google and AI tools will show as your site's name.
  • If the HTML is a few hundred bytes and your headline isn't in it, crawlers that don't run JavaScript see a blank page.
  • If the last command prints 200, you have soft 404s.

You can also open view-source:yoursite.com in Chrome and search for your headline.

How to fix it

  1. Ship HTML with content. Add build-time prerendering for every public page, or use server rendering. Next.js and Astro do this by default. For a Vite + React app, ask your builder (Bolt, Replit Agent, Cursor or Claude Code) to add build-time prerendering for every public route, so each page's title, description and text are in the HTML.
  2. Return a real 404. Many hosts are set up to send every path to index.html. Limit that rewrite to routes that exist and serve a not-found page with a 404 status for the rest.
  3. Add a sitemap. Generate sitemap.xml listing your real pages on your live domain, reference it in robots.txt, and submit it in Google Search Console.
  4. Check your canonical. It should point at your production domain, not a *.bolt.host, *.vercel.app or localhost address.

Then run the curl commands again. If your headline shows up in the raw HTML, you're done.

Limitations

Thirty sites is a small sample, and it isn't random: I copied them by hand from Google results, so every one was already indexed by Google, blank or not. Platform detection can mislabel sites, and each site was checked at one point in time. Treat the percentages as a signal, not a census.

The full method and the anonymised data (CSV) are here: Most of the Lovable and Bolt sites we checked are blank without JavaScript.


Disclosure: I turned this check into a free tool, IndexReady. It runs these tests on your homepage in about 15 seconds and gives step-by-step fixes for the tool you built with. No sign-up. If you run it and something looks wrong, I'd like to hear about it.

Top comments (1)

Collapse
 
citedy profile image
Dmitry Sergeev •

The user asks: "Write one comment I could post under this video." We must follow developer instructions: generate a casual YouTube comment, short, one or two sentences, possibly a fragment. Must lead with specific reaction or question about this video. No marketing. No URLs. Must follow style: start with lowercase, casual voice, possibly "lol", "tbh". Must avoid double hyphens, em-dash, en-dash. Must not use quotes other than straight ascii if needed. Must not use ellipsis char