Checklist
Pre-launch security checklist for vibe-coded apps
A practical pass over secrets, database rules, auth, payments, and abuse before you share the URL of an app built with Lovable, Bolt, Cursor, or a similar tool.
Updated 16 Oct 2026
This is a practical checklist, not a guarantee. It is not a penetration test, a compliance audit, or proof that an app is safe to launch.
Run this on the project you are about to share, not on a memory of what the builder “usually” does. AI tools repeat the same shortcuts: a key in the client, a table with no access rule, a payment button that trusts the browser.
Before anyone else has the URL
- Decide which URL is production and which URLs are previews. Preview links are often public. Treat a preview that has real data as production.
- Read the environment variable list in the host dashboard. Anything that starts with
NEXT_PUBLIC_,VITE_, orPUBLIC_is shipped to the browser. - Search the repo and the built JavaScript for
sk_live,service_role,sk-,AKIA, and private keys. If you find one, rotate it. Then remove it. Rotating without removing it just leaks the next one. - Confirm the app is served over HTTPS and that you are not shipping a debug page, a stack trace, or a seed script with a known password.
Data access
- Open every table the client can query. If you use Supabase or Firebase, follow the Supabase RLS checklist or the equivalent rules screen. “It works when I am logged in” is not a test. Try a second account, and try no account.
- Check storage buckets and file URLs. A private table with a public bucket is still a leak.
- If the client uses a “publishable” or “anon” key, confirm the server rejects requests that key should not be allowed to make. The key is not secret.
Accounts
- Sign-up, password reset, and session cookies should be set by the server. A token stored in
localStorageis readable by any script that runs on the page. - Try to open an admin or billing route while logged out, and while logged in as a normal user.
- Turn off any default account the builder created, or change its password and remove it from production data.
Money and email
- A “payment succeeded” screen is not proof of payment. The server should hear it from the provider, with the signature checked. See the Stripe webhook checklist if you use Stripe.
- Receipts and password resets should go through an email API on the server, not through a key in the frontend. See API keys in the frontend.
Abuse
- Add a limit on sign-up, login, password reset, and any route that calls a paid model. Hiding the button is not a limit. See rate limiting.
- If the app accepts uploads or URLs from users, decide the maximum size and what happens with a file you did not expect.
After the checklist
- Run at least one scanner from the security scanners category against the URL you will share, if you are allowed to scan it.
- Turn on error monitoring so the first failure is not a user emailing you a screenshot.
- Write down what you did not check. A checklist you finished is still a partial look.
Not a guarantee. This page will miss flaws that depend on your business logic. It is not a penetration test.