Lovable, Bolt and v0 SEO
Last reviewed
Sites built with Lovable, Bolt and v0 can be read by search engines and AI assistants, but it depends on how the site is rendered and where it is hosted. A site that builds its content in the browser with JavaScript looks almost empty to AI crawlers like GPTBot and ClaudeBot, because they do not run JavaScript.
What GPTBot sees
<body> <div id="root"></div> <script src="/app.js"> </body>0 words
With Prebaked
Example page. Bots and people get the same content: the page your visitors' browsers already build.
At a glance
| Builder | What it generates | What crawlers get by default |
|---|---|---|
| Lovable, apps created from 13 May 2026 | TanStack Start with server-side rendering | Fully rendered HTML for people and crawlers, according to Lovable |
| Lovable, older apps | React + Vite single page app | On Lovable hosting: pre-rendered HTML for verified crawlers. Hosted elsewhere: the app shell, unless your host or a prerender service renders it |
| Bolt | React, Vite, Tailwind CSS and Node.js by default | A client-rendered app unless pre-rendering is added. See Bolt SEO below |
| v0 | Next.js, React, TypeScript, Tailwind CSS and shadcn/ui | Pages are server-rendered by default in the Next.js App Router. Content loaded in the browser after the page starts is not in the HTML |
Sources: Lovable SEO and AI search docs, Bolt website builder page, v0 FAQ, Next.js docs.
The problem: client-rendered apps send an empty page
A React + Vite single page app sends the browser a short HTML file with a script tag. The text, headings and links appear only after the JavaScript runs. Your visitors never notice, because their browser runs it.
Crawlers are different:
- Google queues pages for rendering and runs the JavaScript in a headless Chromium "once Google's resources allow". Google also notes that "not all bots can run JavaScript". (Google Search Central)
- AI crawlers do not run it. Vercel and MERJ found in December 2024 that "none of the major AI crawlers currently render JavaScript", including OpenAI's GPTBot, OAI-SearchBot and ChatGPT-User, ClaudeBot and PerplexityBot. ChatGPT and Claude crawlers fetch JavaScript files but do not execute them. Gemini uses Googlebot's infrastructure and can render.
So a client-rendered page can rank on Google and still be close to empty for ChatGPT, Claude and Perplexity. More on this on How AI crawlers see your site.
Lovable SEO: what Lovable does for you
Lovable documents two cases:
- New apps (from 13 May 2026) use TanStack Start with server-side rendering. Lovable says "every request returns fully rendered HTML, for humans and crawlers". These apps need a host that runs server code.
- Older React + Vite apps "use on-request pre-rendering on deployed public URLs". People get the single page app. Verified crawlers get rendered HTML. Lovable lists Google, Bing, social-preview bots and AI engines like ChatGPT, Perplexity, Claude and Gemini. Lovable also says that "Lovable-hosted projects do not need an external pre-rendering service for search engines or AI crawlers".
So, is Lovable good for SEO? On Lovable hosting, crawlers get readable HTML. Lovable is also clear that rendering does not guarantee rankings: content, search intent, links and competition still decide.
Where the gap remains: Lovable's docs say older React + Vite apps "build to static files that any static host can serve", and list Netlify, Cloudflare Pages, Vercel and nginx as options. The docs describe pre-rendering as part of Lovable's deployed URLs and do not describe it for other hosts. If you export an older Lovable app and host it yourself, crawlers get the static app shell unless something renders it for them.
Bolt SEO
Bolt says it generates websites "using React, Vite, Tailwind CSS, and Node.js by default". A React + Vite build is a client-rendered single page app unless pre-rendering or server rendering is added. Bolt can publish to its own hosting or to Netlify.
If your Bolt site is hosted on Netlify or your own server, check it as described below.
v0 SEO
v0 "defaults to Next.js" and its FAQ lists the stack as Next.js, React, TypeScript, Tailwind CSS and shadcn/ui. In the Next.js App Router, layouts and pages are Server Components by default, and Client Components are also prerendered to HTML on the first load. That means most v0 pages already send real HTML.
Two things to check:
- Content that a Client Component fetches in the browser, for example in
useEffect, is not in the first HTML. Crawlers that do not run JavaScript miss it. - If you asked v0 for another framework, or exported a Vite app, treat it like any other single page app.
How to check your own site
- Run the free checker. It fetches your page without JavaScript and with a real browser, and compares the word count and headings.
See what ChatGPT sees on your site
- Look at the raw HTML. Open
view-source:in your browser, or fetch the page with curl. If the body is one emptydivand a script tag, crawlers that do not run JavaScript see nothing.
curl -s https://www.<your-domain>/ | grep -o "<h1[^>]*>.*</h1>"
No h1 in the output means the heading is added by JavaScript.
- Check Google separately. Use the URL Inspection tool in Google Search Console to see the HTML Google rendered.
Note for Lovable-hosted sites: Lovable serves pre-rendered HTML only to verified crawlers. A curl request with a bot user agent from your own computer is not verified, so it shows the app shell even when Lovable's pre-rendering works.
Your options
| Option | Good for | Trade-off |
|---|---|---|
| Stay on the builder's hosting and use its rendering | Lovable sites on Lovable hosting | Tied to that host. Check what each crawler gets |
| Upgrade to server-side rendering (Lovable TanStack Start, Next.js) | New projects and sites you can rebuild | Needs a host that runs server code. Lovable's upgrade uses credits |
| Prerender at build time | Small sites with a fixed set of pages | Pages with live data go stale until the next build. See the React SEO guide |
| A prerender service such as Prebaked | Exported or self-hosted Vite apps, or sites where a rebuild is not worth it | One more service in front of your site |
When Prebaked is the right choice
Prebaked fits when your Lovable, Bolt or v0 app is a client-rendered single page app hosted outside the builder, for example on Netlify, Vercel, Cloudflare or your own nginx server.
- You add one snippet: Netlify Edge Function, Vercel middleware, Cloudflare Worker or another integration.
- Crawlers get the finished page, rendered in a real browser. People get your site exactly as before. The content is the same for both.
- If Prebaked is slow or down, crawlers get your original page. Never worse than today.
- You can see which bots fetched which pages.
Prebaked does not need changes to the code your builder generated, so you can keep editing in Lovable, Bolt or v0. It does not guarantee rankings or mentions in AI answers. It makes sure crawlers can read the page.
FAQ
Is Lovable good for SEO?
On Lovable hosting, yes for crawling: Lovable serves rendered HTML to verified search and AI crawlers, and new apps use server-side rendering. Rankings still depend on content, links and competition. If you host an older Lovable app elsewhere, crawlers that do not run JavaScript get an empty app shell.
Can ChatGPT read my Lovable or Bolt site?
ChatGPT's crawlers do not run JavaScript, according to Vercel and MERJ. They can read your site if the server sends finished HTML, through server rendering, the builder's own pre-rendering or a prerender service. Run the free checker to see what your page sends without JavaScript.
Are v0 sites SEO friendly?
v0 builds Next.js apps by default, and Next.js renders pages on the server by default. Most v0 pages send real HTML. Check pages that load their main content in the browser after the page starts.
Do I need to rebuild my app to fix this?
No. A prerender service sits in front of your site and gives crawlers the rendered page. Rebuilding with server-side rendering is the other option and is a good choice when you can afford the rewrite.
Is serving crawlers a prerendered page cloaking?
Not when the content is the same. Google's guidance on dynamic rendering says Googlebot does not treat it as cloaking as long as it "produces similar content". Prebaked renders your page as it is and does not change it for bots.