Connect your Supabase project. Find out which policies are silently blocking your users — before they do.
No credit card · Read-only access · Results in 60 seconds
You wrote the policy. You tested it in the SQL Editor. It passed.
Then you shipped — and your users couldn't see their data.
The SQL Editor runs as postgres. It bypasses every RLS policy you wrote. What you tested is not what your users hit.
Sound familiar?
"I spent 2 days debugging what turned out to be auth.uid() returning NULL in my server-side queries. My policy was fine. My context was wrong."
"Ran prisma migrate deploy and my entire API stopped working. Every table returned 0 rows. Took a full day to find out Prisma had silently revoked my schema grants."
"Enabled RLS on my campaigns table and my Realtime subscriptions stopped firing. The policy was completely permissive. Didn't matter."
"My UPDATE policy looked right. The UI said success. The row never changed. Turns out I had a USING clause where I needed WITH CHECK. Postgres just... said nothing."
These are the four most common failure modes in Supabase RLS. Each reported hundreds of times. Each invisible to every existing tool.
The 8 failures nobody tells you about
The Supabase SQL Editor bypasses all of these. It runs as postgres. You test. It passes. You ship. It breaks.
| What you see | What's actually happening | |
|---|---|---|
| CRIT | Empty results after SSR auth | auth.uid() returns NULL server-side. Session not forwarded. All rows silently denied. |
| CRIT | HTTP 500 on org-scoped SELECT | Your policy references the same table it's protecting. Infinite recursion. Postgres panics. |
| CRIT | Everything breaks after prisma migrate |
Prisma revoked GRANT on your schema. RLS didn't cause this — but the error is identical. You'll debug the wrong thing for hours. |
| WARN | UPDATE returns success, row unchanged | You wrote USING where Postgres needed WITH CHECK. Silent failure. No error thrown. UI lies to your user. |
| WARN | Realtime subscriptions go silent | RLS evaluation at the broadcast path differs from PostgREST. Enabling any policy breaks subscriptions regardless of permissiveness. |
| WARN | 42501 error — cause unknown | Could be RLS denial. Could be a missing GRANT. The error is identical. No tool tells you which one. You guess for hours. |
| CRIT | Clerk users blocked everywhere | Clerk doesn't write to auth.users. auth.uid() is permanently NULL. Every RLS tutorial you followed is wrong for Clerk users. |
| WARN | Queries 10–100× slower at scale | Your membership-check policy re-evaluates on every row. That's O(N×M). Invisible at 100 rows. Fatal at 100,000. |
No existing tool detects any of the 8 failures above — not the Security Advisor, not SupaExplorer, not the AI prompt, not ZenStack.
Real scanner output
Context-aware. Uses your actual schema, your actual column names, your actual auth provider.
How it works
OAuth to your Supabase project. Read-only. We don't touch your data, your policies, or your schema.
We run your policies against simulated authenticated, SSR, service role, and anonymous contexts — and show you exactly what each returns and why.
Not "your policy may have an issue." The exact failure mode, exact line, exact reason — in plain language, not a Postgres error code.
Context-aware SQL using your actual column names and auth provider — not a template. Includes an explanation of what was wrong and why the fix works.
Pricing
One prevented 2-day debugging incident = 5 months of subscription.
Diagnose
Connect your project. See exactly which policies are broken and why. No card required.
Fix
Unlimited scans + context-aware fix suggestions for your exact schema. Handles Clerk, SSR, Prisma, Realtime.
Trust
CI-enforced confidence. Auto-generated tests + GitHub Action that fails your build if a migration breaks a policy.
Audit — one-time
$149
Submit your project. Receive a complete policy set + pgTAP tests + a Loom walkthrough of every failure found — within 24 hours. Outcome guaranteed: if delivered policies fail in production for a covered failure mode, full re-audit free.
Common questions
postgres superuser, which bypasses Row Level Security entirely. You are never testing your actual policy when you use the SQL Editor — you are testing a superuser query with RLS disabled. This is true regardless of which user you appear to be logged in as in the Studio UI.auth.uid() returns NULL because Clerk users don't exist in auth.users — is one of our top detected patterns. We generate the correct current_setting('request.jwt.claims')::json->>'sub' pattern for every policy that needs it.auth.users. AI without context generates the right-looking wrong answer.