A Supabase table anyone can read
create table profiles (id uuid primary key);+alter table profiles enable row level security;+create policy "own row" on profiles+ for select using (auth.uid() = id);
Security and GDPR checks for vibe-coded apps. They run inside Claude Code, Cursor and Codex, so your code never leaves your machine.
Example: Claude Code runs a Vibefilo check, finds an RLS blocker, an exposed Stripe key and a consent issue, fixes two and verifies them.> check this app with vibefilo before I launch⏺ vibefilo - vibefilo_start_audit (MCP)(mode: "normal")⎿ Normal check started · 50 credits · 150 left⏺ Read supabase/migrations, app/api, lib, app/layout.tsx (41 files)⏺ Found 3 issues worth fixing before launch:BLOCKER profiles table has RLS disabledHIGH STRIPE_SECRET_KEY read from NEXT_PUBLIC_ envMEDIUM Google Analytics loads before consent> fix the blocker and the secret⏺ Update(supabase/migrations/0007_profiles_rls.sql)⎿ Added 6 lines: enable RLS, select and update own row⏺ Update(lib/stripe.ts)⎿ Moved key to server-only STRIPE_SECRET_KEY⏺ Re-checked both. 2 verified fixed, 1 open. Synced to your dashboard.
Understands apps built with
Vibe-coded apps work, and they repeat the same security and privacy gaps. Vibefilo finds each one, your agent fixes it, and a re-check proves it.
create table profiles (id uuid primary key);+alter table profiles enable row level security;+create policy "own row" on profiles+ for select using (auth.uid() = id);
-new Stripe(process.env.NEXT_PUBLIC_STRIPE_SECRET!)+import "server-only";+new Stripe(process.env.STRIPE_SECRET_KEY!)
+const user = await getUser();+if (!user) return new Response(null, { status: 401 });const invoice = await db.invoice.find(id);+if (invoice?.userId !== user.id) return notFound();
-<Script src="https://googletagmanager.com/gtag/js" />+{consent.analytics ? (+ <Script src="https://googletagmanager.com/gtag/js" />+) : null}
-We may share data with trusted third parties.+We use Supabase (EU region), Stripe and Resend.+Each one has a signed DPA.
<Section title="Your data">+ <ExportDataButton />+ <DeleteAccountButton /></Section>
Install once. Claude Code, Cursor, Codex, Windsurf and VS Code all get the same checks.
Lite for blockers after any change, Normal while you build, Full before you launch.
Only the rule, file, line and a masked snippet reach Vibefilo. Secret values never leave.
A finding only closes after a re-check passes, so your score tells the truth.
Every run from every agent lands in the same project for your whole team.
Your agent saves a Markdown copy of each run in vibefilo-scans/, next to the code.
One command connects Claude Code, Cursor, Codex, Windsurf and VS Code. Sign in once with a device code in your browser.
Run one command in your project. It finds your agents and connects them.
$ npx @vibefilo/mcp initYour agent shows a short code. Confirm it in the browser, no keys to paste.
Tell your agent to check the app with Vibefilo. It does the rest.
$ npx @vibefilo/mcp init✓ Detected Claude Code, Cursor, Codex✓ Linked this folder to my-saas› vibefilo_statusSigned in · 200 credits› vibefilo_estimate mode: normal50 credits› vibefilo_start_audit mode: normalrun started · 150 credits left› vibefilo_submit_findings 3 findingssynced · dashboard updated
Approved. Back to your agent.
Every new organization gets 200 free credits, enough for a Full check and its fixes before launch. Your agent shows the cost before every check.
Blocker-level rules on current code and config. No live requests.
15credits
After any change, before a commit
All security and privacy checks at code level, plus key accessibility rules.
50credits
Regular checks while you build
Everything at full depth, git history, live checks, the Ready verdict and PDF report.
100credits
Before launch or a client handover
Credits last 12 months. Failed runs are refunded.
6 things people ask before their first check.
$ npx @vibefilo/mcp init