Is my Lovable app invisible to Google?
Probably not invisible to Google. Very likely invisible to
ChatGPT, Claude, Perplexity and every link preview. The reason is one empty
<div>, and you can check for it in ten seconds.
Lovable, Bolt and most AI app builders make the same kind of app: a single-page React app built with Vite. It's a sensible choice for the thing you're building, which is an app. It's a poor one for the thing that has to get found, which is the page that says what the app is.
What a crawler actually gets
When a browser asks for your home page, your host sends back something like this, whatever is on the screen a second later:
<!doctype html>
<html lang="en">
<head>
<title>my-app</title>
<meta name="description" content="Lovable Generated Project" />
<script type="module" src="/assets/index-DxQ1v3Zk.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
Everything you wrote, the headline, the pricing, the reasons to sign up,
is inside that JavaScript file. Your browser runs it and fills in the
root. Anything that doesn't run JavaScript sees an empty page
with the title "my-app".
Who runs the JavaScript and who doesn't
| Reader | Runs JavaScript? | What it sees |
|---|---|---|
| Yes, later | Your page, usually, after a delay. It fetches the HTML first and renders it when it gets round to it. | |
| Bing | Sometimes | Less reliable than Google. |
| ChatGPT, Claude, Perplexity crawlers | No, as far as anyone has measured | The empty page. |
| Link previews (Slack, LinkedIn, WhatsApp, iMessage, X) | No | Whatever is in the raw <head>: often the builder's default title and picture. |
So Google can find you, a bit slower than it would otherwise. But when someone asks an AI assistant for "booking software for dog groomers", the assistant can only recommend what it could read, and it couldn't read you. It will describe you from other people's pages, or not at all.
There's a second, quieter problem. Every route in the app is served the same HTML, so every page has the same title and description unless something sets them in JavaScript. To a crawler, your pricing page and your home page are the same page.
Check yours
Open your site, then use View Page Source (not Inspect; Inspect shows the page after JavaScript has run). Search for a sentence from your headline. If it isn't there, crawlers don't see it either.
Or from a terminal:
curl -s https://yourapp.com/ | grep -c "<p"
A count of 0 means no paragraphs in the HTML a crawler receives.
The visibility check does this for you, names the builder it thinks made the page, and gives a fix prompt written for it.
Fixes, smallest first
- Fix the head of index.html
Five minutes, no rebuild of anything. Give
index.htmla real title, a description that says who it's for and what it does, and your own Open Graph image. It won't put your copy in front of crawlers, but every link preview and every search result stops saying "Lovable Generated Project". - Prerender the public pages Have the build produce real HTML for the pages that need finding (home, pricing, about, each feature page) while the logged-in app stays as it is. In a Vite app that's a prerender step in the build; ask your AI tool to add one and to give each prerendered route its own title and description. This is the fix that keeps your app's code almost untouched.
- Put the marketing site somewhere else
Build the public pages as a plain static site (hand-written HTML, Astro, or
whatever your builder exports) at your main domain, and move the app to
app.yourdomain.com. More work once, and the cleanest split: pages for being found, an app for being used. - Move to a framework that renders on the server Next.js, Remix and similar send real HTML by default. It's the biggest job here and worth it only if the app itself has pages that need to rank, like listings or profiles.
Whichever you choose, add a public/sitemap.xml and a
public/robots.txt. An SPA host answers every unknown address
with your app's HTML, so without real files at those paths a crawler asking
for your sitemap gets your home page instead.
A prompt to paste
My site is a client-side Vite + React app, so crawlers and AI bots get an
empty <div id="root"> with no text. Make the public pages (home, pricing,
about, each feature page) render real HTML at build time by adding a
prerender step, and keep the logged-in app as it is. Every public page
should have its own <title>, meta description, Open Graph tags and
visible text in the HTML that's served. Add public/sitemap.xml listing
those pages and public/robots.txt pointing to it.
Then view source again. If your headline is there, so is everyone else's ability to read it.
One more trap: #sections
Builders like one long page with the navigation jumping to
#pricing, #features and so on. Search engines
ignore everything after the #, so all of that is one URL, and
one URL can only rank once. If a section is worth finding on its own, give
it a page of its own.
Is anyone finding yours?
The visibility check reads your site the way a crawler does and tells you what it couldn't see, with a fix prompt for each finding.
Check my site, free