October 2026 · Lovable · n=24

Lovable SEO fix

In the October 2026 sample, Lovable's median was 38.7 out of 75 and 21.7% of rendered sites were fully readable. The usual miss is the first HTML response: the text, the H1, and the head tags a crawler can store without running JavaScript.

By Halim, founder of Readabot. Updated .

Confirm it on your URL

Run the custom domain through the AI visibility checker. Read the Readable rows and the Discoverable rows. A provisional readable score, when no headless browser is bound, still tells you whether the raw HTML has 200 words and one H1. The builder median and the site list are on the Lovable page. The weights are methodology, readable.

Lovable's own SEO documentation was not re-fetched for this page, so nothing below is a quotation from it. The October scan also stored no stack marker, so these steps are not split into "new SSR apps" and "older apps". They follow the failure order in the snapshot.

Fixes, in the order the sample failed them

  1. Put exactly one H1 in the raw HTML — failed on 83.3% of 24 sites.

    The check counts H1 elements in the first response, before JavaScript runs. Zero H1s fails. Two or more fails. The H1 should be the page topic, and it has to be in the HTML a crawler saves, not only in a client component that renders later.

    <main>
      <h1>Invoice tracking for freelance studios</h1>
      <p>Send a branded invoice and see who has opened it.</p>
    </main>
  2. Put the headline and the opening paragraph in the server HTML — failed on 79.2% of 24 sites.

    Fully readable means the raw HTML already holds at least 80 percent of the words a headless browser sees after JavaScript. In this sample that bar was missed on most sites. A client-only shell, an empty div, and a bundle do not count as the article. If the app was generated as a single-page client render, the text has to be in the first HTML document: server-rendered, pre-rendered, or written into the static file the host returns.

    Ask the builder to change the homepage so the first HTML response includes the h1 and the opening paragraph as real text, not only after hydration. Keep one h1. Do not move the copy into a client-only route.
  3. Publish /llms.txt as text, starting with a heading — failed on 54.2% of 24 sites.

    The check requests /llms.txt. It passes when the response is 200, the body is text or Markdown, and it starts with a level-1 heading. llms-full.txt is one extra point. The weight is small on purpose. Publish the file anyway if you want the point, and do not expect it to carry the score.

    # Example Studio
    
    > Invoice tracking for freelance studios.
    
    ## Pages
    
    - [Home](https://example.com/): what the product does
    - [Pricing](https://example.com/pricing): plans and limits
  4. Add a canonical link to the custom-domain URL — failed on 54.2% of 24 sites.

    The check looks for link rel=canonical in the raw head. Point it at the public custom domain, not a default lovable.app host. Those default hosts are excluded from the Readabot sample and they split signals if both URLs stay live.

    <link rel="canonical" href="https://example.com/" />
  5. Print JSON-LD in the raw HTML — failed on 50% of 24 sites.

    Organization or WebSite in the first response is enough for this check. JSON-LD that appears only after JavaScript runs gets a partial score, because crawlers that skip JavaScript never see it. Do not add a review rating you did not collect.

    <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "WebSite",
      "name": "Example Studio",
      "url": "https://example.com/"
    }
    </script>

A prompt you can paste

Update the homepage so the first HTML response includes:
- exactly one h1 with the page topic
- the same headline and opening paragraph as text in that HTML, not only after hydration
- a link rel=canonical pointing at the custom-domain homepage
- a JSON-LD script with @type WebSite or Organization
- a public /llms.txt that starts with a markdown h1
Do not hide the copy behind a client-only route.

Re-check

Deploy, then check the same URL. Cached results last 24 hours, so a repeat inside that window returns the stored row. Data as of October 2026: the October report.