You built your app in Lovable, pushed it to GitHub, and deployed it on Vercel, Netlify, Cloudflare Pages, or your own server with a custom domain. It looks great in a browser. But Google Search Console shows "Discovered – currently not indexed" or "Crawled – currently not indexed," searching for your brand turns up nothing, and shared links have no title or preview image.
A Lovable project is a client-side rendered (CSR) single-page app built with Vite and React. The HTML your host sends for every URL is basically the same shell:
<body>
<div id="root"></div>
<script type="module" src="/assets/index-abc123.js"></script>
</body>
The real content only appears after the browser downloads and runs that JavaScript. That's why the root div is empty in the raw response: React fills it in later, on the visitor's device.
<title> and description unless something on the server changes them, which makes pages look like duplicates.1. Fetch the page as Googlebot with curl.
curl -s -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://www.yourdomain.com/ | head -c 3000
If you see your headline and paragraphs, crawlers get content. If you see <div id="root"></div> and script tags, they don't. Try a deeper route too, like /pricing, and check whether the <title> changes.
2. Use Search Console URL Inspection. Paste a URL into the inspection bar, then click Test live URL and View tested page to see the rendered HTML and screenshot Google produced. Compare it with the HTML tab of the crawled page. If rendered content is missing or the page is listed as not indexed, rendering is part of the problem.
3. Or run the free CrawlFixer scan. No signup. It fetches your page with and without JavaScript and lists what's missing: visible text, title, description, canonical, Open Graph tags, robots.txt, and sitemap.
1. Prerender at the edge (fastest, no code changes). A prerendering layer sits in front of your host. Crawlers get a fully rendered HTML snapshot; people get your normal app. Google calls this dynamic rendering and accepts it when crawlers and users see the same content. CrawlFixer does this with one DNS record (www CNAME customers.crawlfixer.com) and keeps your existing host as the origin. See Connecting your domain.
2. Build-time prerendering. Plugins can snapshot your routes into static HTML during vite build. Good for a few fixed marketing pages; harder with dynamic routes or content from Supabase that changes often.
3. Move to SSR. Porting to Next.js, Remix, or Astro renders HTML on the server. It's thorough, but usually means rewriting routing and data loading in a codebase you didn't hand-write.
<title> and meta description per page, present in the HTML crawlers receive, not only set at runtime.www or the bare domain and redirect the other).sitemap.xml listing your routes, submitted in Search Console under Sitemaps. Many Lovable exports don't ship one.robots.txt that doesn't block your assets and points to the sitemap.<a href> links between pages so crawlers can discover them.og:title, og:description, og:image) so shared links get previews.Paste your URL into the free scan to see exactly what Google and AI crawlers receive. If it's an empty root div, you can start a 7-day free trial, no card needed, and have crawlers seeing real pages today. Plans are $12/month per site after that.
Related: Why your Bolt.new site isn't on Google · Replit app SEO · React SPA SEO without Next.js
CrawlFixer is not affiliated with Lovable, Google, Vercel, or Netlify.