Free self-check · 5 minutes · no tools needed

The 12 ways vibe-coded apps die in production

We audit apps built with Lovable, Bolt, v0, Cursor, Claude Code, Codex, ZCode and other AI coding agents. The same defects show up over and over — here's the full list, how to spot each one yourself, and what a fix looks like.

Ask about an early-access review →

Tier 1 — kills you this week

Critical. Each of these is exploitable by any bored bot or stranger within minutes of discovery.

  1. API keys in client code.

    Any sk-... readable in the browser bundle gets harvested by bots within minutes of deploy. OpenAI bills arrive before you notice.

    Spot it: view-source / DevTools → search your deployed site for sk-. Fix: move the call server-side, rotate the key.

  2. Supabase service_role key on the frontend.

    This key bypasses all Row Level Security. If it's in client code, every visitor effectively has admin access to your database.

    Spot it: search your bundle for service_role or a JWT whose payload reads "role":"service_role". Fix: never ship it; use the anon key + RLS.

  3. Tables without RLS.

    CREATE TABLE without ENABLE ROW LEVEL SECURITY means anyone with your anon key (it's public!) can read, edit and delete every row — including other users' data. The most common single breach in Lovable/Bolt apps.

    Spot it: Supabase dashboard → Table Editor → every table needs "RLS enabled". Fix: enable RLS + a per-user policy.

  4. Live Stripe secret exposed.

    Attackers can issue refunds and manipulate your account with it.

    Spot it: search bundle for sk_live_ / rk_live_. Fix: server-side only + rotate in the Stripe dashboard.

  5. .env committed to the repo.

    Push to GitHub — even private, later public, or a contractor's clone — and every secret ships with it.

    Spot it: does your repo contain a real .env file? Fix: purge from history, rotate everything, gitignore.

Tier 2 — bleeds you quietly

High. No dramatic breach; just slow, expensive damage.

  1. Zero access policies in version control.

    Rules that exist only in the Supabase dashboard are invisible to review and silently lost on re-imports.

    Spot it: do you have supabase/migrations/*.sql with policies, or did you click them together in the dashboard? Fix: export to migrations.

  2. Admin routes with client-side-only guards.

    Hiding a button is not access control; the API underneath must check roles. Anyone can call your admin API directly.

    Spot it: log out, then request your admin API endpoint directly. Did it answer? Fix: server-side role checks.

  3. No rate limiting on auth / AI endpoints.

    One scripted loop burns your LLM budget or brute-forces logins while you sleep.

    Spot it: search your server code for any rate limiter. If none exists, you have none. Fix: per-IP limits on /auth and AI routes.

  4. Vulnerable dependencies.

    Pre-written exploits, zero skill required.

    Spot it: run npm audit in your project. Fix: bump the flagged packages.

Tier 3 — erodes trust

Medium/low. The stuff visitors feel before they ever trust you with a signup.

  1. Missing security headers.

    No CSP, no HSTS, iframeable pages — turns small bugs into real exploits.

    Spot it: paste your URL into securityheaders.com. Fix: add the standard headers at your edge.

  2. Slow first response / cold starts.

    Over ~3s time-to-first-byte and visitors leave before your app loads.

    Spot it: DevTools → Network → disable cache → reload → look at the first request's TTFB. Fix: edge caching or a lighter hosting setup.

  3. Dead links & broken flows.

    The fastest trust-killer for first-time visitors.

    Spot it: click every link on your landing page and primary flow on a phone. Fix: exactly what it sounds like.

The 5-minute self-check

No tools beyond your browser. If any step finds something, it's worth a real audit.

  1. Open your deployed app → right-click View Page Source (and view source of your JS bundle if it's one file). Search for sk-, service_role, _live_. Any hit = stop and rotate that key today.
  2. Open DevTools → Network → reload → click through your app. Any request going straight to api.openai.com (or Anthropic/Google) from the browser? That's a key exposure + an unthrottled bill.
  3. Supabase dashboard → Authentication → Policies (or Table Editor). Every table should say RLS enabled. One table without it = anyone can read it.
  4. Open your repo. Is there a real .env file committed? Is there an .admin route you can reach by typing the URL while logged out?
  5. Feel the speed: DevTools → Network → disable cache → reload. First request taking seconds? That's first-time visitors leaving.

All clean? You're ahead of most vibe-coded apps. Anything red? That's what we fix daily.

Want help prioritizing the checklist?

Our scanner automates the repository, deployed-bundle, and bounded public-site checks it can observe, with coverage status shown in the report. Dashboard state, authenticated authorization, business flows, and data ownership require explicit manual verification. During validation, selected early-access scans may be free; this is not a production SLA or a promise of fixes.

Apply for early-access review →

The form composes a structured application email, or include your email, app name, public HTTPS URL or public repository, builder, requested tier, and authorization confirmation. Never send passwords, tokens, API keys, private keys, or .env files.