Your Supabase key is in your deployed JavaScript. One of them is fine, one is an emergency A developer's writeup explains how to determine whether a Supabase key exposed in a deployed JavaScript bundle is harmless or critical by decoding the key's JWT payload and checking its role claim: anon or sb_publishable keys are designed to be public, while service_role or sb_secret keys bypass every Row Level Security policy. Testing on a PostgreSQL 16.15 server, the author found that a role with the BYPASSRLS attribute, which service_role holds, returned every row in a table including other users' data under the same query and policy that returned zero rows for an RLS-restricted role. The recommended response is to rotate the key first, then verify RLS is enabled on every table via the Supabase dashboard and Security Advisor. Someone opened your live site, pressed Ctrl+U or F12, and found your Supabase key sitting in the code. Or a scanner flagged it, or the AI that built the app warned you about it after the fact. Now you do not know whether you have shipped something harmless or handed over your whole database. Both are possible, and the difference is one word inside the key. This note is the check, and the fix if the answer is the bad one. Step 1. Find the key. Open your live site, press F12, go to the Sources or Debugger tab, and search the files for supabase . Or on your own machine, build the app and search the output folder: npm run build grep -ro "eyJ A-Za-z0-9 - " dist/ | head grep -ro "sb a-z A-Za-z0-9 " dist/ | head Use build instead of dist if that is what your framework writes to. Both commands are read-only. Step 2. Read what the key says it is. A Supabase key that starts with eyJ is a JWT, and its middle section is plain text that anyone can read. Paste the key into this, in a terminal: echo "