Valas
ENSLBGDE
WhatsApp →
Menu
Reading · for founders after Lovable, Bolt, Replit or Cursor

Vibe-coded app security checklist: 12 things to check before you take money

You built it in a weekend, people signed up, someone wants to pay. Before they do, spend an hour on this list. None of it requires reading code. All of it has sunk a real app in the last year.

A note first: this is not an argument against vibe coding. You used the fastest tool there is to find out whether anyone cares, and you found out. "It works" and "it's secure" are simply different properties, and the model that wrote your app will tell you confidently that it has both. Check.

Secrets

1
Are any API keys in the browser?
Open your live app, press F12, look in Sources and Network for strings that start with sk_, sk-, AIza or contain "secret". Anything you find is public. Anyone can run up your OpenAI or Stripe bill with it - people have woken up to five-figure invoices this way.
2
Is your repo public, and has a key ever been committed?
Deleting a key from a file does not delete it from git history. If one was ever pushed, rotate it today.
3
Does your database's service key live anywhere a user can reach?
Supabase's service_role key and Firebase admin credentials bypass every rule. They belong on a server only.

Who can see whose data

4
Is row-level security on, for every table?
Create two test accounts. Log in as one, and try to request the other's data by changing an ID in the URL or in a request. If you can see it, so can everyone. This is the single most common finding in vibe-coded apps.
5
Are admin pages protected on the server, or just hidden?
Type the admin URL while logged in as a normal user. A route that's merely not linked is not protected.
6
How are passwords stored?
If you built your own login rather than using the platform's auth, ask the model to show you the table. If you can read a password, it's plaintext. Switch to the platform's auth or a proper library before anyone else signs up.

Money

7
Can the paywall be skipped from the browser?
Open the dev tools, find the element hiding the premium feature, delete it or change display:none. If the feature now works, your subscription check lives in the front end. Real apps have been bypassed with two lines of CSS. The check - "does this user have an active subscription?" - must happen on the server, every request.
8
Are payment webhooks verified?
Stripe, RevenueCat and the app stores send a signature with every event. If your code doesn't check it, anyone can send your server a fake "payment succeeded".
9
What happens on refund, cancellation or failed renewal?
Test each one. The happy path was generated; the unhappy paths usually weren't.

Running it

10
Do development and production share a database?
If you've ever "tested something" and real users saw it, they do. Separate projects, separate keys, and a way to roll back a deploy.
11
Is there any rate limiting?
Especially on anything that calls an LLM or sends email. Without it, one script turns your token bill into a security incident.
12
Where does your users' personal data physically live?
Default regions are often in the US. Analytics SDKs and AI calls send data to third parties. If your users are in Europe, you need to be able to answer this in one sentence - a corporate customer or a regulator will ask.
If you found more than two

Stop taking new payments until they're fixed, then get a senior engineer to review the whole thing - most of these take an afternoon to find and days to fix, not a rewrite. We do this review in days and write down harden-or-rebuild, with reasons.

Vibe-coded → production →

What you can't check from the outside

The list above catches the loud problems. The quiet ones - a database schema that will fall over at ten times the rows, a dependency with a known vulnerability, a background job that silently fails, the absence of any test that would catch a regression before a user does - need someone to read the code. That's a review, not a rebuild. Beware anyone whose first answer is "start from scratch, six months, six figures": what you built is a working specification that encodes every decision you made while talking to customers. Don't pay for the same app twice.

The last 20% isn't more prompting

Every founder who has vibe-coded a product knows the wall: each fix breaks something else, the app gets slower, and the model's confidence stays exactly where it was. That's not a prompting problem. It's the point where engineering starts - tests, structure, boring reliability. We ship with Claude Code on our own products and know precisely where the tools are brilliant and where they quietly lie. If you want a second pair of eyes, send the repo link and the one thing that scares you most on WhatsApp.

Vibe-coded → production → Next: your developers stopped responding → Valas →