Free checklist
Is your AI-built app safe to launch?
The 10 checks we run first on any app built with Lovable, Bolt or another AI builder on Supabase. You can do all of them yourself in about an hour. No tools to buy, no sign-up.
Take it with you
The same checklist as a printable PDF with tick boxes (2 pages, US Letter). Only test an app you own.
Check 1: Turn on Row Level Security (RLS) for every table
Your app's public key is visible to every visitor, so RLS is what actually protects your data. Supabase's own docs say to enable RLS on every table in an exposed schema.
Where: Supabase → Advisors → Security Advisor. Fix every "RLS disabled" warning.
Check 2: Look for
using (true)policiesA policy whose condition is just
trueon SELECT, UPDATE or DELETE means "anyone". Fine for public blog posts, bad for user data.select tablename, policyname, cmd, qual from pg_policies where schemaname = 'public';
Where: Supabase → SQL editor. Check every row where
qualistrue.Check 3: Test with two accounts
Sign up as user A and create something. Log in as user B in another browser and try to see A's data. If you can, your policies need a check like
auth.uid() = user_id.Check 4: Search your code for secret keys
Anything in
src/is public. Search forservice_role,sk_live,sk-andwhsec_. If you find one, move it to an Edge Function secret and rotate the key: once it has been public, treat it as leaked.Check 5: Check your
VITE_variablesEvery
VITE_value ends up in the browser. Only the Supabase URL and the publishable (anon) key belong there.Check 6: Make storage buckets private
Is any bucket marked "Public" while holding private files, such as IDs or invoices? Make it private and use signed URLs.
Where: Supabase → Storage.
Check 7: Check your Edge Functions identify the user
If a function does anything user-specific, it should call
supabase.auth.getUser()first.verify_jwton its own also accepts the public key.Check 8: If you take payments: verify the Stripe webhook signature
Your webhook should use
stripe.webhooks.constructEventAsync(...). Prices should come from Price IDs on the server, never from the browser.Check 9: Protect admin pages on the server
Hiding the admin link isn't protection. The data the admin page uses must be protected by RLS or by a function that checks the user's role.
Check 10: Turn on email confirmation and decent password rules
Minimum 8 characters (12 is better), plus leaked-password protection if your plan has it.
Where: Supabase → Authentication → Providers / Policies.
How did you do?
10 of 10 ticked
A strong start. Re-check after every big change: any change can reopen an old gap.
7 to 9
Fix the gaps before launch, starting with 1–4: they protect your users' data.
6 or fewer
Pause new features for a day and work through the list, or ask for help.
Also: Lovable has a built-in security scan, and it's worth running. Its docs say it can't guarantee complete security, which is true of any tool, so the manual checks above still matter.
Prefer a second pair of eyes?
Our free mini scan runs five of the most important checks on your app and sends you a plain-English summary within two business days of your signed permission. Read-only: we never change your code, data or settings, and nothing is tested until you've signed a short authorization form.
General guidance, not a full security audit. Only test systems you own or are authorized to test.