More and more people ask ChatGPT, Claude or Perplexity "what's the best tool for X?" instead of searching Google. If your product doesn't show up in those answers, you don't exist for that audience. This is called AEO (Answer Engine Optimization), and AI-built apps start with a handicap: because of how the tools generate them, most of them show AI bots a blank page. This guide explains why it happens to these apps in particular, how to check it in two minutes and what to fix depending on the tool you built with.
Why it happens to AI-built apps in particular
Lovable, Bolt, v0 and most of the templates Cursor uses generate an SPA by default: a single-page application with Vite and React where the HTML that reaches the browser is nearly empty and JavaScript paints everything afterwards. It is the right architecture for a dashboard behind a login, but those tools use it for the landing page, the pricing page and the blog too. Three consequences:
- The content is not in the HTML. The server sends a
<div id="root"></div>and little else. What you see is built by the browser. - Neither is the metadata. The title, the description and the sharing tags are set from JavaScript, so a bot that does not run it sees the template's generic title.
- One domain for everything. The public part and the private part share code, and nobody stops to think about what should be readable from outside.
The catch is that many AI crawlers don't run JavaScript, or do so with limits. Googlebot does render, though late and with a limited budget; the bots from OpenAI, Anthropic or Perplexity mostly read the HTML as it arrives. To them your app is a blank sheet: they cannot understand what you do or cite you.
What a bot sees of your site
This is, almost literally, what a crawler receives from an app generated with one of these tools:
<!doctype html>
<html>
<head>
<title>Vite + React</title>
<script type="module" src="/assets/index-a1b2c3.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
Not a single sentence about your product. If on top of that the template ships a robots.txt that blocks crawlers, or your CDN has an anti-bot mode turned on, the door is closed twice.
How to know if it affects you (two minutes)
- View source. Open your site, right-click, "View page source" (not "Inspect", which shows the already rendered result). Look for your headline and a paragraph. If they are not there, bots do not see them either.
- Without JavaScript. Disable it in the browser and reload. What remains is what a basic bot sees.
- As ChatGPT's bot. From the terminal, request the page with its user agent and count the words that arrive:
curl -s -A "GPTBot" https://yourdomain.com/ | sed 's/<[^>]*>//g' | wc -w
A few dozen means the content lives in the JavaScript. Several hundred means it arrives in the HTML. The detail of which bot does what is in how to know if ChatGPT can see your site.
The five things that fix it
1. Public content that arrives in the HTML
You do not need to server-render the whole app; just the pages you want AI to understand: home, product, pricing, blog, FAQ. Three paths, from least to most work:
- Prerender at build time. A prerender plugin for Vite generates a full HTML file for every public route when you build. It works well for pages that do not change on every visit.
- Separate the website from the product. Landing, pricing and blog on a static site (Astro, Webflow, Framer, even Nuxt or Next in static mode) at
yourdomain.com, and the app as an SPA atapp.yourdomain.com. It is the healthiest architecture and the closest to what mature products do. - Migrate the public part to an SSR framework (Next.js, Nuxt, SvelteKit). More work, but the problem goes away for good.
2. Metadata in the HTML, not in JavaScript
Title, description and Open Graph tags must be in the initial HTML. If you prerender or separate the site, this comes for free. If not, at least put a real title and description in index.html instead of the template's.
3. Structured data that says what you are
A JSON-LD block with Organization and SoftwareApplication gives the model unambiguous facts: name, what it does, price, where it is. If you have frequently asked questions, mark them up as FAQPage. The how is in structured data: why AI cites some sites and not others.
4. An llms.txt
A text file at the root of the domain that sums up what you are in one sentence and lists your important pages. Neither mandatory nor magic, but it is a clean entry point and it forces you to write the sentence that defines your product. There is a free llms.txt generator.
5. Not blocking bots by accident
Review robots.txt: a copied template or a Disallow: / left from testing shuts the door on GPTBot, ClaudeBot and friends. And check your CDN's anti-bot mode. You can see which AI crawlers you allow with the AI crawler checker.
What is not needed
You do not need AI to see your private dashboard: nothing behind a login is read by anyone, and that is how it should be. You do not need to rewrite the app either. The goal is that the four or five pages explaining what you do are readable without JavaScript, nothing more.
How to measure it over time
Two signals. In your server or CDN logs, filter by the AI bots' user agents and see which pages they request; if none shows up, check robots.txt first. And once a month, ask ChatGPT, Claude and Perplexity about your category and your brand, and note whether they mention you and describe you correctly. That round is your baseline; everything else is guesswork.
Scanaris checks it in 30 seconds
The AI visibility pillar of Scanaris reviews whether your content is readable without JavaScript, whether your metadata arrives in the HTML, whether you have structured data and an llms.txt, and whether you block AI bots in robots.txt. For every failure it gives you a fix prompt to paste into Lovable, Bolt or Cursor with the exact fix. And the visibility tracker watches every day whether you show up when someone asks for a recommendation in your category. For the full context, start with what AEO is.
Frequently asked questions
Does Google also see my app as blank?
Google renders JavaScript, but in a second pass that can take days and with a limited budget per site. An app that arrives empty gets indexed worse and later. Fixing it for AI improves your SEO too.
Can Lovable, Bolt or v0 render on the server?
They generate SPAs by default. The practical fix is to prerender the public pages or move the marketing site to a separate static site and keep the app on a subdomain.
Is publishing an llms.txt enough?
No. It is a useful complement, but if the HTML arrives empty the bot still cannot read your pages. Content in the HTML first, then the rest.