Smoke Run answers

Is my Lovable or Supabase app exposed to the public?

The short answer

Many apps built with Lovable, Bolt, or Supabase ship a database whose tables can be read by anyone who loads the public key in your page. You can check your own app from the outside in about a minute, with no login, using the free Am I exposed self-check on getsmokerun.com. It asks your project which tables answer an anonymous visitor and tells you in plain language, without ever reading row contents or storing anything.

The public key in your page is not the mistake. An unprotected table is. The two feel the same from the browser, which is why this slips past so many launches.

Why this happens with AI builders

Supabase and similar backends ship an anonymous key that is meant to live in your front end. It is public by design. The safety does not come from hiding that key. It comes from Row Level Security, a rule on every table that decides which rows an anonymous request is allowed to read.

AI builders scaffold tables fast, and Row Level Security is easy to leave off or leave too open. When that happens, the key that is supposed to be public becomes a door into a table that should have been locked, and nothing in the running app looks wrong.

What exposure actually looks like

Exposure means an anonymous request to your project returns rows it should not. Someone who views the source of your page, takes the public key, and queries a table can read customer names, emails, orders, or messages, with no account and no hacking.

It is quiet because your own app only asks for the rows it needs, so it looks fine. The exposure is in what else the same open table will answer when a stranger asks directly.

Check your own app, free

Smoke Run runs a free self-check for this. You enter your own app address, and it reads your public page and asks your project which tables answer a request with no login. It reports the result in plain words.

The check is read-only and polite by design. It never reads row contents, it never uses any key it finds, and it stores nothing. Only run it on apps you own.

What to do if a table is open

If the check finds an open table, the fix lives in Supabase. Turn on Row Level Security for that table, then add a policy that matches who should actually be allowed to read it, which for most app data is only the signed-in owner of the row.

Then run the check again to confirm the table no longer answers an anonymous request. Exposure is one of several silent failures. A checkout that breaks without an error is another, and Smoke Run watches that money path too.

Common questions

Is the public Supabase key supposed to be secret?

No. The anonymous key is designed to be shipped in your front end and is public by intent. Safety comes from Row Level Security on each table, not from hiding the key. A visible key over a well-protected table is fine.

Does the check read my customer data?

No. It only asks which tables answer a request with no login. It never reads the contents of any row, never uses a key it finds, and stores nothing from your project. It reports which tables are open, not what is inside them.

What do I do if I am exposed?

Enable Row Level Security on the open table in Supabase and add a policy that restricts reads to the right users, usually the signed-in owner. Then re-run the check to confirm the table no longer answers an anonymous visitor.

Is this the same as a full security audit?

No. It is a fast outside check for one common, high-impact mistake, not a certification. It is a sensible first step, and Smoke Run itself is not SOC 2 certified. Treat a clean result as one risk cleared, not a guarantee the whole app is secure.

Check whether your app is exposed

Point the free Am I exposed check at your own app. In about a minute you get a plain-language list of which tables a stranger could read, if any. Read-only, nothing stored, only for apps you own.

Related

Last reviewed 2026-11-04. Smoke Run runs a synthetic customer through your money path and connects to your systems read-only. We can look, we cannot touch.