Skip to content
BlackFig

Bolt SEO: why your Bolt site isn't showing up in Google and how to fix it

AntPublished Updated 4 min read

Checked against Bolt's documentation on 10 November 2026.

Quick answer

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.

On this page
  1. Symptom
  2. Why it happens
  3. The fix
  4. How to prevent it
  5. When to get help

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.host address.
  • 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

  1. Click Publish and check the visibility is Public.
  2. 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.
  3. 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 -1

If 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.xml

And 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 curl test 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.

Sources

The vibe-code rescue checklist, as a PDF

About 40 checks across auth, data, payments, errors, mobile and secrets, on two pages.

You get the PDF now and two short follow-ups over the next week. Reply “stop” and the rest never arrive.

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