In short
- Bolt projects are often Vite + React single-page apps, which send the same near-empty HTML for every URL. Check yours with curl.
- Fix rendering first: add a build-time prerender step, or ask Bolt for a framework that outputs HTML, then confirm with curl after publishing.
- Give each route its own title, description and absolute canonical in the HTML, and make unknown URLs return 404 instead of the app shell.
- Bolt's SEO Boost prerendering is no longer in its current docs; use it if your settings still show it, otherwise don't count on it.
- Custom domains need Bolt Pro. For redirects, 404 control or CI, sync to GitHub and host on Netlify or Vercel.
A Bolt.new site can show up on Google once it is published publicly, but if your project is a typical Vite + React app, crawlers get one near-empty HTML file for every URL and have to run JavaScript to see anything. Google often does, later; many other crawlers and link previews don't. So the first fix is rendering: get each page's text, title and links into the HTML, either with a build-time prerender step or by building on a framework that outputs HTML. Then add per-page metadata, a sitemap and your custom domain. Bolt doesn't document how its hosting renders pages, so this guide shows you how to check what yours sends. For the wider picture, see SEO for AI-built websites.
What Bolt builds and where it runs
| Question | What Bolt documents | SEO meaning |
|---|---|---|
| Framework | JavaScript frameworks such as React and Vue; Bolt picks one unless your prompt names one | Check package.json: a Vite + React SPA needs extra work |
| Backend | JavaScript (Node.js) backends only | Server rendering is possible, but not the default for most projects |
| Default hosting | Bolt hosting with a free .bolt.host domain | How it serves routes (static vs server) isn't documented |
| Custom domains | Pro plans only | Needed to own your canonical host |
| Netlify | Optional provider; first publish creates a netlify.app URL | Netlify's redirect and prerender features apply |
| Visibility | Public sites can be listed by search engines; private sites can't | Publish publicly before testing |
The five-minute diagnosis
- Curl the published page
Terminal URL=https://your-domain.com/pricing # or https://your-site.bolt.host/pricing curl -s $URL | grep -o "<title>[^<]*" curl -s $URL | grep -o "<h1[^>]*>[^<]*" curl -s $URL | grep -c "<a href" # links a crawler can follow without JavaScriptTerminal $ curl -s https://your-site.bolt.host/pricing | grep -o "<title>[^<]*" <title>Vite + React + TS $ curl -s https://your-site.bolt.host/pricing | grep -o "<h1[^>]*>[^<]*" (no output) $ curl -s https://your-domain.com/pricing | grep -o "<h1[^>]*>[^<]*" <h1>Pricing for busy studios
Illustrative output. Top: a Vite + React Bolt project with the default index.html. Bottom: the same page after a prerender step. - Check unknown URLs, robots.txt and the sitemap
Terminal curl -s -o /dev/null -w "%{http_code}\n" https://your-domain.com/no-such-page # want 404 curl -s https://your-domain.com/robots.txt curl -s https://your-domain.com/sitemap.xml | head -3A
200for the missing page, or a sitemap URL that returns your app's HTML instead of XML, means every path is rewritten toindex.html. Netlify's docs describe exactly that for the common/* /index.html 200rule: it servesindex.htmlinstead of a 404, whatever URL is requested. The robots.txt tester and sitemap validator catch both. - See what Google gets
In Search Console, run URL Inspection, Test live URL, View tested page. If your copy shows up there but not in curl, Google renders it; other crawlers still won't. The free SEO checker shows the raw server HTML for one URL.
Fixes, in order of impact
- 1Real HTMLPrerender each public route, or use a framework that outputs HTML
- 2MetadataUnique title, description, canonical per route, in the HTML
- 3Real 404sUnknown URLs return 404, not the app shell
- 4Sitemap + robotsStatic files in public/, absolute URLs
- 5One hostCustom domain, then Search Console
1. Get real HTML for each public page
Turn on Bolt's SEO/GEO skill first (gear icon, Skills): it is one of Bolt's curated skills and is off by default. Then ask for a build-time prerender. Bolt's docs don't say whether its hosting runs custom build scripts, so publish and curl to confirm it worked.
Add a build-time prerender to this Vite + React app, without a headless browser:
1. src/seo.ts with the list of public routes and a unique title and description for each.
2. src/entry-server.tsx that renders a route with renderToString and StaticRouter.
3. scripts/prerender.mjs that runs after "vite build", writes dist/<route>/index.html with
the rendered markup and that route's <title>, meta description and canonical
(https://your-domain.com + path), plus dist/404.html with noindex and dist/sitemap.xml.
4. main.tsx: hydrateRoot when #root has content, createRoot otherwise.
Keep the design and copy exactly as they are.The full code for these files is in React SEO for Vite apps. If you are starting a new project and most of it is content, it is simpler to ask Bolt for a framework that outputs HTML from the start ("Build this as an Astro site", for example), since Bolt lets your prompt pick the framework.
2. Put per-page metadata in the HTML
With prerendering in place, each file gets its title, description and canonical from src/seo.ts. For client-side navigation, React 19 can render <title> and <meta> from any component. Ask Bolt to add Open Graph tags (og:title, og:description, an absolute og:image) the same way, so link previews work. Check lengths with the SERP preview.
3. Make unknown URLs return 404
On Netlify, a root 404.html is served for paths that don't match a file, so once every public route has its own HTML you can scope the SPA rewrite to the parts that need it:
# Only the logged-in app is client-side routed
/app/* /app/index.html 200Bolt doesn't document redirect or 404 settings for its own hosting. If the not-found curl still returns 200 there, have your not-found route add <meta name="robots" content="noindex">, which is Google's fallback advice for single-page apps.
4. Add robots.txt and a sitemap
User-agent: *
Allow: /
Sitemap: https://your-domain.com/sitemap.xmlFiles in public/ are copied to the build output as-is in Vite projects. Use absolute URLs on your custom domain in the sitemap, and list only public pages.
5. Move to your own domain and verify it
Custom domains need Bolt Pro. If you switch between Bolt hosting and Netlify, Bolt notes that custom domains don't carry over automatically, so re-point them. Then verify the domain in Search Console, submit the sitemap, and check that the .bolt.host or netlify.app address isn't what Google lists (search site:your-site.bolt.host). If it is, the absolute canonicals from step 2 are your main signal; redirect the platform host where your host allows it.
If you host on Netlify: the Prerender extension
Netlify's old built-in prerendering was shut down in early 2026. Its replacement, the Prerender extension, adds an edge function that sends requests from relevant crawler user agents to a function that renders the page in a headless browser. You enable the extension and redeploy; there is no extra fee beyond normal function usage. It is a quick bridge for an existing SPA, but it is dynamic rendering, which Google calls a workaround, and people and unlisted bots still get the empty shell. Prerendering at build time is the sturdier fix.
What you can and can't control
| Item | Bolt hosting | Netlify |
|---|---|---|
| Head tags, robots.txt, sitemap | Yes, as project files | Yes, as project files |
| Server rendering | Not documented | Via framework adapters or functions |
| Prerendering | SEO Boost, if still in your settings | Build-time prerender, or the Prerender extension |
| Redirects and 404 status | Not documented | _redirects and 404.html |
| Custom domain | Pro plan | Set up in Netlify; doesn't carry over from Bolt |
When to move the code off Bolt, and how
Move when you need things Bolt doesn't document (permanent path redirects, server rendering, header control), or when the prerender step has to run in CI you control. Bolt is still a fast way to build; you can keep it as the editor.
- Get the code
Connect GitHub: Bolt commits after each working change and pulls outside changes about every 30 seconds, so you can keep editing in both places. Or download a ZIP from the project title menu.
- Deploy it somewhere you control
Netlify works directly. Vercel has a guide for deploying a Bolt ZIP with Vercel Drop, which detects the framework. A Vite SPA on Vercel needs a rewrite to
index.html; scope it to client-only routes for the same 404 reason as above. - Hand the repo to a coding agent
Prompt for a coding agent This Vite + React app was built in Bolt and will be hosted at https://your-domain.com. Make every public route return its own HTML: prerender at build time (or migrate to React Router framework mode with prerender if that's simpler here). Each route needs a unique title, description and absolute canonical; unknown URLs must return 404; generate sitemap.xml from the route list. Done when curl on the preview deploy shows each route's <h1> and <title> and /no-such-page returns 404.
From there, npx serpkin sets up Claude Code, Codex or Cursor in the repo, registers the site and runs a first scan, which flags pages whose text isn't in the server HTML and groups small metadata fixes into one "Fix the basics" mission. Run npx serpkin check <preview-url> before you point the domain, to catch a lost title, canonical or sitemap.
Questions
Is Bolt.new good for SEO?
It builds quickly, but a typical Bolt project is a client-rendered Vite + React app, which crawlers see as an almost empty page. Prerender the public routes or use a framework that outputs HTML, then add metadata and a sitemap.
Why isn't my Bolt site showing up on Google?
Common reasons: the site is private or not published, the HTML has no content until JavaScript runs, every page has the same title, or there's no sitemap or Search Console property. Curl a page and check Search Console's Page indexing report.
How do I add a sitemap to a Bolt.new site?
Put a sitemap.xml with absolute URLs on your domain in the public/ folder (or generate it at build time), add a Sitemap line to public/robots.txt, then submit it in Search Console.
Does Bolt have prerendering?
Bolt used to document SEO Boost, which prerendered pages for search engines on projects with a custom domain. It's no longer in Bolt's current help center. A build-time prerender step works on any host.
Sources
- Bolt help: glossary (frameworks, choosing one in your prompt) (checked October 29, 2026)
- Bolt help: supported technologies (JavaScript backends) (checked October 29, 2026)
- Bolt help: hosting (.bolt.host, custom domains on Pro) (checked October 29, 2026)
- Bolt help: publish (public vs private sites) (checked October 29, 2026)
- Bolt help (archived Dec 2025): SEO Boost (checked October 29, 2026)
- Bolt help: skills (SEO/GEO skill, off by default) (checked October 29, 2026)
- Bolt help: Netlify integration (checked October 29, 2026)
- Bolt help: GitHub integration (checked October 29, 2026)
- Bolt help: project files (download ZIP) (checked October 29, 2026)
- Netlify docs: rewrites (SPA rule serves index.html instead of 404) (checked October 29, 2026)
- Netlify docs: custom 404 page (checked October 29, 2026)
- Netlify docs: Prerender extension (checked October 29, 2026)
- Netlify changelog: Prerender extension GA, legacy prerendering shutdown (checked October 29, 2026)
- Vercel: deploy a Bolt.new app with Vercel Drop (checked October 29, 2026)
- Google: JavaScript SEO basics (checked October 29, 2026)
- Google: dynamic rendering as a workaround (checked October 29, 2026)