Is your Lovable app secure? The Lovable security checklist
Lovable is the easiest way to ship a working app today. It's also the easiest way to ship a public database. Here's how to check yours before someone else does.
Lovable’s pitch is that you describe what you want and an app shows up. That’s true, and that’s the magic — the same way a calculator is magic for someone who’d otherwise be doing long division. The problem is that the calculator doesn’t tell you when you’re solving the wrong equation, and Lovable doesn’t tell you when the app it just deployed is shipping your customers’ data to anyone with a browser.
This isn’t a Lovable bug. It’s the trade-off Lovable made when it built the most frictionless deploy story on the market. The good news: you can keep all the frictionlessness and fix the problems with a fifteen-minute checklist. Below is what we look for whenever a Lovable user asks us to scan their app.
Why Lovable apps fail in specific ways
Three things about Lovable’s defaults shape what tends to go wrong:
- Lovable defaults to Supabase. Almost every Lovable app uses Supabase for auth and data. Supabase has Row-Level Security, which is fantastic when it’s on and a disaster when it isn’t.
- The “Publish” button is one click. There’s no staging environment by default, no QA step, no “are you sure?” moment. Whatever the AI just built is live the instant you click.
- The AI tends to build “an admin view” because you asked for one — without separately building “an auth check for the admin view,” because you didn’t ask for that explicitly.
None of these are bad design choices. They’re the choices that make Lovable the fastest tool to ship from. The cost of that speed is the checklist below.
The Lovable security checklist
1. Is RLS enabled on every table?
This is the one. Open your Supabase project (Lovable lets you click through to it from the dashboard). Go to Authentication → Policies. Look at every table.
Any table that shows “RLS disabled” is fully public. Anyone with your project URL and the anon key — which is in every Lovable app’s bundle by design — can read every row of that table from their browser console.
The fix: click into the table, enable RLS, then add a policy. The pillar guide has the full pattern, and the Supabase RLS post walks through the actual policy SQL for the most common Lovable patterns.
Trap: Lovable’s AI will sometimes say “I’ve enabled RLS” after writing a policy like USING (true). That policy means “anyone can read this.” Look at the policy SQL, not the toggle.
2. Did Lovable put any keys in the frontend?
Open your live Lovable app and open devtools (Cmd+Opt+J / Ctrl+Shift+J). In the Sources tab, find the main JS bundle. Search it for known secret prefixes:
sk_(Stripe secret key, OpenAI key)eyJfollowed by a long string (a JWT — could be a Supabase service role key)- Your Supabase project ref (the random string before
.supabase.co) followed by anything that isn’t the anon key
If anything matches: rotate the key immediately, then fix the code so the key only lives server-side. Lovable supports Edge Functions for exactly this purpose.
Common trap: “I’m calling OpenAI from the client because the AI told me that’s how to do it.” That’s how to do it if you don’t mind your bill being unbounded. Move OpenAI calls to a Supabase Edge Function, then call the function from the client.
3. Are your admin views protected server-side?
If your app has an admin dashboard, a “team management” view, an internal tool — anything privileged — check that the protection isn’t just UI hiding.
Open the page in an incognito window. If it loads (even partially) before redirecting, the data probably loaded too. Open the Network tab. Look at the requests the page made. Hit them directly with curl from a separate terminal. If the data comes back, the route isn’t actually protected.
The fix: every privileged data call needs an RLS policy that requires admin role, or an Edge Function that checks role before fetching. Hiding the button in the UI is not authorization.
4. What’s actually in your deployed bundle?
Lovable doesn’t ship source maps by default, which is good. But it does ship every file your app imports. If you imported a file that contains test data, sample credentials, or commented-out keys that you forgot to delete, that file is in your bundle.
Visit the Network tab on your live site, reload, and look at the JS files. Open the largest one. Search it for “password,” “secret,” “TODO,” and your own name. If you find anything embarrassing, find the source file and clean it up before redeploying.
5. Is your custom domain set up correctly?
Lovable lets you connect a custom domain. When you set it up, double-check:
- HTTPS works (Lovable handles this — verify, don’t assume).
- The Lovable
*.lovable.appURL still works too, but isn’t your canonical URL. Search engines will index whichever one you link to most. Make sure your<link rel="canonical">points at your real domain. - No old DNS records pointing at deleted services. If you tried Webflow first and never deleted the CNAME, that subdomain is a takeover candidate. See the pillar guide on subdomain takeover.
6. Are SEO basics in place?
Outside scope of “security” but worth checking once: open PageSpeed Insights, put your URL in, and look at the SEO score. Lovable apps tend to ship with a generic title, no meta description, and no Open Graph image. None of those breaks anything — they just mean nobody finds you, and when they share your URL in Slack it looks like an unfinished thing. Worth fifteen minutes.
The one-command check
The above takes about an hour the first time. If you’d rather not do it by hand, Patchable runs all of these checks (and 70 more) from the outside and writes each fix as a prompt you can paste right back into Lovable’s chat. Free to scan. You only pay if there’s something to fix.
Lovable made it trivial to ship. Patchable makes it trivial to know what you shipped. Run the scan.
Related reading
- The vibe coding security guide — the full 7-check pillar piece.
- Supabase RLS for vibe coders — the deep dive on RLS, with policy SQL.
- Is vibe coding bad? — the honest answer.
- Vibe coding security risks — the 7 things in every AI-built app.