Skip to content
SealMyApp

Lovable security checklist: 12 things to check before you launch

A 12-point security checklist for Lovable apps before launch: scans, RLS, secrets, storage, admin pages, auth, payments and re-checking after AI edits.

Updated 2026-10-16

Before you launch a Lovable app, run Lovable's Deep scan, confirm Row Level Security is on for every table with owner-based policies, make sure no secret API keys are in frontend code, and test what an anonymous visitor can read. The 12 checks below take about an hour and cover the problems that most often expose real users' data.

Lovable has good built-in security tooling — use it. Its own docs are also clear that these tools can't guarantee complete security, and every AI edit can change what's exposed. So this checklist pairs Lovable's tools with a few outside-in checks you can do yourself.

It applies whether your backend is Lovable Cloud (which Lovable says is built on Supabase) or your own connected Supabase project.

The checklist

1. Run a Deep scan, not just the Quick scan

Lovable runs a Quick scan automatically when you publish. It checks database access rules, npm dependency issues and exposed MCP servers. The Deep scan also reviews your code for access control problems, unauthenticated endpoints, unsafe input, leaked secrets, payments, authentication and exposed personal data — but you usually have to start it yourself.

Open More → Security in your project and click Run deep scan. Fix everything marked Critical before launch, and read every Warning. Running scans is free; AI fixes may use credits.

2. Row Level Security is on for every table

Every table your app reads from the browser needs RLS enabled. On Lovable Cloud, check More → Cloud → Database → RLS policies. On your own Supabase, run this in the SQL editor:

select tablename, rowsecurity
from pg_tables
where schemaname = 'public'
order by rowsecurity;

Any false needs fixing: alter table public.your_table enable row level security;

3. No policy lets everyone read private data

RLS on isn't enough if a policy says using (true). List the suspicious ones:

select tablename, policyname, cmd, roles, qual
from pg_policies
where schemaname = 'public' and (qual = 'true' or with_check = 'true');

true is fine for a public product catalogue. It's not fine for profiles, orders, messages or anything with an email address. Replace with an owner check — our RLS policy guide has copy-paste versions.

4. Test as a stranger

The real test is asking your API for data with only the public key, exactly as anyone could. Follow the five-minute test in our leak-check guide. Your Supabase anon key being visible is normal — here's why.

5. No secret keys in the frontend

API keys for OpenAI, Stripe (secret), Resend and similar must live in Secrets (More → Cloud → Secrets) and be used from backend code: an edge function, or a server function in newer projects. Lovable's docs describe this as the intended pattern. Keys added earlier, or pasted straight into code, may still be in your bundle. Search your live site for sk_live, sk-, sb_secret and service_role using our bundle-search guide.

6. Storage buckets holding user files are private

Public buckets serve every file to anyone with the URL. Keep ID documents, invoices and private uploads in a private bucket with per-user folder policies, and use signed URLs to show them.

7. Admin pages are protected by the database, not just the UI

Hiding the /admin link or redirecting non-admins in React doesn't protect anything: the browser can call the same API directly. Admin-only data must be enforced by RLS (or checked in an edge function) using a roles table or app_metadata — never user_metadata, which users can edit themselves.

Prompt for Lovable:

Make sure admin-only data and actions are enforced server-side. Use a user_roles
table checked in RLS policies and edge functions, not a client-side check or
user_metadata. Show me which tables and functions are admin-only.

8. Authentication settings are sensible

If you use email and password sign-in, turn on Lovable's Password HIBP check (under More → Cloud → Users → Auth settings → Email) so commonly leaked passwords are rejected. While you're there, review your other auth settings — such as which sign-in methods are enabled and whether anonymous sign-ins are on — and switch off anything you don't use.

9. Edge functions check who's calling

Each edge function is a public URL. Inside each one, confirm the request comes from a signed-in user who is allowed to do that action. A request carrying only the public anon key is not a signed-in user. This matters most for functions that call paid APIs (AI, email, SMS) — an open function is a way for strangers to spend your money.

10. Payments are confirmed on the server

Never trust the browser to say "this user has paid" or to set the price. Prices should come from Stripe or your server, and paid status should only be written by a verified Stripe webhook (checked with the webhook signing secret) in an edge function. Users shouldn't be able to update their own plan, is_pro or credits columns — check your RLS update policies.

11. Public forms can't be abused

Waitlists, contact forms and feedback boxes usually allow anonymous inserts. That's fine if there's no select policy (so nobody can read the list back) and you have a rate limit or CAPTCHA in front of it to stop spam.

12. Re-check after every big AI edit

Your app is only as secure as its latest change. New tables can arrive without RLS; a "quick fix" can add using (true); a new feature can call an API from the browser. Before each publish, glance at the Quick scan result line in the publish dialog and re-run the Deep scan after significant changes. Workspace admins can turn on Block publishing with critical issues (under Workspace settings → Security → Privacy & security). Scheduled Deep scans are an Enterprise feature, according to Lovable's docs at the time of writing.

Printable version

  • Deep scan run, all Critical fixed
  • RLS on for every table
  • No using (true) on private data
  • Anonymous API test returns nothing private
  • No secret keys in the bundle
  • Private buckets for user files
  • Admin access enforced in RLS / edge functions
  • HIBP check on; unused sign-in methods off
  • Edge functions check the caller
  • Paid status only set by verified webhook
  • Public forms insert-only and rate-limited
  • Re-scan after big AI edits

FAQ

Is Lovable secure?

Lovable gives you solid tools — scans, Secrets, RLS management — but security depends on how your specific app is configured. The most common problems are app-level: missing or overly broad RLS policies and keys in frontend code.

Is Lovable's built-in scan enough?

It's a good first line, and you should use it. It's worth also testing from the outside (as a stranger would) and re-checking after changes, because Lovable itself says its tools can't guarantee complete security.

Do I need a professional audit?

If you handle health data, financial data or large numbers of users, we'd recommend a professional security review on top of these checks.

Does this checklist work for Bolt or v0 apps on Supabase?

Items 2–7 and 9–12 apply to any Supabase-backed app. The Lovable-specific menu paths won't.

Check it from the outside, for free

SealMyApp's free scan looks at your live Lovable app the way a stranger would: what the public key can read, whether secret keys are in the bundle, and whether storage or admin routes are open. It's read-only, runs only after you prove you own the app, and keeps no data. Run a free scan.

Sealed — a short weekly security note for vibe coders

One common security mistake in AI-built apps, how to fix it in your builder, and one useful tool. No spam; unsubscribe any time.