Bolt SEO: why your Bolt site isn't showing up in Google and how to fix it
If your Bolt project is a client-rendered Vite app, crawlers that don't run JavaScript see one near-empty HTML file with the same title on every URL. Publish publicly on a custom domain, use real paths instead of #/ URLs, give each route its own title and description, add robots.txt and a sitemap in public/, and prerender the pages that need to rank.
Bolt is good at making a site look finished. Search engines don't see the look, they see the HTML your server sends and the links in it. On a Bolt web app those two things can be very thin, and a few Bolt publishing settings can hide the site from search altogether. Check the settings first, because they take minutes, then deal with rendering.
A quick way to tell what you're working with: Bolt's docs name database variables like VITE_SUPABASE_URL, and the VITE_ prefix is the Vite convention. If your .env and index.html look like a standard Vite app, your pages are built in the browser after the JavaScript loads.
Symptom
- Searching your brand name doesn't find the site, or finds the
bolt.hostaddress. - Every page shows the same title and description in search results and link previews.
- Shared links on LinkedIn or Slack show no image or the wrong text.
- Google Search Console's page indexing report lists pages under statuses like these:
Why it happens
The site is private, or on the wrong address. Bolt's docs say public sites can be found by search engines, and private sites can't. Team admins can force every team project to private. On the Free plan all sites are public, but custom domains need a paid plan, so the site lives on a bolt.host address.
One HTML file serves every page. A client-rendered app sends the same index.html for every URL, then builds the page in JavaScript. Google's docs say Google can render JavaScript, but also that pre-rendering is still worthwhile because not all bots can run JavaScript.
#/ URLs aren't separate pages. Bolt's comments docs show a page path like /#/favorite-items. Google's docs say to use the History API instead of fragments, because it only discovers links that are real <a href> elements with paths it can follow.
Not-found pages return a success code. Google's docs warn that client-side routing makes proper 404 status codes hard, which leads to soft 404s.
No robots.txt or sitemap. Nothing in Bolt's docs says one is created for you, so check your public/ folder.
The fix
1. Get the publishing settings right
- Click Publish and check the visibility is Public.
- On a paid plan, connect your custom domain. In project settings under Domains & Hosting, add other domains (such as
www) with Add domain alias. Bolt's docs say aliases forward to the primary domain, which avoids duplicate content. - Publish again after every change. Bolt doesn't push edits to the live site until you click Update.
2. See what crawlers see
Fetch a page without running JavaScript:
curl -s https://yourdomain.com/pricing | grep -iE "<title>|name=\"description\"|og:"
curl -sI https://yourdomain.com/this-page-does-not-exist | head -1If the pricing page returns the homepage title, step 4 matters. If the made-up URL returns 200, you have soft 404s.
3. Switch from hash URLs to real paths
If your URLs contain #/, the app uses a hash router. With React Router, swap it for a browser router:
// src/main.tsx (React Router v7 and later; on v6, import from "react-router-dom")
import { createRoot } from "react-dom/client";
import { BrowserRouter } from "react-router";
import App from "./App";
createRoot(document.getElementById("root")!).render(
<BrowserRouter>
<App />
</BrowserRouter>,
);Then publish and open a deep link such as /pricing directly, and refresh it. If the published site returns an error instead of the page, ask Bolt to set up a fallback to index.html for unknown paths before you go further. Make sure navigation uses real links (<Link to="/pricing">), not buttons that call navigate().
4. Give every route its own title, description and canonical
React 19 lets any component render <title>, <meta> and <link>, and places them in the document head. Check package.json for your React version. On React 18 you'd need a library such as react-helmet-async instead.
// src/components/Seo.tsx (React 19)
type SeoProps = { title: string; description: string; path: string };
export function Seo({ title, description, path }: SeoProps) {
const url = `https://yourdomain.com${path}`;
return (
<>
<title>{`${title} | Your Brand`}</title>
<meta name="description" content={description} />
<link rel="canonical" href={url} />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:url" content={url} />
</>
);
}Render <Seo /> once per page, never twice: React's docs warn that multiple titles at once leave browsers and search engines guessing. Keep sensible defaults, including an og:image, in index.html for bots that don't run JavaScript.
5. Add robots.txt and a sitemap
Vite copies everything in public/ to the root of the build as-is, so these files are served at /robots.txt and /sitemap.xml:
# public/robots.txt
User-agent: *
Allow: /
Sitemap: https://yourdomain.com/sitemap.xmlAnd public/sitemap.xml, listing every page you want indexed:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>https://yourdomain.com/</loc></url>
<url><loc>https://yourdomain.com/pricing</loc></url>
</urlset>Submit the sitemap in Google Search Console.
6. Prerender the pages that need to rank
Steps 1 to 5 make a client-rendered app indexable by Google. For pages that need to rank, or need reliable link previews everywhere, the HTML should arrive complete. That means prerendering at build time or moving those pages to a framework that renders on the server. Bolt's docs say it supports any JavaScript framework that runs on the frontend, but switching frameworks in an existing project is close to a rebuild, so it's often simpler to put marketing pages on a separate, server-rendered site and keep the app on Bolt.
7. Use what Bolt gives you
- Turn on the Bolt-curated SEO/GEO skill: click your project name, then Skills. It's off by default.
- Add alt text with visual edits: select an image with the Select tool and fill in Alt text.
- On a paid plan, Analytics lists top "not found" pages. Bolt notes the numbers include crawler traffic.
How to prevent it
- Decide early which pages need to be found in search, and plan how they'll be rendered.
- Use real paths from the first prompt.
- Make "every page sets its own title and description" one of the rules in a project skill.
- Check new pages with the
curltest before announcing them.
When to get help
If search traffic matters to the business, rendering is an architecture decision, not a tweak. Speed affects it too, so read Bolt app slow, and broken phone layouts hurt rankings as well as conversions, which Bolt mobile layout broken covers. The fix guide for vibe-coded apps covers the wider set of problems, and taking a Bolt app to production has the full launch checklist.
Start with the free vibe-code health check. If the site needs fixing rather than tweaking, a Rescue Sprint is an audit plus fixes at a fixed price agreed after a technical assessment (from £750), usually in about a week.
- Bolt help: Publish your project to a live website, checked 10 November 2026
- Bolt help: Domain aliases, checked 10 November 2026
- Bolt help: Hosting analytics, checked 10 November 2026
- Bolt help: Use skills (SEO/GEO skill), checked 10 November 2026
- Bolt help: Make visual edits (alt text), checked 10 November 2026
- Bolt help: Comments (page paths), checked 10 November 2026
- Bolt help: Introduction to databases (environment variables), checked 9 November 2026
- Bolt help: Supported technologies, checked 10 November 2026
- Google Search Central: JavaScript SEO basics, checked 9 November 2026
- Google Search Console Help: Page indexing report, checked 9 November 2026
- React docs: title, checked 9 November 2026
- React docs: meta, checked 9 November 2026
- Vite docs: The public directory, checked 9 November 2026
- React Router docs: Declarative installation, checked 10 November 2026
The vibe-code rescue checklist, as a PDF
About 40 checks across auth, data, payments, errors, mobile and secrets, on two pages.
Questions founders ask
Can Google index a Bolt site?
Yes, if it is published publicly. Bolt's docs say public sites can be found by search engines and private sites can't. Google can render JavaScript, but its docs note that not all bots can, so pre-rendering still helps.
Does Bolt have built-in SEO settings?
Bolt has a curated SEO/GEO skill you can turn on per project, and an alt text option in visual edits. Its help centre doesn't currently document a prerendering setting for Bolt hosting.
Do I need a custom domain for SEO on Bolt?
It helps. Custom domains need a paid plan, and Bolt's domain aliases forward visitors to one primary domain, which Bolt says helps SEO and avoids duplicate content.
Why does every page of my Bolt app share the same title?
A single-page app ships one index.html, so unless each route sets its own title and description, every URL shows the defaults from that file.

Ant
Product designer who builds MVPs, based in Nottingham. 10+ years designing digital products, and the only person at BlackFig. More about me