Vibe coding security checklist
Ten checks before you launch an app an AI wrote
Coding agents write code that runs. What they skip is the boring part: who is allowed to call each route. The leaks that make the news are rarely clever. They are a table with nothing in front of it. Go through this list, or paste your repo and let Wyro run the ones marked below.
Free for public repositories. No account and nothing installed. Lovable, Bolt and v0 projects work once they are synced to GitHub.
The checklist
Every route that touches the database checks who is callingWyro checks this
Not most routes. Every one, including the one the agent added last night for an admin page. Wyro maps every endpoint to the tables it reaches and reports each path with no authentication on it (
auth-before-data), with the file so you can confirm it.Signed in is not the same as allowedWyro checks this
A route that checks the user is logged in but then loads
/orders/:idfor any id lets every user read every order. Scope each query to the caller. Wyro points out routes where any signed-in user can reach the data (authenticated-no-authorization); the query scoping itself you still read by hand.Row-level security is on for every Supabase tableWyro checks this
If the app talks to Supabase from the browser, RLS is your only lock. See the Supabase RLS checker for the two SQL queries and what Wyro reads from your migrations.
No secret keys in client code
Search the repo for
sk_,service_role,SECRETand private keys. Anything prefixedNEXT_PUBLIC_orVITE_ships to every visitor. If a secret shipped once, rotate it.Sign-in, sign-up and password reset are rate limitedWyro checks this
Without a limit, a login form is a password-guessing API and a reset form is a free email cannon. Wyro warns on public entry points with no rate limiter or validation (
public-entry-guarded).Every input is validated on the serverWyro checks this
The form's validation is a suggestion; the request can say anything. Parse bodies with a schema (zod, pydantic) before they reach a query.
Webhooks verify their signature
A Stripe or GitHub webhook route is a public URL. Verify the signature header with the provider's secret before trusting the payload, or anyone can mark an order as paid.
Background functions check the caller tooWyro checks this
Cron routes, Edge Functions and queue handlers are reachable over HTTP. Check a shared secret or the caller's token; "nobody knows the URL" is not a check.
File uploads are private by default
Public buckets serve every file to anyone with the link. Use private storage and short-lived signed URLs.
Check again after every changeWyro checks this
The checklist goes stale with the next prompt. Run
npx wyro-checkin CI so only new findings fail a pull request, or watch the repo and get an email when a push adds one.
Keep it that way
A check run once goes stale the next time an agent adds a route. Sign in, press Watch this repo on its report, and Wyro emails you the day a push adds a new finding. Free.
Questions
What is vibe coding security?
Making sure an app written mostly by an AI coding tool does not expose data or actions to people who should not have them. The most common failure is a route or table with no authentication in front of it, not an exotic exploit.
Which of these can be automated?
The structural ones: which routes reach which tables without authentication, Supabase RLS off or open, missing rate limits and validation on public entry points. Business rules, like whether a query is scoped to the current user, still need a human read.
Does Wyro use AI to check my code?
No. It parses the code into routes, middleware and tables and runs fixed rules over that graph, so the same commit always gets the same answer and every finding points at a file you can open.
Which stacks does it read?
Express, Fastify, Hono, NestJS, Next.js route handlers and Server Actions, FastAPI, and Supabase. Schemas from Prisma, Drizzle, TypeORM, Mongoose, SQLAlchemy and SQL migrations.