The service_role key bypasses every Row Level Security policy at once. If it ends up in your frontend, anyone who views your page has full read and write access to your database. Scan your live site for it in seconds — no database, no signup.
$ npx airlock-rls --site https://your-app.com ✗ 1 problem(s): ✗ https://your-app.com/app.js Supabase service key exposed in the browser — it bypasses ALL Row Level Security. Rotate it now. RLS audit failed: 1 problem(s) found. (exit 1)
On a clean site it stays quiet:
$ npx airlock-rls --site https://your-app.com ✓ No problems. RLS audit passed. (exit 0)
Found one? Rotate the key in your Supabase dashboard (Settings → API), move it to a server-only environment variable, and never prefix it for the browser. Then re-run the scan to confirm it's sealed.
Airlock is MIT-licensed and tested. The same engine also runs the full RLS audit — disabled RLS, permissive policies, public storage buckets, and functions that bypass RLS — and can prove a leak by reading your tables with the anon key.
A key you rotated today can leak again on the next deploy. Airlock Monitor re-checks your app on a schedule and alerts you the moment something reopens — the service key, RLS drift, a newly public table.
See Airlock Monitor →