RLS Checker · free · runs in your browser

Paste your Supabase schema. See which tables strangers can read.

Eight checks against your Row Level Security setup, triaged into what is blocking, what is urgent, and what can wait, with the corrected SQL for each. Your SQL never leaves this page: the analysis runs entirely in your browser, no upload, no signup.

Nothing is uploaded. Watch the network tab if you like.
How to get your SQL

Option 1: Supabase CLI (best)

Dumps every table, policy, and function in your public schema, exactly what this tool wants.

supabase db dump --schema public

Option 2: Supabase dashboard

Open your project, go to SQL Editor, run the query below, then copy the whole result table (header row included) and paste it here.

select * from pg_policies;

You can also paste raw CREATE TABLE and CREATE POLICY statements straight from your migration files. The pg_policies route only covers policies, so table-level checks (RLS off, RLS with no policies) need the full dump.

What gets checked
01

RLS never enabled

Tables in your public schema with Row Level Security off. Anyone with your anon key can read and write them.

02

RLS on, zero policies

Fails closed, but usually means client code is leaning on the service role key.

03

World-readable sensitive tables

USING (true) on SELECT for tables named users, profiles, orders, payments, messages, and similar.

04

Wide-open writes

INSERT, UPDATE, or DELETE policies with USING (true), WITH CHECK (true), or no WITH CHECK at all.

05

Anonymous write grants

Write policies granted TO anon or TO public with no ownership condition.

06

Nullable auth.uid() compares

Policies comparing auth.uid() to a nullable column without an IS NOT NULL guard.

07

SECURITY DEFINER hygiene

Definer functions without a pinned search_path. Informational.

08

Open Storage policies

storage.objects policies that let strangers list, read, upload, or delete files.

Questions

Is it safe to paste my database schema here?

Yes. The analyzer runs entirely in your browser as JavaScript. Your SQL is never sent to a server, never logged, and never stored. If you click "create shareable link", only the score, check types, and severity counts are saved, never the SQL, table names, or policy names. You can verify this in your browser dev tools: no network request fires when you run the check.

How do I export my Supabase schema?

Run "supabase db dump --schema public" with the Supabase CLI, or in the dashboard open SQL Editor and run "select * from pg_policies;" and paste the output. Both formats work here.

What does USING (true) mean in a policy?

USING (true) means the policy matches every row for everyone the policy applies to. On a SELECT policy it makes the whole table world-readable to anyone holding your anon key, which ships inside your frontend bundle. That is fine for genuinely public data and a leak for anything per-user.

Do I need RLS on every table?

On every table in the public schema, yes, because Supabase exposes the public schema through an auto-generated API keyed by your anon key. A table without RLS is readable and writable by anyone who opens your site and copies the key out of the bundle.

My table has RLS enabled but zero policies. Is that bad?

It fails closed: nobody can read it through the API. That is safe but usually a smell. If your app still reads the table, it is probably using the service role key from client code, which bypasses RLS entirely and is an emergency of its own.

Does this replace a security audit?

No. It catches the most common RLS mistakes in what you paste, heuristically. It cannot see your auth flows, edge functions, API routes, or business logic. Treat it as triage: it tells you whether the door is open, not everything that could walk through it.

Built by Continuum, the people founders call when an AI-built app has real users and nobody is sure what is actually safe. If you want the whole app checked, not just the schema, start with a free Leak Check or a full Ship Check.