Justin McKelvey
Ran snowboard shops. Taught myself to code. Now I build AI that does real work.
Is Supabase Secure? Yes, If RLS Is On: How to Check Yours in 5 Minutes (2026)
TL;DR: Yes, Supabase the platform is secure. As of November 2026 it holds SOC 2 Type 2 and ISO 27001, encrypts your data at rest (AES-256) and in transit, and runs regular pen tests. Your app on Supabase is a different question, and the answer is one setting: Row Level Security (RLS). A table with RLS off can be read, edited and deleted by anyone who has your project URL, and your project URL is in your frontend code. Supabase's own Security Advisor labels that "Table publicly accessible."
I was a CTO at an AI startup and I've shipped 50+ products. Founders who built on Lovable or Bolt keep asking me some version of "is Supabase safe?" The honest answer is that Supabase is rarely the weak spot. The rules your app was generated with usually are.
What Supabase secures vs what you own
| Area | Supabase handles it | You own it |
|---|---|---|
| Servers, network, data centers | Yes: SOC 2 Type 2, ISO 27001, Cloudflare DDoS protection | |
| Encryption | Yes: AES-256 at rest, TLS in transit | |
| Backups | Daily on paid plans | Choosing a plan with backups; Point-in-Time Recovery is a paid add-on |
| Who can see which rows | Gives you RLS and a Security Advisor that flags gaps | Turning RLS on and writing the policies |
| API keys | Issues them; blocks secret keys in browsers | Keeping the secret key out of your frontend |
| Advisor warnings | Finds them | Fixing them |
| Logins, password rules, your own app logic | Supabase Auth tools | Configuring them and the code that uses them |
Supabase writes the split down in its shared responsibility model: you're responsible "for ensuring that tables with sensitive data have the right level of access" and for "managing your database secrets and API keys." The bold rows are where vibe-coded apps leak.
How RLS works, in plain English
Your Supabase database is a building. The public key in your app (the anon or publishable key) is taped to the front door, on purpose, so your app can get in. That key only opens the lobby. RLS is the lock on every room past the lobby, and policies are the rules on each lock: "a customer can open the room with their own orders," "only an admin can open billing."
Every time your app asks for data, Postgres checks the request against those rules row by row and only hands back what matches. Supabase's docs say that once RLS is on, no data reaches the public key "until you create policies." So RLS on with no policies is a locked room. Safe, just empty.
The failure is RLS off. Then there's no lock at all, and the public key opens the room. Since anyone can read that key from your site, anyone can read, change and delete that table. One more thing to know: the secret key (the old service_role key) is the master key. It skips every lock by design, which is why it belongs on your server only. The full key rundown is in Supabase anon key vs service role key.
Where Supabase apps actually break
Tables made with SQL. Supabase's docs say the Table Editor turns RLS on for you when you create a table in the dashboard, and that a table created with SQL needs you to "enable it yourself." AI builders and coding agents mostly create tables with SQL. That one sentence explains a lot of leaks.
Policies that say "true." An agent hits a permission error, writes a policy that lets everyone read everything, and the error goes away. RLS shows as on. The table is still open.
Views. Supabase warns that views bypass RLS by default because they're created by the database owner. A view over a protected table can hand out every row the table was guarding.
The secret key in frontend code. If it's in the browser bundle, none of your policies matter.
These aren't hypotheticals. Matt Palmer's 2025 write-up behind CVE-2025-48757 scanned 1,645 Lovable projects and found 170 of them (about 10.3%) with inadequate RLS across 303 endpoints, from homepages alone. In February 2026, Wiz found Moltbook's Supabase key in client code with no RLS behind it: 1.5 million API tokens and 35,000 email addresses exposed. Neither was a breach of Supabase. Both were open doors in apps. If your app came out of Lovable, I go through what Lovable covers and what your app still owes in is Lovable secure.
What changed on October 30, 2026
Supabase made a real fix to the defaults this year. Until recently, every new table in the public schema was reachable from your app's API the moment it was created, locks or not. Starting October 30, 2026, on every project, new tables aren't exposed to the Data API until someone grants access on purpose. New projects have worked this way since May 30.
Two limits. Tables you already have kept their access, so this did nothing for an app generated last spring. And Supabase says "RLS behavior remains unchanged": once a table is granted to your app, RLS is still the only thing deciding who sees which rows. The new default stops accidents on new tables. It doesn't audit the old ones.
Your 5-minute Supabase security check
- Security Advisor. In your Supabase dashboard, open Advisors, then Security Advisor. Any ERROR named "Table publicly accessible" (lint 0013) is a table with RLS off. Supabase's own description: "Anyone with your project URL can read, edit, and delete all data in this table."
-
Policies. Open Authentication, then Policies. Every table holding customer data should have RLS on and policies that name who can see what. A policy whose rule is just
truefor reading means everyone can read. -
The key in your browser. Open your live app, right-click, Inspect, Network tab, reload, and click any request to
supabase.co. Theapikeyheader should start withsb_publishable_, or be a legacy key whose role isanon. If it's a secret or service_role key, rotate it today.
If all three come back clean, your Supabase setup is in good shape. If the advisor is full of red, fix the tables holding emails, payments and private messages first. For the backend choice itself, I compare costs and features in Supabase vs Firebase.
Is Supabase secure enough for a real business?
For most startups, yes. The certifications are the ones enterprise buyers ask for, the defaults are getting stricter, and the dashboard tells you exactly which tables are open. What Supabase can't do is decide who in your app should see what. That's a product decision, and in a vibe-coded app, nobody made it on purpose.
RLS is one check out of twenty on my free vibe coding security checklist, which also covers secret keys, payment webhooks and rate limits. If you'd rather have someone go through the whole app before your users find the gaps, Vibe Code Rescue starts with a free repo audit.
Sources
- Supabase, Security: SOC 2 Type 2, ISO 27001, HIPAA, encryption, backups, pen tests, DDoS protection. Read November 3, 2026.
- Supabase Docs, Tables and data: the Table Editor enables RLS; SQL-created tables do not. Read November 3, 2026.
- Supabase Docs, Row Level Security: no data reaches the publishable key until policies exist; views bypass RLS by default. Read November 3, 2026.
- Supabase Docs, Security Advisor lint 0013: "Table publicly accessible", level ERROR. Read November 3, 2026.
- Supabase changelog, Tables not exposed to Data and GraphQL API automatically: April 28, May 30 and October 30, 2026 dates. Read November 3, 2026.
- Supabase Docs, Shared responsibility model. Read November 3, 2026.
- Matt Palmer, Statement on CVE-2025-48757: 170 of 1,645 Lovable projects with inadequate RLS. Read November 3, 2026.
- Wiz, Exposed Moltbook database (February 2, 2026). Read November 3, 2026.
Ship AI-built code without the 2am surprise
The free 20-point security checklist I run on every AI-built codebase before it touches real users.
Frequently Asked Questions
- Is Supabase secure?
- The platform is. As of November 2026, Supabase is SOC 2 Type 2 and ISO 27001 certified, encrypts data at rest with AES-256 and in transit with TLS, and runs regular penetration tests. Whether your app is secure depends on Row Level Security: a table with RLS off can be read, edited and deleted by anyone who has your project URL and public key.
- What is RLS in Supabase?
- Row Level Security is a Postgres feature that checks every request against rules you write, row by row, before any data comes back. In Supabase, the public key in your frontend can only reach rows your RLS policies allow, for example a customer's own orders. With RLS on and no policies, the public key gets nothing. With RLS off, it gets everything.
- Is RLS enabled by default in Supabase?
- Only for some tables. Supabase's docs say the Table Editor turns RLS on for you when you create a table in the dashboard, but a table created with SQL needs you to enable it yourself. AI builders and agents often create tables with SQL, so check every table, not just the ones you made by hand.
- Is it safe to build a Lovable or Bolt app on Supabase?
- Yes, if every table has RLS on with policies that match who should see what, and no secret or service_role key sits in your frontend code. The known incidents on Supabase-backed apps, such as the 170 Lovable projects in CVE-2025-48757 and the Moltbook leak, came from missing RLS, not from a break-in at Supabase.
- Did Supabase change how new tables are exposed in 2026?
- Yes. From October 30, 2026, all Supabase projects stopped exposing new tables in the public schema to the Data API automatically. A new table now needs an explicit grant before your app can reach it. Existing tables kept their access, and RLS works the same as before, so you still need it on every table.
- How do I check if my Supabase app is secure?
- Open your Supabase dashboard, go to Advisors, then Security Advisor, and look for errors named 'Table publicly accessible'. Each one is a table with RLS off. Then open Authentication, then Policies, and make sure every table has policies that match who should see the data. It takes about five minutes.
More on Vibe Code Rescue
What Is Prompt Injection? How It Hits the AI Feature You Added to Your Lovable or Cursor App
Prompt injection is when text your AI feature reads carries instructions the model follows instead of yours. OWASP ranks it the #1 risk for AI apps, and there's no full fix. Here's what it looks like in a founder's app, three real cases, and the fixes that limit the damage.
Supabase Anon Key vs Service Role Key (Now Publishable vs Secret): Which One Is Safe in Your Frontend?
The anon key (now called the publishable key) is meant to sit in your frontend. The service role key (now the secret key) bypasses every security rule in your database and must never leave your server. Here's the old-name to new-name map, where to find each one, and what to do if the wrong one leaked.
How Much Does It Cost to Audit or Fix a Vibe-Coded App? ($0 to $50K, What Each Tier Finds)
Auditing a vibe-coded app costs $0 to about $1,500. A pen test adds roughly $3,000 to $6,000. Fixing what the audit finds is the real bill: $15K to $50K for most rescues. Published prices for every tier, what each one actually catches, and which one you need.
Best Security Scanners for Vibe-Coded Apps (2026): 12 Tools, Free Ones First
Twelve scanners for apps built on Lovable, Bolt, Replit or Cursor, with what each one actually catches and what it costs today. Six cost $0 for a two-person team, and two more come with tools you already pay for. None of them catches the bug that leaks the most data.
Written by
Justin McKelvey
I spent 12 years running snowboard and mountain-bike shops in Colorado, then taught myself to code. Since then: 50+ products shipped, Head of Product at a national sports platform, CTO at an AI startup. Now I put AI to work in real businesses in Austin, TX and remote, and write down what actually works.
Work with meWant more help? Get the free security checklist · Get a free 20-min repo audit