Skip to contentLockpick
How it worksPricingDocs

Read

  • BlogPlain answers to common security questions
  • GuidesStep by step fixes for common setups
  • Security checksEvery check we run, explained

Learn

  • Learn with PickTwo-minute lessons on how sites get attacked
  • Lockpick for ClaudeCheck sites from Claude and other assistants
  • GlossaryThe words we use, in plain words

Company

  • ChangelogWhat changed, newest first
  • StatusWhether scans are running right now
  • Security and trustHow we check and what we never do
Sign inCheck it
Guides

Supabase security checklist for apps built with AI

By Mark KashefPublished October 8, 2026

A Supabase app is protected by two layers. Grants decide whether a role can reach a table at all, and row level security decides which rows it can see. Your keys decide which role a request runs as. Atlas, our example app at atlas.example, uses Supabase for every example below.

Which key can go in the browser?

Supabase says anyone can read the publishable key, so it only reaches what Row Level Security allows. A secret key bypasses every Row Level Security policy, and Supabase says never to put one in a browser, a shipped application or source control. So the publishable key in Atlas's bundle is expected, and the secret key belongs only in server code and Edge Functions.

Curious what your site shows from outside? The quick check is free and needs no account.

Check it

Is row level security on for every table?

Supabase says a table in an exposed schema without RLS is readable and writable by any role with a grant on it. Turn it on for every table your app reads through the Data API, then add a policy for each thing a person should be able to do.

What changed about new tables?

Supabase stopped automatically exposing new tables in the public schema to the Data API for new projects from May 30, 2026, as a gradual rollout over a few weeks. It applies the same setting to all existing projects on October 30, 2026. After that, a new table needs an explicit grant before the Data API can see it.

What does an outside check prove?

Less than it seems.

What a request without signing in gets backWhat it showsWhat it does not show
RowsThe role has a grant and a policy allows the readThat RLS is off, because a policy may allow it on purpose
An empty resultNo row matched for that roleThat the table is safe
A permission errorThe role has no grant on the tableThat RLS is on

Supabase says a missing grant returns a permission error, whereas a policy that matches no rows returns an empty result. With the new default, a refused or empty read can simply mean the table was never granted to the Data API. Neither one proves the table is well protected, so review each table's grants and policies yourself.

How to check

  1. Open the Security Advisor in your Supabase dashboard and fix what it flags.
  2. Run a quick check on your published address to see what a stranger sees, then read how we check for what it covers.
  3. Copy each fix prompt into your builder and review the change.

Questions people ask

Is it safe to have the Supabase publishable key in my frontend?

Yes, that is what it is for. It only reaches what your row level security policies allow, so the policies are what protect your data.

If a table returns nothing without signing in, is it safe?

Not necessarily. An empty result or a permission error can mean the table has no grant for that role. Check the table's grants and policies directly.

See what your site shows from outside

A quick check reads your homepage the way a visitor would and gives you a score. No account needed.

Check your site

Related pages

  • Supabase anon key vs service role key, which one can be in your frontend
  • Lovable security checklist for a live app
  • Bolt app security checklist for a live site

Sources

  1. API keys Supabase docs, read on October 6, 2026
  2. Breaking change, tables not exposed to Data and GraphQL API automatically Supabase changelog, read on October 6, 2026
  3. Row Level Security Supabase docs, read on October 6, 2026

About the author

Mark Kashef, Founder of Lockpick

I'm Mark, and I build Lockpick. I write these pages, and each one is checked against its sources before it goes live. The Updated date changes only when the page itself does.

Lockpick
PricingMethodologyDocsBlogGuidesSecurity checksLearn with PickSecurity and trustLockpick for ClaudeChangelogStatusFacts for AI assistants

Lockpick is a security scanner for vibe-coded apps. It checks what your live site exposes and what a GitHub repo or AI skill would do before you install it, then gives you a fix prompt for Lovable, Bolt, Replit, Cursor or Claude Code.

Lockpick assesses public pages you are authorized to test, and public GitHub code it never runs.

© 2026 LockpickTermsPrivacyContactSign in