Research · October 2026
Most of the Lovable and Bolt sites we checked are blank to AI crawlers
We fetched 30 live websites the way ChatGPT's and Perplexity's crawlers do: raw HTML, no JavaScript. 14 of the 17 sites built with Lovable, Bolt or a plain Vite + React setup came back as an empty page. Of the 13 sites built with anything else, 2 did.
14/17
Lovable, Bolt and Vite + React sites were blank without JavaScript.
2/13
sites on other stacks (Next.js, Astro, WordPress, unidentified) were blank.
14/30
sites answered "200 OK" for a page that doesn't exist. Every one of them was also blank.
16/30
sites had no sitemap.xml we could find.
Why a blank page matters
Sites made with Lovable, Bolt and similar tools are usually single-page React apps. The server sends an almost empty HTML file with a script tag, and the browser builds the page after the JavaScript runs. For a person in Chrome that works fine.
Crawlers are different. A December 2024 study by Vercel and MERJ found that none of the major AI crawlers it observed render JavaScript, including OpenAI's GPTBot, OAI-SearchBot and ChatGPT-User, Anthropic's ClaudeBot and PerplexityBot. They download the HTML and read what is in it. If the content only appears after JavaScript runs, they get nothing to read, quote or recommend.
Google is the exception: Googlebot renders JavaScript, and Google's AI features use the same crawler. So a blank site can still be indexed by Google while being invisible to ChatGPT and Perplexity. Link previews in Slack, X and messaging apps generally read raw HTML too.
What we found
The split was sharp. Every site we marked as blank had at most 163 visible characters in its raw HTML, and 12 of the 16 had none at all. Every other site had at least 1,692. There was no middle ground.
| Platform | Sites | Blank without JS | Soft 404 | No sitemap |
|---|---|---|---|---|
| Bolt | 10 | 8 | 7 | 9 |
| Lovable | 5 | 4 | 4 | 2 |
| Vite + React (no framework detected) | 2 | 2 | 2 | 1 |
| Next.js | 5 | 0 | 0 | 2 |
| Astro, WordPress | 2 | 0 | 0 | 0 |
| Not identified | 6 | 2 | 1 | 2 |
| All sites | 30 | 16 | 14 | 16 |
Soft 404s come with the blank page
We requested a random URL that doesn't exist on each site. 14 sites answered "200 OK" instead of "404 Not Found", and all 14 were among the blank sites. That fits how single-page apps are usually hosted: the server returns the same index.html for every path and lets JavaScript decide what to show. To a crawler, every made-up URL looks like a real page with no content, which wastes crawl budget and can get thin duplicate pages indexed.
Sitemaps and canonical tags
16 of the 30 sites had no sitemap.xml, including 9 of the 10 Bolt sites. One site's canonical tag pointed tohttp://localhost:3000/, which tells search engines the real version of the page lives on the developer's own computer.
What we did not count as a problem
Several sites on *.lovable.app, *.bolt.host and *.vercel.app had canonical tags pointing to a separate production domain. That is usually the right setup for a preview copy, so we left it out of the findings even though our checker flags it.
We also left out the checks for privacy, terms and refund pages. On a blank page there are no links in the raw HTML to follow, so those checks could only run on 14 of the 30 sites.
Method
- Sample. 30 publicly reachable websites: 19 on builder or host subdomains (10 on
*.bolt.host, 6 on*.vercel.app, 3 on*.lovable.app) and 11 on custom domains. This is not a random sample of the web. - Platform. Detected from markers in each site's HTML, headers and hostname: 10 Bolt, 5 Lovable, 2 Vite + React with no framework detected, 5 Next.js, 1 Astro, 1 WordPress and 6 we could not identify.
- Fetching. Each homepage was requested once with a plain HTTP client identifying itself as IndexReadyBot, without running JavaScript. Up to five internal pages linked from the raw HTML were sampled where links existed.
- Blank page. Fewer than 200 characters of visible body text in the raw HTML, plus either an empty app mount point (such as
<div id="root"></div>) or script tags that would build the page. - Soft 404. A request to a random, non-existent path on the same domain returned HTTP 200.
- Sitemap. The sitemap declared in robots.txt, or
/sitemap.xmlif none was declared. - When. All checks ran on 14 October 2026 between 09:12 and 09:22 UTC. 21 sites were checked in the first pass. The other 9 timed out from our network and were checked again ten minutes later through a different network route; all 9 responded the second time.
Limitations
- 30 sites is a small sample, and it was not drawn at random. Treat the percentages as a signal, not a census.
- Platform detection relies on markers in the page and can miss or mislabel a site. Six sites were not identified.
- Some subdomain sites are preview copies of a site whose production version lives elsewhere and may be built differently.
- Each site was checked once. A site may have changed since 14 October 2026.
- "Blank without JavaScript" says what a non-rendering crawler receives. It does not measure how Google, which renders JavaScript, ranks the site.
Why the sites are anonymous
The owners of these sites didn't ask to be part of a study, so the data lists them as Site 01 to Site 30. The CSV has every result we used on this page, so you can check the numbers. If you run one of these sites and want to know which one, email us and we'll tell you privately.
If your site is one of the blank ones
- Ship HTML with the content in it. Prerender your pages at build time (static generation) or use a framework that renders on the server. Your visitors won't notice a difference; crawlers will.
- Return a real 404. Configure your host so unknown paths answer with status 404 instead of serving the app shell.
- Add a sitemap.xml listing your real pages, and reference it in robots.txt.
- Check the canonical tag on your production domain points to that domain, not to a preview subdomain or localhost.
The free check on our homepage runs all of these tests on your site in about 15 seconds and shows what a crawler actually receives.