Supabase is incredible. Without RLS, it's also a public read.
Supabase ships the easiest auth + database + storage stack ever. The default tradeoff: your anon key is public (by design), so anything not protected by Row Level Security is readable by anyone with your URL. The good news — it's fixable in minutes if you can see what's exposed.
Get a graded security report for your Supabase app in under a minute.
Every table queryable from the client must have RLS on. CheckVibe enumerates and verifies.
A service-role key bypasses RLS. If it's in your JS, every user has admin access to your database.
Public buckets are fine for user avatars; they're catastrophic for invoices, contracts, or user uploads.
An edge function with `verify_jwt = false` is callable by anyone.
Trivial to spam your auth table to exhaust your free tier.
Any row returned is a table missing RLS. Enable it.
If it exists, rotate the key immediately and move all admin calls server-side.
Public-read should be the rare exception. Default to authenticated-read.
Set in `supabase/config.toml`.
Yes, when you use it correctly. The biggest risk is leaving Row Level Security off on tables the client queries.
CheckVibe enumerates your tables and probes each with the anon key. If we can read data we shouldn't, we tell you.
Putting the service-role key in client code. It bypasses all RLS. CheckVibe scans bundles for it.