Open data
We ran the production audit over every publicly listed AI-built app we could find
No survey, no opinion piece. Each app was fetched once, from the outside, the way a customer or an attacker would reach it, and scored against the same twenty checks the free audit runs. These are the results, with the method and the sample written down so you can argue with them.
208
apps audited
Last run September 2026
73.6
average score out of 100
Median 75
100%
missing at least one security header
1%
shipped a backend key to the browser
One in this table is one too many
The distribution
Most AI-built apps are not broken. They are unfinished in the same four places.
The scores cluster, and they cluster for a reason: these tools produce a working app and stop at exactly the point where production begins. Nobody chose to skip the security headers — the generator simply had no reason to add them.
- A
- 0 apps · 0%
90–100 — Nothing urgent. Ship, and re-run it after the next big change.
- B
- 194 apps · 93.3%
75–89 — Real findings, none of them bleeding. A week of work, not a rebuild.
- C
- 7 apps · 3.4%
60–74 — Something here will cost you a customer or a night. Fix it before you market.
- D
- 7 apps · 3.4%
40–59 — Data or credentials are exposed, or the app depends on infrastructure you do not own.
- F
- 0 apps · 0%
0–39 — Do not send traffic to this until it is fixed.
What was found, and how often
Every check, ranked by how many apps failed it
Read this as a list of the things nobody tells you to do. The top of it is not where the drama is; the drama is further down, in the handful of apps shipping a key or an open table.
Still on the builder's domain
100%208 apps
No clickjacking protection
100%208 apps
No Content-Security-Policy
99%206 apps
Backend reachable directly from the browser
29.8%62 apps
Images served from the builder's CDN, not their own
2.9%6 apps
A database table readable without logging in
1.9%4 apps
First byte slower than 1.5 seconds
1%2 apps
OpenAI API key shipped to the browser
1%2 apps
robots.txt blocks every search engine
0.5%1 apps
A missing header is a bad afternoon. A service key in the bundle is someone else holding your database. They are in the same table because they were found by the same request.
By builder
Where the apps were built
Platform is detected from the runtime fingerprint and the host, not from what the app says about itself. An app that moved to its own domain is counted as its own domain, which is the correct answer and also why this column is not a league table of tools.
- Lovable
- 208
- 100% of the sample
Methodology
How this was collected, and what it is not
The uncomfortable parts are in here on purpose. A benchmark whose limits are hidden is marketing, and it would be cited once and then never again.
- Only publicly announced apps
- URLs came from builder showcases, Product Hunt launches and public 'built with' posts. Nothing anyone sent us privately is in this dataset, and no app is ever named — the stored row is a hash of the URL, the host suffix and the finding codes.
- One request, from the outside, rate-limited
- Each app was fetched once at no more than one request a second: the home page, the scripts it loads, and the response headers. Nothing was logged into, nothing was submitted, nothing was scanned beyond what a browser downloads to render the page.
- The open-table check is a read, never a write
- Where a Supabase endpoint is reachable from the browser, one anonymous read is attempted against it. A row that comes back means anyone can read it. Nothing is written, changed, stored or looked at beyond whether a response was returned.
- The sample understates the problem
- These are apps whose builders were proud enough to publish them, so the set skews to demos, landing pages and portfolios — things with little behind them to expose. The apps founders send us privately, with customers and a database, score materially worse. Treat every number here as a floor.
- A single point in time
- Each row is one moment. An app fixed the day after it was audited still counts as it was. That is the honest limit of a one-pass crawl, and the reason the set is re-run rather than patched.
- The checks are the ones you can run yourself
- Same code as the free audit, and the score is a weighted sum of what it found — nothing proprietary, nothing subjective. Run it on your own app and you get a row that would have gone in this table.
Using this
Cite it, link it, argue with it
The numbers are free to quote with a link back to this page. If you are writing about AI-built software and want a cut we have not published — by platform, by finding, by score band — ask and we will run it, because a dataset nobody uses was not worth collecting.
Ask for a cut of the dataQuestions
About the data
- Is this a hit piece on Lovable, Bolt or v0?
- No. These tools do the hard part — they get a working product out of a description, which is genuinely new. What they do not do is the last mile: headers, keys, ownership of your own assets, a database that refuses the wrong reader. That gap is the subject here, not the tools.
- How do you detect which builder made an app?
- From the host and from runtime fingerprints in the page — the asset paths and scripts a given builder leaves behind. An app that merely mentions a tool is not counted as built with it. Apps on their own domain are recorded as their own domain, because from the outside that is all that can honestly be said.
- Did you break into anything?
- No. Every request is one a browser makes when it renders the page, plus one anonymous read against a database endpoint the page itself already exposes to every visitor. If that read returns data, the app was publishing it to the whole internet before we arrived.
- Will you name the apps?
- Never. What is stored is a hash of the URL, the host suffix and the finding codes. There is no list to leak, and we would not publish one if there were.
- My app scored badly. Is it actually at risk?
- It depends entirely on which findings. A missing header on a portfolio is noise. A readable table on an app with customer data is an incident that has not been noticed yet. Run the audit and read the findings — each one says what it means and how to fix it, and most are fixable without us.
- How often is this updated?
- Quarterly, as a fresh batch rather than a patch of the old one, so a comparison between two quarters is a comparison of two runs and not of an edited table. The date on this page is the last run.
Next step
The only number on this page that matters is yours
Paste a URL. Thirty seconds, no account, and you get the same checks that produced this table, plus what to do about each one.

