Is your v0 app actually secure?

v0 generates a React or Next.js app and deploys it to Vercel, often with Supabase or a hosted Postgres for data. The build is fast and clean, but the security settings are not part of what it generates. This page explains what to check and scans your live app now.

Scan your v0 app

Paste your live v0 or Vercel URL. Read-only: it never changes your app.

What it means

Your database tables can be read by anyone, not just logged-in users. Someone could open your app's data — customer emails, orders, private records — without ever creating an account.

Why AI tools cause it

Supabase only protects a table once you turn on Row Level Security (RLS) and write access rules for it. AI tools frequently build a working app without doing that, so the tables are wide open by default.

How xlogs checks it

xlogs finds your public Supabase URL and anon key in your app (the same ones your frontend uses), asks the database as an anonymous user which tables it can read, and flags any that return real rows. Read-only: it never writes or deletes.

What breaks most often on v0 apps

Two issues show up on v0 apps more than any others. If the app uses Supabase, the database is often readable by anyone because Row Level Security was never turned on. And because v0 builds real production frontends, it is common to see source maps shipped to production, which let anyone download your original code.

Neither shows up while you use the app. The scan below checks the deployed app for both, plus exposed keys and missing headers.

The top v0 security issues to check

  • Publicly readable Supabase database (Row Level Security off)
  • Source maps that expose your original source code
  • An API key or service key exposed in the client bundle
  • Missing security headers (CSP, HSTS, X-Frame-Options)

How to fix it

The goal: Row Level Security is enabled on every table, with policies so a table only returns rows to users allowed to see them; no table returns private data to an anonymous request.

  1. Enable Row Level Security (RLS) on every table, especially the affected spot
  2. Add a policy per table so only authenticated users can read/write their own rows (keep intentionally-public tables public on purpose)
  3. Re-check that an anonymous request no longer returns private rows
Paste this to your AI coding tool (Lovable, Cursor, Claude Code):
In my app (the spot the scan shows): anyone can read this database table. Please make this true: Row Level Security is enabled on every table, with policies so a table only returns rows to users allowed to see them; no table returns private data to an anonymous request. Steps: Enable Row Level Security (RLS) on every table, especially the spot the scan shows; Add a policy per table so only authenticated users can read/write their own rows (keep intentionally-public tables public on purpose); Re-check that an anonymous request no longer returns private rows. Then tell me exactly what you changed, and do not print any secret values back to me.

Then verify: After you deploy the policies, xlogs repeats the same anonymous read test and confirms the table no longer returns data without a login.

Common questions

Does v0 handle security for me?

No. v0 generates the app and Vercel hosts it, but neither turns on database access rules or strips source maps or sets security headers for you. Those are decisions about your project that have to be made explicitly. The scan shows which are missing.

Why would my v0 app leak its source code?

Build tools generate source maps to help with debugging, and it is easy to ship them to production by accident. When they are public, anyone can reconstruct your original, unminified code (and any secrets in it) straight from the browser. The scan checks for this.