Justin McKelvey

Justin McKelvey

Ran snowboard shops. Taught myself to code. Now I build AI that does real work.

• Vibe Code Rescue • 6 min read •

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

  1. 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."
  2. 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 true for reading means everyone can read.
  3. The key in your browser. Open your live app, right-click, Inspect, Network tab, reload, and click any request to supabase.co. The apikey header should start with sb_publishable_, or be a legacy key whose role is anon. 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

Free Resource Justin McKelvey

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

Justin McKelvey, Austin, TX

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 me

Want more help? Get the free security checklist · Get a free 20-min repo audit