Security check for Supabase apps
Your app ships the anon key to every browser. Paste your URL: we look for leaked service_role keys and, after you verify your domain (free), check what that key can read.
First scan is free, no signup and no code access. By scanning you confirm you own this site or are authorized to test it, and agree to the Terms and Privacy Policy.
One key needs rotating before launch.
Built with Supabase · Vite · Vercel
Passive external check; application logic (SQLi, IDOR) is not tested.
Your project URL and anon key ship with your JavaScript, by design. Row Level Security is the only thing between them and your tables.
RLS gets turned on for the first tables, not always for the later ones. New Supabase projects no longer expose new tables by default, but older projects, and tables an AI tool exposed with its own grants, can still answer anyone.
A service_role key in client code bypasses RLS completely. It is the database password with a friendlier name.
Demo replay
A demo of what runs when you paste the URL of an app on Supabase. The key checks run on every scan; the table checks run after you verify the domain.
How Supabase apps end up open. Public checks run on every scan; Verified ones after you prove the domain is yours.
Up to 25 tables your bundle or API schema references, each asked for one row with the anon key. We keep the status and column names, never the row
After you verify
We decode every Supabase key in your JavaScript. A service_role key bypasses Row Level Security completely
Public
Whether the REST API root lists your tables and views to anyone, a map for someone looking for open tables
After you verify
About 40 key patterns, such as OpenAI, Stripe and database connection strings, in the bundle and source maps
Public
How it works
No code, no login, no setup. The first scan takes about a minute.
Each issue is explained by its consequence, in plain English, ranked by severity.
Copy the fix prompt for the issue and paste it into your AI tool.
Verify your domain for free to unlock the deeper checks, then rescan to see the issue gone.
Free first scan. No signup, no code access.
01The bundlePublic
Supabase apps call the database from the browser, so the project URL, the anon key and the table names are in your JavaScript. That is by design.
/assets/index-7b20.js
const sb = createClient(URL, ANON_KEY)sb.from("orders").select("*")sb.from("profiles").select("name")
02The rolePublic
We decode each Supabase key. role: anon is expected. role: service_role skips every policy, and that is critical.
decoded key payload
{ "iss": "supabase", "role": "anon", "ref": "qzv…"}
03The tablesVerified
After you verify the domain (free), we ask each table the bundle names for one row with that public key. We keep the status and column names, never the values.
Verified check
GET /rest/v1/orders?select=*&limit=1200 OK · 1 row[{ "id": "•••", "customer_name": "•••", "address": "•••"}]
Values hidden. We store the status and column names only.
04The fixPublic
The finding comes with a prompt for the policy it needs. Apply it, rescan, and the table returns no rows to a stranger.
Fix prompt for your AI tool
Write a migration that enables Row Level Security on "orders" and adds a select policy so a signed-in user only sees rows where user_id = auth.uid(). Do not add any policy for the anon role.
Example data. Values in the table check are hidden.
Inside the report
Every issue comes with a prompt for the tool you build with: Lovable, Bolt, Cursor, Claude and more. Apply it, then rescan to see the finding gone.
Supabase security guideCritical
orders tableThe table answers the public anon key without login, so every order, with names and addresses, is readable by anyone.
GET /rest/v1/orders?select=*&limit=1 with the anon key
My Supabase table "orders" can be read by anyone with the anon key. Write a migration that enables Row Level Security on "orders" and adds a select policy so a signed-in user only sees rows where user_id = auth.uid(). Do not add any policy for the anon role. Check every other table the app uses the same way.
Compared
| What | Shypset | Supabase Security Advisor | Manual pentest |
|---|---|---|---|
| Where it looks | Your live site, from outside | Your project, from inside | Your app, by a security tester |
| Headers, TLS, DNS, email | Checked on every scan | Not covered | Usually covered |
| Works for any stack or host | Yes | Only the Supabase project | Yes |
| Logged-in logic (IDOR, per-user rules) | Not tested | Lints RLS policies; doesn’t test logic | Yes |
| Cost and time | First scan free, about a minute | Free, inside the tool | Quoted per project, days to weeks |
Run the built-in scan too: it sees the inside. Shypset shows what a stranger sees.
A scan takes about a minute. Table and file checks run after free domain verification.
Your first scan is free, no signup needed. Upgrade when you want the full report and fix prompts for every issue.
For your first check before launch
$0/ month
For founders shipping AI-built apps
$15/ month
Billed monthly, $180 a year
For agencies and freelancers. Coming soon
Soon
$9 one-time
One domain for 30 days: the full report and every fix prompt, plus 3 rescans. The public report and badge are not included.
Yes, if every exposed table has Row Level Security with correct policies. The key is not a secret; the policies are the security.
The table check asks for one row to see whether access is open, then discards it. We store the status and column names only.
No. We test what an anonymous visitor can reach. Policies that let one signed-in user read another user’s rows need a logged-in test, which we do not run.
The first scan is free, with no signup and no code access. A free account gives you 3 scans a month. The full report and a fix prompt for every issue come with Pro or a one-time $9 Launch Pass.
Without verification we only read what any visitor’s browser can, plus public records such as DNS. Deeper checks, like asking your database tables for a row, run only after you verify that the domain is yours. Verification is free.
We check they actually do.Paste a URL and get the report in about a minute. First scan is free, no signup and no code access.
Real people read every message. Tell us what you need and we will answer by email.
Prefer email? Write to info@softdoes.com.