On 27 September 2026 we fetched 105 sites made with AI app builders the way a crawler fetches them, without running any JavaScript. On 62 of them (59%) the crawler found under 300 characters a person could read. Yet 48 of those 62 carried a complete link preview: an image, a description and a card type for X. Paste such a link into a chat and it looks like a finished site. Read the HTML behind it and there is almost nothing there.
A link preview is assembled from a handful of tags in the <head> of the page, and so are the title and
summary that a search engine or an AI crawler starts from. None of it appears in the browser window, which is why the owner
of a site rarely looks. We read those tags on the same sites three times. The empty pages themselves are the subject of
our first measurement; this one is about what sits in front of them, and about
the defaults the builder put there that nobody replaced.
What we measured
- The sites. The 120 AI-built sites from our first run on 20 September; the largest share came out of the Made with Lovable showcase. On 27 September 105 answered with HTML. 5 established, server-rendered sites went through every step as a control group.
- One request per site, sent under our own bot name. Redirects were followed only when the server
issued them, and nothing on the page was executed. We kept the response headers, the Open Graph and X card tags, any
<noscript>block, and any script that sends the visitor to a different address. - The builder’s defaults come from the first run, 20 September: which sites still had the template’s title, description or preview image.
- A real preview service. On 18 October we passed 38 of these addresses through the link-card service that the Bluesky app calls when someone pastes a URL, and compared each card with the tags on the page. X, LinkedIn, Facebook and Slack build their previews only for a signed-in account, so we did not test them.
The results
| 27 September | AI-built (n = 105) | Control (n = 5) |
|---|---|---|
| Fewer than 300 visible characters without JavaScript | 62 (59%) | 0 |
… and still a complete preview: og:image, og:description and twitter:card | 48 | – |
Has an og:image | 92 (88%) | 5 |
og:image is a path, not a full address | 9 | 0 |
No twitter:card | 13 (12%) | 0 |
Text inside <noscript> | 6 | 0 |
| A script that redirects the visitor to another address | 3 | 0 |
| 20 September | AI-built (n = 104) |
|---|---|
| The preview image is the builder’s own advertisement | 15 (14%) |
| The title is still “Lovable App” | 6 |
| The description is still “Lovable Generated Project” | 11 (11%) |
| No description at all | 4 |
Previews that advertise the builder
On 20 September, 15 of the 104 live sites pointed og:image at the stock picture that
Lovable puts into a new project: the Lovable logo above the line “Build apps and websites by chatting with AI”.
13 of them were on lovable.app addresses and 2
on domains of their own. Shared anywhere, such a link shows a card for the builder instead of the site.
A month later nothing had moved. On 18 October all 15 still had the stock image in their HTML, and the Bluesky card for 14 of them displayed it. All 15 were also empty without JavaScript. We read that pairing as a sign of one thing: nobody had opened the head of the file, and the empty body lives in the same file.
The template’s other defaults travel with it: the title “Lovable App” on 6 sites, and the description “Lovable Generated Project” on 11. That is the title a search engine starts from, and on an empty page a crawler has nothing better to go on.
A path in og:image did less harm than we expected
Of the 92 sites with an og:image, 9 wrote it as a path on their own server, such as
/images/share.jpg, instead of a full https:// address. The Open Graph protocol defines its URL values as addresses that use
http:// or https://, and SEO checklists routinely call a bare path a broken preview. We expected
cards without a picture.
Bluesky disagreed. On 18 October 7 of the 9 still used a path, and the service completed
every one of them with the site’s own address and showed the image. The 9 sites with full addresses that
we sent alongside them, and the 5 control sites, got their images as well, while a page with no
og:image got a card with no picture. So the service is not simply attaching something to every link.
A path is therefore not fatal everywhere. We could not check the previews that need a signed-in account, so for X, LinkedIn, Facebook and Slack the question stays open. A full address costs nothing and closes it.
Text for a reader without JavaScript
The <noscript> element holds content for visitors that do not run scripts. 6 of the
105 sites had text in one. Only 2 of them were among the 62 empty pages, and they used it
well: the name of the site and a line about what it does, in an HTML file that otherwise carried a script tag and very
little else. The other 4 already had plenty of visible text.
We cannot see from outside whether a particular AI crawler keeps or drops <noscript> text. It is a
cheap fallback, not a fix. Rendering the page on the server, or prerendering it at build time, puts the words in front of
every reader regardless of what that reader does with scripts.
Redirects that only a browser follows
On 3 sites a script moved the visitor elsewhere: from www to the bare domain, or from
http:// to https://. A browser runs it. A crawler that skips JavaScript never does. On
2 of them the server also answered with a 301, so nothing was lost. On the
third, the www address had answered our first run with the whole page and a 200.
For a crawler that meant two copies of one site; for an owner testing in a browser, a redirect that appeared to work.
How to see what the machines see
1. Read your own head. This lists the tags your preview is built from:
curl -s https://your-site/ | grep -Eo '<meta (property|name)="(og|twitter):[^>]*>'
If the image belongs to your builder, or the title is the template’s, that is the first thing to change.
2. Replace the defaults in index.html, or in your framework’s metadata: your own title,
a description of one or two sentences, and an image that shows your product.
3. Write og:image as a full address that starts with https:// and your domain.
Bluesky forgives a path. There is no need to find out who else does.
4. Check the page, not the card. A finished preview says nothing about the body. Take a sentence you can
see on your site and count it in the raw HTML; 0 means a crawler that skips JavaScript misses it too:
curl -s https://your-site/ | grep -c "a sentence you can see"
5. Redirect on the server. The first line should show a 301. A redirect that exists only in a
script does not exist for a crawler.
curl -sI http://www.your-site/ | head -1
Caveats
These are three snapshots of the same sites, taken on 20 September, 27 September and 18 October 2026, and every number above carries its date. A single builder’s showcase supplied the bulk of the sample, so the defaults we found are that builder’s defaults; people who build elsewhere will leave other ones behind.
We tested a single preview service. X, LinkedIn, Facebook and Slack may treat a path in og:image differently
from Bluesky, and we did not check whether each preview image loads at a size those networks accept. Nor can we observe
which tags an AI crawler actually uses: whether it reads Open Graph, a meta description or <noscript>
text at all is decided inside the crawler, where we cannot look.