Lovable Security Check
You built your app with Lovable and it works. Now people are signing up, and you want to know what a stranger can see when they open it. Most Lovable apps are a React front end that runs in every visitor's browser, with a Supabase database behind it (Lovable Cloud is built on Supabase too). Configured well, that setup is safe. Configured badly, a stranger can read your tables, or Google never shows your launch page.
The Pro Logica AI App Security Check is a free, passive scan of your live app. Paste your URL and you get a score out of 100 in about a minute, with findings ranked by severity. Run a free Lovable security check.
What we check on Lovable apps
We look at your app from the outside, the way any visitor or bot can:
- Keys in your JavaScript. We look for live secret patterns (Stripe, AWS, OpenAI, Anthropic, GitHub and Slack keys, private key blocks) and any Supabase key with the
service_rolerole. Matches are masked. We never store a full secret. - Supabase access. We run a count-only test to see whether anonymous visitors can read rows in up to three tables. No row data is downloaded.
- Headers and HTTPS: CSP, HSTS, clickjacking protection, nosniff, Referrer-Policy and certificate expiry.
- Public files and source maps:
/.env,/.gitand.js.map. - Google basics:
noindex, title, meta description and sitemap.
Why the anon key is fine and open RLS is not
Founders often panic when they spot their Supabase key in the browser. The anon (or publishable) key is meant to be there. It tells Supabase which project you are. What that key can actually do is set by Row Level Security (RLS) policies and table grants.
Supabase's own docs put it plainly: a table in an exposed schema without RLS is readable and writable by any role with a grant on it. So the risk isn't the key. The risk is a table with RLS off, or a policy like using (true) for anonymous users on data that should be private. The other real danger is the service_role (secret) key. It bypasses RLS completely, so it must never ship to the browser.
When our scan asks for a row count and gets back zero rows (*/0), RLS is doing its job and we don't flag anything. A real number means anyone can pull those rows.
Lovable also runs a Quick security scan when you publish that reviews database access rules. You can review policies under More → Cloud → Database → RLS policies. Our check adds the outside view: what your live URL exposes right now.
The most common findings
In our passive check of 18 public showcase apps built with Lovable or Bolt:
- 18 of 18 had no Content-Security-Policy. CSP is the header that tells browsers which scripts are allowed to run. Without it, one injected script can read sessions or rewrite your sign-up form. More on missing security headers.
- 18 of 18 had no clickjacking protection, so another site could frame their pages.
- 15 of 18 had no sitemap we could find, which slows down how fast Google finds new pages.
- 7 of 18 had a Supabase anon key in client JS. That's expected. We did not test RLS on those third-party apps, so this is not a claim that their data was open.
The average score was 76 out of 100.
How to fix headers on Lovable. Lovable's publishing docs don't describe a setting for custom response headers. You have three options:
- Ask Lovable to add a CSP
<meta>tag toindex.html. It controls scripts, but browsers ignoreframe-ancestorsin a meta tag, so it won't stop clickjacking. - If your custom domain runs through a CDN such as Cloudflare, add the headers there.
- Sync the project to GitHub and deploy the build to a host that reads a headers file, such as Netlify (
_headers) or Vercel (vercel.json).
For the sitemap, add public/sitemap.xml, point to it from public/robots.txt, and submit it in Google Search Console.
How the score works
Every app starts at 100. Each finding takes off points by severity, with a cap per category. A readable table, a live secret key or a public /.env costs the most. A missing Permissions-Policy costs nothing. Bands: 85+ "Looking good," 65–84 "A few gaps," 40–64 "Needs attention," below 40 "At risk."
Unlock Lovable-ready fix prompts
The free result shows your score, severity counts and your top finding. When you unlock the full report, every finding gets masked evidence, a plain-English fix, and a copy-paste prompt written for Lovable's chat. For example, the RLS prompt tells Lovable to turn on RLS for every public table, write least-privilege policies keyed on auth.uid(), and confirm that anonymous reads return zero rows.
When a one-time check isn't enough
Every new prompt is a new deploy, and one deploy can quietly reopen a table or drop a header. Run the free check on your app after each deploy. Or browse all Pro Logica cybersecurity services.
Related guides
- Supabase RLS not enabled: what it means and how to fix it
- Exposed API key in frontend code
- Other builders: Bolt.new · Replit · Cursor · v0
FAQ
Why do I have to tick the permission box?
Some checks, like the Supabase row-count test and the /.env probe, should only run against apps you own or have permission to test. The checkbox is how you confirm that. Please don't scan apps that aren't yours.
Is the scan passive? Can it break my app?
Yes, it's passive. We only send GET and HEAD requests, cap each scan at about 40 requests, pace them out, and respect robots.txt for page fetches. We never log in, submit forms, write data or download table rows.
Lovable already has a security scan. Why run this too?
Lovable's scans review your project's code and database rules from the inside. Ours checks the live URL from the outside: response headers, HTTPS, public files, what your JavaScript exposes, and whether Google can index you. The two work well together.
Is my Supabase anon key a leak?
No. It's designed to be public. It's only safe when RLS is on for every table that holds private data. The service_role or secret key is the one that must stay on the server.
Ready to see your score? Run the free Lovable security check. Questions? Call Pro Logica at 949-205-7333.
By Pro Logica