Field notes Field note 02

Lovable SEO: Making Your Lovable Site Readable by Google

Lovable SEO explained: why client-rendered React sites are hard to read on first fetch, what Lovable now offers, and how to check with view-source.

· Updated · 6 min read

Lovable SEO questions almost always start the same way: the site looks great in the browser, but Google shows a blank snippet, or the page never gets indexed. This article explains why that happens, what Lovable and the wider ecosystem now offer, and how to check your own site in about five minutes without any special tools.

Lovable is a good tool, and this is not a warning against using it. It is a description of one technical property, how a page's content reaches the crawler, and what to do about it.

What Google receives from a client-rendered site

Projects created with Lovable before May 2026 use React and Vite. According to Lovable's FAQ, these older apps "render in the browser". That means the HTML file the server sends is nearly empty. It contains a <div id="root"></div> and a script tag. The headings, paragraphs and links appear only after the browser downloads the JavaScript and runs it.

That is called client-side rendering, and it works fine for people. For search engines it adds a step. Google's JavaScript SEO basics describe it: Googlebot crawls the URL, then queues pages with a 200 status for rendering, where the JavaScript is executed. The page "may stay on this queue for a few seconds, but it can take longer than that."

So Google can usually read client-rendered pages. The risks are practical:

  • Delay. Content is seen after a render queue, not on first fetch.
  • Other crawlers. Google explicitly notes that some bots cannot run JavaScript. Link preview bots for chat apps and social networks, and many AI crawlers, may see only the empty shell.
  • Fragile details. Titles, canonicals and robots tags set by JavaScript may not behave as you expect. Google says the best way to set a canonical URL is in HTML, and that a noindex tag may stop rendering from happening at all.
  • Silent failures. One JavaScript error, a blocked script file or a slow API call, and the rendered page is empty. Nothing tells you.

None of this means a Vite site cannot rank. It means the outcome depends on more moving parts than a page whose HTML already contains the content.

Lovable SEO: what Lovable does about it

Lovable has changed its stack, so which advice applies depends on when your project was made. From the Lovable FAQ:

  • Apps created from May 13, 2026 use TanStack Start, which renders pages on the server. The page arrives as finished HTML.
  • Older React and Vite apps render in the browser, and Lovable serves pre-rendered copies of published pages to verified search engines, social preview bots and AI crawlers.
  • Lovable's SEO and AI search review checks metadata, indexing, structured data, Open Graph previews, your sitemap and robots.txt.
  • Older projects can upgrade to TanStack Start. The upgrade uses credits, keeps titles, meta descriptions and analytics, and is something you can revert from version history. Lovable warns that browser-only code can break server rendering, so test every page afterwards.

If your project is new, you may already be fine. If it is older, you may be relying on the crawler pre-render, which is worth verifying instead of assuming.

Check 1: view-source, the five minute test

This shows what a server sends before any JavaScript runs.

  1. Open your page in Chrome.
  2. Press Ctrl+U (Cmd+Option+U on Mac), or type view-source: in front of the URL.
  3. Search the source for a sentence from your page body, and for your <h1>.

If you find your headline and body text, the content is in the HTML. If you see only an empty root div, the page is client-rendered for ordinary visitors.

Note that "Inspect" or the Elements panel shows the page after JavaScript ran, which is not the same thing. View-source is the raw response.

For a terminal check, run curl -s https://yoursite.com/page | grep -c "<h2". A count of zero on a page that clearly has subheadings tells you the same story.

Check 2: URL Inspection in Search Console

View-source shows what a plain request gets. Google Search Console's URL Inspection tool shows what Google got.

  1. Add and verify your site in Search Console.
  2. Paste a page URL into the inspection bar.
  3. Open View crawled page to see the HTML Google stored, and the screenshot if present.
  4. Run Test live URL to see a fresh render and any resources that failed to load.

Look for these problems: the rendered HTML is missing your body text, the screenshot is blank, a script or API request is listed as blocked, or the page is reported as "Crawled, currently not indexed" with thin content.

Check 3: the details that break independently of rendering

Even with perfect rendering, these issues sink Lovable sites and any other site:

  • Unique titles and descriptions per route. Every page showing the same <title> is a common default.
  • Real links. Google can only discover links that are <a> elements with an href. A button with an onClick that navigates is invisible to it.
  • A sitemap and robots.txt that list the real URLs.
  • A real 404. Single page apps often return a 200 status for missing pages, which Google treats as soft 404s. Google's guidance is to redirect to a URL that returns a true 404 or add noindex on error pages.
  • A canonical tag that points at the right URL, ideally in the HTML.

Your options, from smallest to largest

Option 1: Use what Lovable provides. For a new project, you already have server rendering. For an older one, confirm that the pre-rendered version is what crawlers get, using the checks above, and run Lovable's SEO review.

Option 2: Upgrade the project to TanStack Start. This is the supported route for older projects, and it gives every visitor and every crawler finished HTML. Plan a test pass for every page and any code that touches window or document directly.

Option 3: Prerender at build time. A prerendering step generates static HTML files for each route when you build. It suits sites whose content changes only on deploy, such as marketing pages and blogs. Most content does not need live data, so this is often the best fit.

Option 4: Move the public pages to an SSR or SSG framework. Astro, Next.js and Remix can all produce HTML on the server or at build time. A common split is to keep the marketing site and blog in one of these, and keep the logged-in app, which does not need indexing, as a React single page app. This is how we built this site, and why this article's headings are in the raw HTML.

Option 5: Dynamic rendering. Serving crawlers a different version than users. Google lists this as a workaround rather than a long-term solution, so treat it as a stopgap.

A sensible order of work

  1. Run view-source on your five most important pages.
  2. Run URL Inspection on the same pages.
  3. Fix titles, descriptions, links, sitemap and 404 behavior. These cost the least.
  4. Decide on rendering: upgrade, prerender or split.
  5. After publishing, request indexing for key pages in Search Console and re-check in a few weeks.

One honest caveat: none of this guarantees rankings. Rendering only removes a barrier. Content quality, links and search demand still decide where you appear. But if Google cannot read the page reliably, nothing else you do matters.

If you want a quick look at what your pages send, our free scan checks what crawlers receive from your URL.

Before you go

Is your tracking actually working?

Paste your URL. We check whether GTM, GA4, Meta Pixel and Consent Mode are on the page, and whether Google can read it without JavaScript. The results come by email.

Free. We only read what any visitor's browser can see.