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 and Cursor. 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.

Have us check all 12 for you →

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 all 12 checked properly?

Our automated scan covers every item above (plus deeper checks scanners usually miss), delivered as a plain-English report — and we fix the top findings in review-ready PRs. First audits are free while we build our public track record.

5 free audits every week · full report + fix PRs · 48h turnaround