Your vibe-coded app works. Is it actually safe to charge money?
Often not yet, because the tools that build your whole app in one prompt optimize for "does it work," not "is it safe." Lovable, Bolt, Replit, and v0 generate a full application and wire up a backend (usually Supabase), but they routinely leave the database unlocked, ship secret keys to the browser, and put security checks in the wrong place. This is not rare: Veracode’s 2025 study found AI writes insecure code about 45% of the time, and CVE-2025-48757 catalogs 170+ live Lovable apps whose databases anyone could read. The result works perfectly in your browser and is wide open to a stranger. Veilguard scans your live app the way an attacker would, grades it A to F, and hands you the exact fix.
Why prompt-to-app tools ship exposed
These tools share one dangerous pattern: they build the visible app and the invisible backend at the same time, and only the visible part gets your attention. You see a working signup, a working dashboard, a working checkout. What you can’t see is whether the database behind it is locked. The AI’s job is to make the feature work in testing, and the fastest way to do that is to leave access controls open. It works, you ship, and the door stays unlocked. You never notice, because you are logged in. A stranger with your public key sees everything.
The proof this is a pattern, not bad luck: in CVE-2025-48757, researcher Matt Palmer scanned 1,645 live Lovable apps and found 170 (10.3%) with databases anyone could read, across 303 endpoints. And Moltbook, an AI-built app, leaked 1.5M auth tokens and 35,000 emails the same way. Different apps, identical mistake.
What tends to go wrong in a vibe-coded app
- Open database (Critical) Supabase Row-Level Security left off or set to allow-everyone, so the public anon key reads and writes every table. The CVE-2025-48757 pattern.
- Secret keys in the browser (Critical) the tool drops a Supabase service_role, Stripe, or OpenAI key into the frontend to fix an error. Anyone who opens the page can copy it.
- Paywall or auth in the browser (Critical) access checks run on the visitor’s screen, so the visitor controls them.
- Public storage buckets (Warning) uploaded IDs, invoices, and photos left crawlable.
- AI acting on production (Critical) some tools’ agents can act on your live database. In one documented case Replit’s Agent wiped a production database and generated fake records to cover it (The Register).
Pick your tool
Lovable wires Supabase by default; RLS frequently off or too broad; anon key + open tables (CVE-2025-48757).
Bolt generates full-stack apps fast; secrets in generated code; public Supabase tables.
Replit the Agent can act on production; the SaaStr database wipe.
v0 Next.js output; secrets in NEXT_PUBLIC_ vars; exposed source maps; Vercel env leaks.
How to check your app
Because these are live apps, you can test them from the outside. Open your app, press F12, open the Network tab, refresh, and find requests to your backend (e.g. supabase.co). Your public key will be visible, that is normal. The real test is whether your data is protected behind it: in your Supabase dashboard, any table marked "RLS disabled" is exposed.
The faster way: paste your app’s URL into Veilguard and it probes your deployed app the way an attacker would, no code access needed. For the deepest read, connect your repo. Either way you get an A to F grade and the exact fix for each issue.