Six MIT tools that make RLS the default plus the whole multi-tenant SaaS, already built.
Paste your live URL. We check the two things that leak most in Supabase apps — a master key in your JavaScript, and tables anyone can read without logging in. No signup, and your data is never shown.
Open source, MIT, no signup. Each one makes the safe path the default — across RLS, auth, migrations, and abuse.
Paste your app's URL: we read the page and its JavaScript and tell you if the Supabase master key ships to the browser. No signup.
Scan your app → FREE · ONLINE RLS policy generatorPick who can access a table and get the migration: RLS, one policy per operation, grants and indexes, tested against Postgres.
Generate policies → FREE · ONLINE RLS policy explainerPaste a policy and get it in plain English, plus a leak check: USING (true), a missing WITH CHECK, or anon with no per-user scope.
Explain a policy → FREE · MIT Supabase rules for your AIDrop-in rules so Cursor, Claude Code and Windsurf write secure Supabase by default: RLS, scoped policies, explicit grants, no service_role in the browser.
Get the rules → FREE · TEMPLATE nextjs-supabase-starterAuth + one table with RLS + a test that proves isolation. Clone it and start on your product.
Use this template → FREE · npm supabase-saas-kitThe CLI: scaffold a project, check your env + Supabase connectivity, and generate RLS-safe migrations.
npx supabase-saas-kit new → FREE · npm + Action~150 ↓/mo · Oct 2026 airlock-rlsStops the classic Supabase leak: a table shipped public. Fails the build when RLS is off or a policy is USING (true). Its paid tier, Airlock Monitor, is below.
Catches a server secret about to ship in the browser bundle. Fails the build on NEXT_PUBLIC_ secrets; warns on unauthed mutations and unverified webhooks.
Catches a migration that quietly turns RLS off in prod. Fails the build on a new table without RLS or RLS switched off; warns when a policy is dropped. No database needed.
npx airlock-migrate → FREE · npm airlock-ratelimitDrop-in rate limiting that doesn't punish families — keys authenticated requests by user, not shared IP. Token bucket, zero deps, typed.
npm i airlock-ratelimit →Same database, same tenant, same goal. One policy leaks, one blocks — and you can run the same request as the other tenant to prove the row was there all along.
Run the live demo →The paid line is the whole app, already built. One payment, yours forever — no subscription, no seat renewals, no expiring licence.
The whole app, built and proven — start on your product, not on plumbing. Pro adds billing (Paddle), an admin panel, and web push.
✓ Tenant isolation, proven live — watch a cross-tenant leak get blocked →npm test outputsrc/app/ (app)/ notes · settings · billing (auth)/ login · signup · reset admin/ platform admin panel api/ notes · billing · webhooks · push src/lib/ auth/ require-workspace · rls.test.ts billing/ paddle · webhook · plan admin/ queries · suspend push/ webpush · notify supabase/ server · client · admin supabase/migrations/ numbered RLS migrations e2e/ Playwright specs
$ npm test ✓ lib/auth/rls.test.ts isolation ✓ lib/auth/rls.meta.test.ts every table has RLS ✓ lib/billing/webhook.test.ts signed ✓ lib/auth/csrf.test.ts ✓ api/webhooks/paddle/route … and the rest of the suite Test Files all passed RLS isolation suite runs green on a local DB.
/admin: workspace + user counts, active subscriptions, suspend a tenantSTACK Next.js 16 · React 19 · TypeScript 5 · Supabase · last updated July 2026
DELIVERY Read access to the private GitHub repo. Enter your GitHub username on the receipt page and the invite lands in your inbox — clone and go. Seats = invites; the licence covers unlimited projects you own or build for clients.
UPDATES Repo access doesn't expire. Every future update lands in the same repository you already have. No renewal, no upgrade fee.
LAUNCH 30% off Base and Pro, every team size, for the first 20 buyers. Applied automatically at checkout (code LAUNCH30).
REFUND 14 days, money back, no hard feelings. Read the policy.
Checkout blocked by an adblocker or a corporate proxy? Email support@shipsealed.com and you'll get a direct link.
Airlock Monitor watches the database once real customers are in it.
CI checks the migrations you write. Airlock Monitor checks everything else your live database exposes — the surfaces that leak without a migration ever touching them. It re-audits every morning and emails you as soon as a check finds one.
USING(true) / WITH CHECK(true)
Storage buckets left public
Realtime tables readable by anon
SECURITY DEFINER functions that bypass RLS
Views running as owner, ignoring RLS
Findings come ranked CRITICAL → LOW, plus a monthly report of what's still open. Connect Supabase in two clicks (Finn creates a read-only user and discards the authorization, nothing to paste) and the first scan runs right away.
Subject: Airlock detected 2 NEW RLS exposure(s) in acme-prod
• invoices — table in "public" has RLS DISABLED — every
row is exposed to the API roles
• notes — [SELECT] any authenticated user reads all rows
(cross-tenant) — USING(true)
These rows are reachable with the anon key. Fix the migration
or add an allow-rule for intentionally-public policies.
rls.test.ts (isolation) and rls.meta.test.ts (every table has a policy)rls.test.ts + rls.meta.test.tsThe common RLS gotchas on one page: the policies, the tests, and the footguns that ship a table exposed.
No spam, unsubscribe anytime.
Auth, RLS and the tests that prove isolation, already built.
Re-audits your live database every morning and emails you as soon as a check finds something.