Find what your AI didn't.
The security scanner
for vibe-coded apps.
Lovable, Cursor, bolt.new, v0 and Claude Code ship fast — and skip security. 45% of AI-generated code has a vulnerability. vibeAudit launches real attacks against your live URL, chains them adaptively across 5 rounds, and hands back copy-paste fixes.
What we've been finding this week.
We scanned 46 AI-built apps. The numbers.
Not a checklist. An adaptive loop.
Static scanners run the same 30 checks on every app. They miss the specific thing wrong with your app because they've never heard of your stack's combination of Supabase + Clerk + a hand-rolled middleware.
vibeAudit's autoresearch loop re-plans each round. A leaked anon-key in round 1 becomes "now test every table that key unlocks" in round 2. An open IDOR in round 3 becomes "now enumerate every /api/*/:id route" in round 4.
Editable strategy
Hypotheses, focus areas, and chain triggers all mutate each cycle based on what worked.
Severity-weighted metric
One scalar score drives every branching decision — no arbitrary priorities.
Time-boxed with early stop
Per-test budget enforced; stops when the score plateaus. No wasted rounds.
Generic scanners can't test what they don't understand.
| Stack | vibeAudit tests | Others |
|---|---|---|
| Supabase | RLS bypass · anon-key privilege audit · storage ACL checks · service_role leak detection | ··· |
| Firebase | Realtime rules fuzzing · Firestore public-read detection · admin key scanning | ··· |
| Next.js | Server-Component data leak · API route auth bypass · env-var exposure · middleware skip (CVE-2025-29927) | partial |
| GraphQL | Introspection · depth bomb · batch attack · unauth mutation · field-level perms | partial |
| Clerk / Auth0 | Secret-key exposure · session fixation · missing auth middleware on protected routes | ··· |
| Prisma / Drizzle | Raw-query SQL injection · ORM-specific bypass via $queryRaw and tagged templates | ··· |
| Vercel / Netlify edge | Preview deployment leaks · env on public build · serverless timeout DoS | ··· |
| Generic (any stack) | OWASP Top 10 · 43 XSS payloads · IDOR across users · JWT alg-switch · CORS · headers · 30+ more | yes |
Every finding ships with the fix.
Supabase Row Level Security disabled on user_profiles
Any request holding your public anon-key can read and modify every row in user_profiles via the REST API — including email, phone, stripe_customer_id and address fields for all your users. Discovered via unauthenticated GET to /rest/v1/user_profiles?select=*.
-- RLS is not enabled on the table CREATE TABLE user_profiles ( id uuid PRIMARY KEY, email text, stripe_customer_id text, address jsonb );
ALTER TABLE user_profiles ENABLE ROW LEVEL SECURITY; CREATE POLICY "users read own profile" ON user_profiles FOR SELECT USING (auth.uid() = id);
Clerk publishable-key bundled with secret-key in client JS
We pulled /_next/static/chunks/page.js and grepped the bundle: the live production secret key was hard-coded next to the publishable key. Any site visitor can exfiltrate it and mint sessions as any of your users.
// app/layout.tsx — client component const clerk = new Clerk({ publishableKey: "pk_live_•••", secretKey: "sk_live_•••" // never in client });
// app/api/session/route.ts — server import { clerkClient } from "@clerk/nextjs/server"; const session = await clerkClient.sessions .verifyToken(req.cookies.get("__session"));
Cheaper than one false alarm from your pentester.
- 1 attack round (of 5)
- 15 tests (of 40+)
- Total issue count revealed
- Severity + fix locked
- No AI chain discovery
- 5 adaptive attack rounds
- All 40+ test types
- Every finding + fix code
- vibeAudit score + CVSS
- Compliance mapping (SOC 2 · GDPR)
- Everything in Deep Scan
- Scan history dashboard
- Rescan for free (30-day window)
- Slack webhook notifications
- Authenticated scans (2-user IDOR)
- Unlimited scans
- API access (coming soon)
- White-label reports (coming soon)
- Priority support
- First access to new rulesets