Paste a create policy statement and get it in plain English: which rows and roles it allows, and whether it leaks — USING (true), a missing WITH CHECK, or anon access with no per-user scope. Nothing leaves your browser.
Paste a policy to see what it allows.
1=1 — means every row matches. On a table a client role can reach, that reads (or changes) every row. Fix a permissive policy.WITH CHECK makes Postgres check the new row against USING, which is fine when USING is strict. When USING has an OR (shared or team rows), a row can be changed into another user's. (An INSERT policy without WITH CHECK doesn't leak: it lets no rows in.) The correct owner-scoped set.auth.uid() scope — signed-out visitors read whatever the predicate allows. Fine for a public catalog; a leak for anything private.WITH CHECK is scoped, an open USING lets any row be targeted. Both matter.Want the correct policy instead of debugging one? The RLS policy generator writes the whole set from your table.
Prove it on your real database. This reads the SQL text only. npx airlock-rls connects with the anon key and actually reads your tables, so an always-true policy is caught as a real, returned row — not an inference.