Security Research

Vibe Coded App Security Checklist: 19 Pre-Launch Checks, Ranked by Real Failures

We classified 400+ real posts from Lovable, Bolt, Replit, Cursor, Claude Code and v0 builders by what actually broke. Here is the test protocol, in the order the failures show up, split into what you can check yourself and what needs a developer.

27 min readShare →
400+
Builder security posts classified
60%
Involve database access control
43%
Involve exposed keys or secrets
9 of 19
Checks a non-coder can run

The fastest way to check whether a vibe coded app is safe to launch is the two-account test: sign up as two users and try to see the other one’s data. That single check targets the failure behind 60% of the 400+ security posts we classified from Lovable, Bolt, Replit, Cursor, Claude Code and v0 builders over the last 12 months (see our guide to building a SaaS with Cursor and Claude for the build side). Exposed API keys came second at 43%.

Every checklist ranking for this topic lists the same risks in the same order and says, in so many words, that the order is not measured. We measured it. We pulled 900+ Reddit posts from builder communities, kept the 400+ that were about the security of the builder’s own app, and sorted them into nine failure types. Then we checked the result against 99,000+ negative app-store reviews and 273,000+ Capterra reviews from our database of 1M+ real complaints.

This page is the pre-launch test protocol. It is not an architecture guide. If your app is already broken in production, start with vibe coding SaaS problems and how to fix them. If you already know you need help, read how to hire a developer to fix your vibe coded project. If you want to know whether the app is worth securing at all, read do vibe coded apps make money.

Key takeaways
  • Database access control (RLS, Firebase rules, users seeing each other’s data) appears in 60% of 400+ builder security posts. It is the number one check.
  • Exposed keys and secrets appear in 43% overall and lead at 36% among posts found by a plain “security” search.
  • In the last 90 days, the secrets share rose to 48%, up from 43% across the year.
  • 9 of the 19 checks need no code: two accounts, an incognito window, the browser’s developer tools and a test-mode card.
  • We found 20+ posts where a scanner or advisor showed green while data stayed open. A green scan is not a pass.

Is my vibe coded app secure? The short answer

The short answer
Probably not until you have tested it. Before launch, run these five checks in order: (1) the two-account test, (2) open the app logged out in an incognito window, (3) search your live JavaScript for secret keys, (4) visit your own /admin and /debug URLs as a normal user, (5) run a full test-mode payment, cancel and refund. If any of them fails, hand the matching developer check below to someone who can fix it. As of September 2026, database access and exposed keys account for the large majority of real failures builders describe.

The rest of this page shows how we ranked the checks, what each one looks like in practice, what the builders who hit each failure said, and where our data is weak.

How we ranked the checks

We searched Reddit on September 25, 2026 across r/lovable, r/vibecoding, r/cursor, r/Supabase, r/replit, r/boltnewbuilders, r/ClaudeCode, r/SaaS and r/v0_, plus a sitewide search for vibe coding security terms. After de-duplicating by post we had 900+ posts. We kept a post only if it came from a builder community and its title, or at least three distinct security terms in its body, were about security. That left 400+ posts.

Each post was then tagged with every failure type it described, using keyword rules for nine classes: database access control, exposed secrets, broken authentication and authorization, abuse and rate limits, payments and webhooks, injection, dependencies, storage, and headers. A post can carry several tags, so shares add up to more than 100%. About 80% of posts matched at least one class. The full method is in the methodology section.

This is the same approach we use for our state of SaaS pain points report: count distinct complaints, not opinions about complaints. It is how complaint analysis works across the whole BigIdeasDB warehouse, and it is the same kind of pull our Reddit pipeline builder automates. For the manual version, see Reddit market research.

Which vibe coding security failures show up most?

RankFailure typePostsShare (all 400+)Share (plain “security” search)Checks
1Database access control (RLS, Firebase rules, other users’ data)230+59.8%19.0%1, 2, 5, 10, 11
2Exposed secrets and API keys170+42.8%35.9%3, 9, 12
3Broken authentication and authorization80+21.8%16.4%1, 4, 13
4Abuse, rate limits and runaway bills80+21.5%25.1%7, 15
5Payments and webhooks50+14.8%14.9%6, 14
6Dependencies and known CVEs40+12.0%7.7%17
7Injection and unsanitised input40+11.5%11.3%16
8Public storage and file uploads30+8.3%6.2%8, 18
9Headers, CORS and source maps20+7.3%7.2%19
Source: BigIdeasDB classification of 400+ Reddit security posts from AI app builder communities, 12 months to September 25, 2026. Posts can carry several tags. Counts rounded down.

The order lines up with the professional standard. The OWASP Top 10:2025 puts Broken Access Control at A01, Security Misconfiguration at A02 and Software Supply Chain Failures at A03. What our data adds is the vibe coding specific shape of it: the access control failure is almost always a database policy, and the misconfiguration is almost always a key in the browser.

The builder posting on r/lovable a month ago captured why this matters before launch, not after:

“Saw someone test the security toggle and even after turning it on, a normal logged-in user could still see other peoples orders, profiles and change store settings.” – r/lovable

Why exposed keys and database access trade first place

The ranking depends on how you look. Across all 400+ posts, database access control leads by a wide margin. Among the 190+ posts found by a plain “security” search, exposed secrets lead at 35.9% and database access drops to 19.0%.

Part of that is our search design: we searched r/Supabase for RLS terms, which inflates the database share. Part of it is real. Keys are the failure people talk about in general terms, because anyone can understand a leaked password. RLS is the failure people only discover when they go looking. Either way, both are in the top two in every cut we ran, so both are non-negotiable before launch.

“ai gets stuff working fast, but i dont really trust it to catch things like auth issues, exposed keys, db rules/rls, server-side checks, rate limiting, etc unless i explicitly ask.” – r/vibecoding

Notice the order that builder listed. It matches our top four almost exactly. For how these failures fit the broader set of problems AI-built products run into, see our analysis of web developer pain points and our complaint explorer.

What changed in the last 90 days?

We re-ran the split on the 130+ posts from the last 90 days. The top two did not move, but secrets gained ground.

Failure type12 monthsLast 90 daysDirection
Database access control59.8%57.7%Flat
Exposed secrets and keys42.8%48.2%Up
Authentication and authorization21.8%21.2%Flat
Abuse and rate limits21.5%17.5%Down
Dependencies and CVEs12.0%14.6%Up
Payments and webhooks14.8%12.4%Down
Headers, CORS, source maps7.3%10.2%Up
Source: BigIdeasDB classification of Reddit builder security posts. Last 90 days (130+ posts) vs 12 months (400+ posts), to September 25, 2026.

We counted 40+ builder security posts in the last 30 days alone. Google Trends points the same way at lower volume: worldwide interest in “supabase rls” peaked in the week of June 14, 2026 at an index of 14 and sits at 2 now, while “vibe coding” itself holds at about half its March 2026 peak. Fewer people are learning RLS from scratch. More are shipping.

Two lanes: checks you can run vs checks for a developer

The main gap in existing checklists is that they mix “open an incognito window” with “write per-operation policies with pgTAP tests” in one list. A non-coder stalls at item four. So we split them. If you built without code, as in our guide to building a SaaS without code, the first nine checks are yours. They tell you whether you have a problem. The last ten are how a developer fixes it.

#CheckWhoTargetsTime
1Two-account testAnyoneDatabase access, authorization15 min
2Logged-out incognito testAnyoneDatabase access5 min
3Search live JavaScript for keysAnyoneSecrets10 min
4Guess your own admin URLsAnyoneAuthorization5 min
5Read the security advisor, then distrust itAnyoneDatabase access10 min
6Test-mode pay, cancel, refundAnyonePayments15 min
7Hammer your own signup and AI formsAnyoneAbuse, bills5 min
8Open an upload link logged outAnyoneStorage5 min
9Check whether a key was ever committedAnyone with repo accessSecrets10 min
10Per-operation RLS, grants revoked, testedDeveloperDatabase accessHours
11Views, security definer functions, user metadataDeveloperDatabase access1-2 hours
12Secrets server-side and rotatedDeveloperSecrets1-2 hours
13Server-side authorization on every routeDeveloperAuthorizationHours
14Verified, idempotent webhooksDeveloperPayments1-3 hours
15Rate limits and spend capsDeveloperAbuse, bills1-2 hours
16Input validation, parameterized queriesDeveloperInjectionHours
17Dependencies and known CVEsDeveloperSupply chain1 hour
18Storage policies and Firebase rulesDeveloperStorage, database1 hour
19Headers, CORS, source mapsDeveloperMisconfiguration1 hour
The 19 checks, split by who can run them, with the failure type each one targets. Ranked by the failure frequency above.

A backend engineer who rescues these apps for a living put the split bluntly:

“The crazy part is that 70% of what I end up fixing is stuff the founder could have checked themselves in an afternoon before they ever needed me.” – r/nocode

Rules before you test

Everything on this page is for testing an app you own or are explicitly authorized to test. Never run these checks against someone else’s app. Four ground rules:

  • Use test accounts you created. Two throwaway email addresses are enough.
  • Use test data. Fill the app with fake records before you start, so a failed test exposes nothing real.
  • Use your payment provider’s test mode. Never test payments with a live card on a live key.
  • Write down what you see. A screenshot of a failed test is the most useful thing you can hand a developer.

If you are still deciding what to build, do the demand work first. Securing an app nobody wants is wasted effort. Our guide to validating a SaaS idea before coding and the startup idea validation checklist cover that step. So does how to validate a startup idea, and how small your MVP should be is worth reading before you add features that each need securing.

Check 1: The two-account test

Targets: database access control and authorization, the number one and number three failures. Who: anyone.

  1. Create two ordinary accounts, User A and User B.
  2. Log in as A in your normal browser. Create some records: a profile, an order, a note, a setting.
  3. Log in as B in a second browser or an incognito window.
  4. As B, try to reach A’s things: open A’s page links, change the ID in the URL to A’s, try to edit A’s settings.
  5. As B, check every list view. Does any list show A’s rows?

Pass: B sees nothing of A’s and cannot change anything of A’s. Fail: anything leaks. Do not launch. Hand checks 10, 11 and 13 to a developer. If you have no technical partner, our guide to building a startup without a technical co-founder covers where to find one.

This is the check experienced builders reach for first:

“The first security test I run on a Lovable app only needs two accounts” – r/lovable
“Ask Lovable to show every RLS policy, but verify the result with the second account.” – r/lovable

We counted 30+ posts in the sample recommending a second-account, logged-out or incognito test. It is the most repeated piece of practical advice in the whole dataset, and the reason it is check number one here.

Check 2: The logged-out incognito test

Targets: database access control. Who: anyone.

Open your live app in an incognito window without logging in. Visit every page you normally see when logged in, using the direct URLs. Watch whether data appears, even briefly, before a redirect.

“lazy way: open your live app logged out and see if your data still loads.” – r/vibecoding
“If you get rows back without logging in, so does everyone else.” – r/Supabase

Pass: every private page redirects to login with no data flash. Fail: any private data renders. A page that redirects after showing data is still a fail, because the data already reached the browser. A weekend launch is exactly when this gets skipped.

The worst version of this failure is the one a Supabase builder described after reviewing a single MVP:

“I could see every user’s email, payment status, and home address.” – r/vibecoding

Check 3: Search your live site for secret keys

Targets: exposed secrets, the number two failure. Who: anyone.

  1. Open your live site and open the browser developer tools (F12, or right-click and Inspect).
  2. Go to the Sources or Debugger tab, then use search across all files.
  3. Search for sk_live, sk-, service_role, secret, api_key and whsec_.
  4. Also check the Network tab while you use the app, and look at request headers for keys.

Expected: a Supabase anon or publishable key, a Firebase config and a Stripe publishable key (pk_) are designed to be public. Fail: any secret, service role, live payment secret or AI provider key.

“Everything I found was accessible with a normal browser and basic DevTools knowledge.” – r/vibecoding
“But a service_role key in there means anyone who opens DevTools has full database access.” – r/lovable

The environment variable file does not save you if the build step inlines the value into client code. On most frameworks, any variable with a public prefix ends up in the browser bundle. That is why check 3 looks at the live site, not the code. A good micro SaaS boilerplate separates public and server-only variables for you.

Check 4: Guess your own admin URLs

Targets: broken authorization. Who: anyone.

Logged out, then logged in as an ordinary user, visit /admin, /dashboard, /debug, /settings, /internal and any admin page you remember the AI building.

“Hiding the ‘Admin Dashboard’ button in your UI doesn’t stop someone from typing your-app.com/admin or your-app.com/dashboard.” – r/vibecoding
“The AI adds /debug or /admin while building and nobody removes it.” – r/vibecoding

Pass: admin pages refuse ordinary users and logged-out visitors, and the data behind them refuses too. Fail: the page loads, or the page is blank but its data request still returns rows. A hidden button is not a permission.

Check 5: Read the security advisor, then distrust it

Targets: database access control. Who: anyone with dashboard access.

Open your builder’s security scan and, if you use Supabase, the Security Advisor in the database section of the dashboard. Fix everything that says RLS is disabled. Then repeat check 1 anyway, because the advisor answers a narrower question than you think.

“Lovable’s Security Scan checks if RLS exists, not if it’s restrictive.” – r/lovable
“After checking a pile of Lovable/Bolt-built Supabase apps, the same three things keep coming up, and Security Advisor is green on all of them because RLS is enabled” – r/Supabase

Scanners are worth running. They catch the missing-RLS case cleanly. They cannot know whether User B should see User A’s order, because that is a business rule. See what scanners miss below.

Check 6: Pay, cancel and refund in test mode

Targets: payments and webhooks. Who: anyone.

  1. Switch your payment provider to test mode.
  2. Subscribe with a test card. Confirm paid features unlock within a minute.
  3. Cancel. Confirm access ends when it should.
  4. Refund. Confirm the account status changes.
  5. Try a card that fails. Confirm nothing unlocks.
“Checkout was working, but billing also needed webhooks, retries, duplicate-event protection, subscription states, refunds, and access control.” – r/vibecoding

Your users see this failure from the other side. In our app-store data, 110+ negative reviews describe paying and not getting access:

“I have upgraded my account and paid but still asking me to upgrade i dont understand” – App Store review

If any step misbehaves, hand check 14 to a developer. If you are still choosing a payment stack, our guide to building a SaaS with Next.js, Supabase and Stripe covers the setup, and the Stripe integration page covers how BigIdeasDB reads Stripe data. Failed and unprocessed payments are also a leading cause of why SaaS customers churn, and SaaS pricing strategies covers the plan design your webhook has to enforce.

Check 7: Hammer your own signup and AI forms

Targets: abuse, rate limits and runaway bills. Who: anyone.

Submit your own login form with a wrong password ten times fast. Submit signup ten times with different fake emails. Submit any AI-powered feature twenty times in a row. Watch whether anything slows you down, and watch your AI provider’s usage page.

“7 out of 8 had no rate limiting on login.” – r/vibecoding
“i keep seeing posts like ‘my AWS bill jumped to $40k overnight’ or ‘my API key got stolen it was literally hardcoded’ and it’s just painful to watch.” – r/vibecoding

This class ranks second (25.1%) in the plain security search because the damage is so visible: a bill. Our guide to AI agent cost control covers the spend side, and AI SaaS pricing models shows why every free AI action is a cost you carry.

Check 8: Open an uploaded file link logged out

Targets: public storage. Who: anyone.

Upload a private file as User A: an avatar, a receipt, a document. Copy its link. Paste it into an incognito window. If it loads, your storage is public, whatever your table policies say.

“However, I managed to create a public storage bucket for the receipt images. Of course a bot found it.” – r/Supabase

Storage is only 8.3% of posts, but it is the one failure where a builder who did everything else right still gets caught, because table RLS and storage policies are separate systems.

Check 9: Was a key ever committed?

Targets: exposed secrets. Who: anyone with access to the repository.

If your project lives on GitHub, turn on secret scanning in the repository’s security settings. On public repositories GitHub’s secret scanning runs for free and scans the entire git history on all branches. Any key that was ever committed counts, even if you deleted it the next minute.

“If you accidentally commit .env even once, your database credentials live in git history forever and can be found publicly on GitHub.” – r/lovable
“Rotate every secret you have ever pasted into an AI tool.” – r/VibeCodersNest

Fail: any live secret in history. Rotate it with the provider first. GitHub notes that removing secrets from history is time-intensive and often unnecessary once the credential is revoked. Rotation is the fix; scrubbing is optional.

Check 10: Per-operation RLS, grants revoked, tested

For a developer. This is the fix behind a failed check 1, 2 or 5, and the single highest-value item on the list.

  • Enable RLS on every table in an exposed schema.
  • Revoke default grants from anon and authenticated, then grant back only what each role needs.
  • Write a separate policy for select, insert, update and delete. Name the role with to authenticated.
  • Use with check on insert and update so a user cannot create or reassign a row to someone else.
  • Write a policy test per table that asserts both allow and deny, for both roles.

The Supabase Row Level Security documentation is explicit that a table in an exposed schema without RLS is readable and writable by any role with a grant, and that adding policies does not take the default grants back. It also says that until the test suite passes, you do not know whether the policies do what you intended.

The failure builders hit here is not missing RLS. It is RLS that does nothing:

“I had tables where policies were enabled but the conditions were too permissive, anyone with the anon key could read other users’ data.” – r/lovable
“Your RLS SELECT policy is hiding the fact that your UPDATE policy is wide open” – r/Supabase
“The ‘profiles’ table had RLS enabled (good!), but the UPDATE policy was too broad.” – r/lovable

That last pattern is worth a specific test: can a user update their own plan, role or credits column? If a user can write to the row that decides whether they have paid, the paywall is decorative.

Check 11: Views, security definer functions and user metadata

For a developer. Three Supabase-specific traps that survive a correct-looking policy set, all documented by Supabase:

  • Views bypass RLS by default, because they run as the user who created them. On Postgres 15 and above, create views with security_invoker = true, or keep them out of exposed schemas.
  • Security definer functions run with their creator’s privileges. Never put one in an exposed schema, and pin search_path.
  • User metadata is user-editable. An authorization rule that reads raw_user_meta_data can be rewritten by the user it is meant to restrict. Store roles in app metadata instead.

Also check how policies behave when auth.uid() is null for a logged-out request. Supabase recommends an explicit auth.uid() IS NOT NULL check so intent is clear.

Check 12: Secrets server-side and rotated

For a developer. The fix behind a failed check 3 or 9.

  • Move every secret key into server-side environment variables, edge functions or your platform’s secrets store.
  • Route calls to AI providers, payment APIs and email providers through your own server endpoint.
  • Never give a variable holding a secret a public prefix that ships it to the browser.
  • Rotate any key that was ever client-side or committed, then redeploy.

Supabase’s documentation says to never use a secret key in the browser or expose it to customers. The trap is how the key gets there. Builders describe the same sequence again and again:

“You hit an RLS/permission error, ask AI to ‘fix it,’ it suggests the service role key in the client.” – r/lovable

When a permission error appears, the right fix is almost always a policy, not a more powerful key. Our guide to building with Cursor and Claude covers prompting for that. For a stack that keeps keys server-side by default, compare the options in our roundup of Next.js SaaS boilerplates and our guide to a starter kit with auth, payments and a database.

Check 13: Server-side authorization on every route

For a developer. The fix behind a failed check 1 or 4 when the app has its own API routes or edge functions.

  • Every protected route and edge function checks who the user is and whether they may do this specific thing, on the server.
  • Never accept a user ID from the request body when you can read it from the verified session token.
  • Admin routes check an admin role stored where users cannot edit it.
  • Background jobs and cron endpoints require a secret or service check, so they are not public-callable.
“Supabase authentication and Supabase authorization are two different things.” – r/vibecoding
“Authentication was working, but then I had to think about authorization and whether every user could access only their own data.” – r/vibecoding

OWASP lists Authentication Failures at A07:2025 and Broken Access Control at A01:2025. In AI builds the second is far more common, because login is usually handled by a provider and works, while the per-record check is left to generated code. Our guide to building a SaaS covers where authorization belongs in the architecture.

Check 14: Verified, idempotent webhooks

For a developer. The fix behind a failed check 6.

  • Verify every incoming payment event before acting on it. Stripe’s webhook signature documentation uses the Stripe-Signature header, the raw request body and your endpoint secret.
  • Use the unparsed body. Stripe notes that frameworks which parse or reformat the body cause verification to fail.
  • Make handlers idempotent: store processed event IDs so a retried event does not grant access twice.
  • Grant access from the verified event, never from a redirect to a success page.
“The webhook endpoint that updates user subscriptions probably isnt verifying the Stripe signature.” – r/lovable

Real payment flows are not rare in this cohort. In our Stripe Index of 30,000+ companies listed in Stripe’s public directory, 430+ run their product on a builder or hosting subdomain such as lovable.app, replit.app, bolt.host, vercel.app or netlify.app. Those are live merchants taking money through generated code. Our Stripe Index database guide explains how the directory is built, and the Stripe Index MCP tools let you query it from your agent.

Check 15: Rate limits and spend caps

For a developer. The fix behind a failed check 7.

  • Rate limit login, signup, password reset and every endpoint that calls a paid API.
  • Add a CAPTCHA or email verification on signup if you see bursts of fake accounts.
  • Set a hard monthly spend limit with every AI and API provider you use.
  • Set a per-user daily cap on expensive actions, even for paying users.

Your users notice abuse before you do. In our app-store data, 110+ negative reviews complain about fake accounts, spam and bots:

“Too many fake profiles and bot-generated fake messages.” – App Store review

Check 16: Input validation and parameterized queries

For a developer. Injection appears in 11.5% of posts. Lower than the top five, but still one in nine.

  • Validate every input on the server, with a schema, not only in the form.
  • Use parameterized queries or the database client’s query builder. Never build SQL by string concatenation.
  • Escape user content when rendering it, and be careful with any “render HTML” feature.
  • If the app sends user text to an AI model that can call tools, treat that text as untrusted.

OWASP places Injection at A05:2025. The AI-specific risk is that generated code often trusts the frontend for validation because the frontend is where the prompt described the rule.

Check 17: Dependencies and known CVEs

For a developer. Dependencies rose from 12.0% of posts over the year to 14.6% in the last 90 days.

  • Run your package manager’s audit command and fix critical and high findings.
  • Confirm every package the AI added actually exists, is the one you meant, and is maintained.
  • Turn on automated dependency alerts in your code host.
  • Keep your framework on a supported, patched version.

OWASP moved Software Supply Chain Failures to A03:2025. Coding models can suggest packages that do not exist or are misnamed, which is why “verify the package is real” belongs on a pre-launch list. It is also one of the first things a buyer checks, as our SaaS acquisition due diligence checklist shows.

Check 18: Storage policies and Firebase rules

For a developer. The fix behind a failed check 8, and the Firebase equivalent of check 10.

  • Make storage buckets private unless files are truly public, and add per-user storage policies.
  • Serve private files through short-lived signed URLs.
  • On Firebase, replace test-mode rules before launch and never ship rules that only check that a user is signed in.

Firebase’s guide to insecure rules warns that open rules let anyone who guesses your project ID steal, modify or delete data, and that rules checking only for a logged-in user give any logged-in user access to everything.

“Firebase rules left on allow read, write: if true, including the console’s 30 day test mode” – r/Supabase

Check 19: Headers, CORS and source maps

For a developer. The smallest class at 7.3%, but it rose to 10.2% in the last 90 days.

  • Set standard security headers: a content security policy, HSTS, and frame protection.
  • Restrict CORS to your own domains. CORS controls browsers, it is not authentication.
  • Do not publish production source maps unless you mean to, since they hand out your readable source.
  • Return generic error messages in production, never stack traces.

Why “the AI says it is fixed” is not a test

The most common emotional note in the dataset is not fear of hackers. It is not knowing whether to believe the tool.

“AI says its fixed, tests pass, and then im still wondering if users can see each others data, some api route is open, or a secret got shipped in the frontend.” – r/cursor
“I’m pretty close to launching a small SaaS with Lovable and ngl the security part is making me nervous.” – r/lovable

A coding model verifies that the feature works. Security is about whether a forbidden action fails. Those are different tests, and a fix that makes an error disappear can do it by opening the door wider. One experienced auditor described why the output is hard to eyeball:

“AI writes insecure code that looks like it was written by a senior engineer.” – r/vibecoding

The practical rule: after any security fix, re-run the specific non-coder check that failed. Our help guide on how to verify AI agent work covers the general habit, and Claude Code for founders covers working with an agent that writes most of your code. Even careful builders feel the limit:

“I review everything that’s being generated, but I don’t have 10+ years of production software experience to instinctively spot subtle security flaws, edge cases, or architectural weaknesses.” – r/cursor

What scanners and security toggles miss

We found 20+ posts describing a scanner, advisor or built-in toggle showing green while data stayed reachable. Scanners are also the most common thing builders post about: 30+ posts in the sample are someone launching their own scanner or audit tool.

“It’s honest but shallow, and a clean surface scan is not a clean bill of health.” – r/lovable
“My RLS checker printed OK on a table that hands every row to every authenticated user” – r/Supabase

What an automated scan can and cannot tell you:

ToolGood atCannot tell you
Builder security scanWhether RLS is enabled, obvious exposed keysWhether a policy actually blocks another user
Supabase Security AdvisorRLS disabled, risky functions and viewsBusiness rules (who should see which row)
External surface scannerKeys in bundles, headers, public filesAnything behind login
Secret scanning on your repoKnown key formats in git historyKeys that never touched the repo
Dependency auditKnown vulnerable packagesWhether your own code is safe
Your two-account testWhether the forbidden action failsRoutes you forgot to try
What automated checks can establish, based on builder reports and vendor documentation. September 2026.

Run the automated tools. Then run the manual checks. Only the manual ones ask the question that matters: can a stranger do what they should not?

What CVE-2025-48757 teaches

The US National Vulnerability Database entry for CVE-2025-48757, published May 30, 2025, describes insufficient database Row Level Security policies in Lovable-generated sites through April 15, 2025, allowing remote unauthenticated reading or writing of database tables. It carries a CVSS 3.1 base score of 9.3 (critical) and is classed under CWE-863, incorrect authorization.

The entry is tagged as disputed. The supplier’s position, recorded in the NVD text, is that each customer of the platform is responsible for protecting their own application’s data. We are not taking a side. For a builder about to launch, both readings end in the same place: nobody else is going to verify your database policies for you.

That is why check 10 includes policy tests and why check 1 exists at all. A platform can change defaults. It cannot know your business rules.

What your users see when security fails

Builders describe causes. Users describe symptoms. We searched 99,000+ negative reviews (three stars or fewer) in our app-store database of 136,000+ reviews for the symptoms these failures produce.

What users reportNegative reviewsLikely causeCheck
Verification code or password reset never arrives230+Auth email flow, deliverability6, 13
Unauthorized or duplicate charges170+Payment logic, retries6, 14
Fake accounts, spam and bots110+No rate limits or signup checks7, 15
Account hacked or compromised110+Weak auth, no rate limits7, 13, 15
Paid but access not unlocked110+Webhook not processed6, 14
App sells or shares my data50+Privacy practicesn/a
Data breach or leak40+Access control, storage1, 8, 10
Source: BigIdeasDB app-store reviews, 99,000+ reviews rated 3 stars or lower, regular-expression match on review text. Queried September 25, 2026. Counts rounded down.

Seeing someone else’s data is rare in reviews, only a handful of cases, but it is unambiguous when it happens:

“I tried to play the game but it keeps syncing me to someone else’s profile... the company refused to fix the issue.” – App Store review
“Users’ daily goal checkins are public by default, and they CANNOT retroactively change that data to private.” – App Store review
“First I never received the verification code in my email, I tried three times.” – App Store review

For the wider picture of what mobile users complain about, see our state of mobile app pain points report and the guide to analyzing app store reviews. Our roundup of app store review analysis tools compares ways to do it.

What B2B buyers expect before they trust you

If you sell to businesses, security is also a sales question. In 273,000+ Capterra reviews in our Capterra dataset, the cons field mentions security 1,300+ times, user permissions and roles 550+ times, and two-factor authentication, MFA or single sign-on 340+ times. Audit logs come up 70+ times.

“The lack of 2FA is a concern.” – Capterra review
“Role-based access control could be more granular.” – Capterra review
“The user roles and permissions felt too restrictive, and that adding new agent groups necessitated using multiple separate admin panels.” – Capterra review

Across 9,400+ G2 insights, 490+ raise security or permissions and 190+ raise permission levels or roles specifically. The pattern is consistent: business buyers want roles, 2FA and a record of who did what. Those are features, and they sit on top of the access control work in checks 10 and 13. Our guides to Capterra analysis and G2 analysis show how to pull these for your own category, and competitor analysis for SaaS shows how to turn them into a feature list.

The gap between building apps and securing them

Money has flowed to making apps faster than to making them safe. In our database of 17,000+ funded companies, 170+ describe AI coding, app building or no-code products. 40+ describe application security, code security or vulnerability testing. Only one explicitly targets securing AI-generated code.

The revenue side is small but real. Of 8,600+ revenue-verified startups in TrustMRR, 130+ run on a builder or hosting subdomain, and roughly one in nine of those earned revenue in the last 30 days. Our guide to making money vibe coding breaks down why subdomain-hosted apps earn less, and do vibe coded apps make money has the full revenue picture. Security is part of it: buyers notice.

Builders see the gap too. The same r/SaaS thread that argued security is not the biggest problem conceded the point:

“The leaked keys and open endpoints are real but security is a known category of problem.” – r/SaaS

Known category means checkable. That is the good news, and the reason a list like this one works. If you are hunting for product ideas in this gap, our vibe coding project ideas and funded startups database guide are the places to start. Our analysis of what no-code SaaS actually sells for shows how buyers price these apps, and no-code SaaS ideas lists where the demand is.

The printable pre-launch security checklist

Copy this into your launch doc. Every box must be ticked or explicitly marked not applicable with a reason.

You can run these (about an hour):

  • ☐ Two-account test: User B cannot see or change anything of User A’s, including by editing IDs in URLs.
  • ☐ Logged-out incognito test: no private page or data loads, not even briefly.
  • ☐ Live JavaScript search: no sk_live, sk-, service_role, whsec_ or other secret.
  • ☐ /admin, /dashboard, /debug refuse logged-out and ordinary users.
  • ☐ Security advisor and builder scan are clean, and check 1 still passes afterwards.
  • ☐ Test-mode subscribe, cancel, refund and failed card all behave correctly.
  • ☐ Rapid login, signup and AI submissions get slowed or blocked; provider spend limits are set.
  • ☐ A private uploaded file does not open in an incognito window.
  • ☐ Secret scanning is on and no live key exists in git history.

A developer confirms these:

  • ☐ RLS on every exposed table, default grants revoked, one policy per operation, policy tests pass.
  • ☐ Views use security invoker; no security definer functions in exposed schemas; no authorization from user metadata.
  • ☐ All secrets server-side; any previously exposed key rotated.
  • ☐ Server-side authorization on every protected route, edge function and job.
  • ☐ Webhooks verified with signatures, raw body, idempotent.
  • ☐ Rate limits on auth and paid endpoints; per-user caps on expensive actions.
  • ☐ Server-side input validation; parameterized queries.
  • ☐ Dependency audit clean of critical and high; every package verified real.
  • ☐ Storage private with per-user policies; Firebase rules out of test mode.
  • ☐ Security headers set, CORS restricted, no production source maps, generic errors.

Launch week: what to watch

Passing the checklist is the floor, not the finish. Once you have users, work through our vibe coded app production checklist for backups, environments and monitoring. For the first week after launch:

  • Check your AI and API providers’ usage pages daily for spikes you did not cause.
  • Watch signups for bursts of similar emails or names.
  • Check your database logs for requests that did not come from your app.
  • Re-run the two-account test after every deploy that touches data, roles or payments.
  • Keep a list of every third-party service holding a key, so rotation is fast if you need it.

If you are timing the launch itself, our guides to where to launch your startup and how to get your first 100 SaaS users cover what comes next, along with finding your first SaaS customers. Launch traffic is exactly when a missing rate limit gets found.

When to hire a developer instead

Hire help before launch, not after, if any of these are true:

  • Check 1 or check 2 failed and you do not understand why.
  • You handle payments beyond a hosted checkout page.
  • You store health, financial, children’s or other sensitive data.
  • You sell to businesses that will ask about roles, 2FA or audit logs.
  • You have more than a handful of tables, routes or edge functions.

Hand the developer this page, your failed-check screenshots and access to a staging copy. Our guide to hiring a developer to fix a vibe coded project covers scoping and cost, and our roundup of vibe code rescue services covers who does it. For larger rebuilds, see our list of MVP development agencies. If you are weighing whether to start over, read buying vs building a SaaS.

If you find a leak: the first hour

  1. Rotate the credential with the provider. Do this first, before any code change.
  2. Close the door. Enable RLS, make the bucket private, or take the route offline.
  3. Check the logs and provider usage for activity you did not cause.
  4. Fix properly with the matching developer check, then re-run the failed manual check.
  5. Decide on disclosure. If real user data was exposed, you may have legal obligations to tell users, depending on where they are.
“Rotate the key in the Supabase dashboard before anything else, then audit your query logs for requests that shouldn’t have come from your application.” – r/Supabase
“deleting the code doesn’t help, the old bundle was already scraped.” – r/vibecoding

Methodology

Reddit sample. On September 25, 2026 we ran keyword searches (security, RLS, row level security, API key, leaked, exposed, auth, webhook, service role, penetration test and similar) in r/lovable, r/vibecoding, r/cursor, r/Supabase, r/replit, r/boltnewbuilders, r/ClaudeCode, r/SaaS and r/v0_, plus one sitewide search for vibe coding security phrases, mostly over a 12-month window. We de-duplicated by post, giving 900+ posts.

Relevance filter. We kept posts from builder communities whose title contained a security term, or whose body contained at least three distinct security terms. That gave 400+ posts: r/vibecoding (90+), r/Supabase (70+), r/lovable (60+), r/SaaS (40+), r/cursor (40+), r/ClaudeCode (30+), r/replit (20+) and r/boltnewbuilders (10+), with a few from smaller builder subreddits.

Classification. Each post was tagged by keyword rules into nine non-exclusive classes. Shares are the share of posts carrying each tag. The “plain security search” frame repeats the count for the 190+ posts retrieved by generic security phrases only, to reduce the bias from searching directly for RLS. We spot-checked random samples from each of the top three classes by hand.

Warehouse sources. App-store, Capterra, G2, funded-company, Stripe directory and revenue figures come from read-only SQL against BigIdeasDB on September 25, 2026, using regular-expression matches on review text or company descriptions. Counts are rounded down with a plus sign; percentages are exact. Quotes are verbatim and attributed to platform or subreddit only. We did not scan, test or name any third-party app.

Data sources and what each one cannot tell you

SourceWhat it contributedLimitation
Reddit builder posts (400+ classified)Failure-type frequency, quotes, 90-day trendKeyword-retrieved sample, not a census. RLS-specific searches inflate the database share. Posts by scanner vendors and auditors are over-represented.
App-store reviews (99,000+ negative)User-visible symptoms of security failuresConsumer mobile apps, not specifically AI-built. Regex matching misses paraphrase and catches some unrelated uses.
Capterra reviews (273,000+)B2B buyer expectations: permissions, 2FA, audit logsEstablished software, not vibe coded apps. Coverage decays alphabetically by category.
G2 insights (9,400+)Security and permission complaintsAI-summarised insights, not raw reviews. Undated.
Funded companies (17,000+)Builders vs security company countsKeyword match on descriptions. Funding amounts not used.
Stripe Index (30,000+)Merchants on builder or hosting subdomainsSubdomain hosting is a proxy for AI-built, not proof. Custom domains are invisible to this cut.
TrustMRR (8,600+ startups)Revenue share of subdomain-hosted startupsSmall subgroup. Skews to indie products.
Google TrendsDirection of interest in RLS and vibe codingRelative index only, never a search volume. Low-volume terms are noisy.
NVD, OWASP, Supabase, Stripe, Firebase, GitHubStandards, CVE facts, vendor guidanceVendor documentation changes. Checked September 25, 2026.
Every source used on this page, with its specific limitation. Snapshot September 25, 2026.

Coverage honesty

The ranking measures how often builders talk about each failure, not how often each failure exists in deployed apps. A failure that is easy to notice, like a surprise bill, will be over-reported relative to one that stays silent, like an open UPDATE policy nobody has tried. That bias probably understates database access problems, which is one more reason to keep them at number one.

The sample leans toward Supabase-backed builders because r/Supabase and r/lovable are large and because we searched them for RLS terms. Builders on other backends face the same failure shapes under different names, which is why Firebase rules sit in the same class.

We looked for demand signal in Upwork job posts and found 20+ jobs mentioning AI builders and none mentioning securing them, too few to publish (our guide to validating SaaS demand with Upwork jobs explains that dataset). Hacker News returned nothing relevant in its best-stories feed on the day. We logged both gaps rather than stretch them.

Find out what users will complain about before they do

BigIdeasDB holds 1M+ real complaints from Reddit, app stores, G2, Capterra and Upwork, plus revenue data on 8,600+ startups and 30,000+ Stripe merchants. Check what breaks for users in your category before you ship.

See BigIdeasDB plans →

Where BigIdeasDB fits

BigIdeasDB does not scan your app. It tells you what users in your market already complain about, which is where most security and reliability expectations come from. For researching what to build and what buyers will demand of it, here is how the options compare:

RankToolBest forEvidence
1BigIdeasDBReal complaints, revenue and buyer expectations by category1M+ complaints, 8,600+ revenue-verified startups, 30,000+ Stripe merchants
2ClaudeReviewing your own code and policies with youYour code, not market data
3ChatGPTExplaining a security concept in plain languageGeneral knowledge
4Raw RedditReading individual builder threadsUnstructured, one thread at a time
5Google TrendsDirection of interest in a topicRelative index only
Tools for pre-launch market and expectation research, ranked by how much real complaint evidence each gives you. September 2026.

Start with the pain points database, run a concept through the idea evaluator, or connect the data to your coding agent with the BigIdeasDB MCP server. The idea validation guide and pain points database guide show the workflow. The idea evaluator guide and MCP setup guide cover the rest. If you are building from a template, the Micro SaaS Boilerplate ships with auth, payments and a database wired together.

Frequently asked questions

How do I check if my vibe coded app is secure before launch?

Run the two-account test first: sign up as two different users in two browsers and try to see or change the other user's data. Then open your app logged out in an incognito window, search your live site's JavaScript for secret keys, guess your own admin URLs, and run a test payment, cancel and refund. Those five checks need no coding and cover the failures that show up most often in real builder posts.

What is the most common security problem in vibe coded apps?

Broken database access control. In 400+ security posts from builder subreddits over the last 12 months (as of September 2026), 60% described Row Level Security, Firebase rules or users seeing each other's data. Exposed API keys and secrets came second at 43%, and first (36%) among posts found by a plain 'security' search.

Is my Lovable or Bolt app safe if RLS is enabled?

Not necessarily. RLS being enabled only means policies are checked. A policy written as 'using (true)', an UPDATE policy that is wider than the SELECT policy, or a view that bypasses RLS can leave data open with RLS switched on. Supabase's own documentation notes that adding policies does not remove the default grants. Test with two accounts, do not trust the toggle.

What is the two-account test?

Create two ordinary user accounts, A and B. Log in as A in one browser and B in another (or an incognito window). As B, try to open A's pages, records, orders or settings, including by changing IDs in the URL. If B can see or edit anything that belongs to A, your authorization is broken and you should not launch.

How can a non-coder find exposed API keys in their app?

Open your live site, open the browser developer tools, go to the Sources or Debugger tab and search the loaded JavaScript for strings like sk_live, sk-, service_role, secret and api_key. A publishable or anon key is expected in the browser. A secret, service role or live payment key is not. If you find one, rotate it with the provider first, then move it server-side.

Is the Supabase anon key safe to expose?

The anon or publishable key is designed to be public, but it is only safe when every exposed table has RLS enabled, correct policies and trimmed grants. The service role or secret key bypasses RLS entirely and must never reach the browser. Supabase's documentation says to never use a secret key in the browser or expose it to customers.

Can I trust the built-in security scan in my AI app builder?

Use it, but do not treat a green result as a pass. Builders on Reddit repeatedly report that platform scanners check whether RLS exists, not whether it actually blocks another user. We counted 20+ posts describing a scanner or advisor showing green while data stayed open. A clean scan plus a failed two-account test means you are not ready.

What does CVE-2025-48757 mean for my app?

CVE-2025-48757, published in the US National Vulnerability Database on May 30, 2025, describes insufficient Row Level Security policies in Lovable-generated sites through April 15, 2025, rated 9.3 critical under CVSS 3.1. The supplier disputes it, saying each customer is responsible for their app's data. Either way, the lesson is that database policies are your job to verify before launch.

Do I need a penetration test before launching a vibe coded app?

Not for every app. If you store only emails and a free-tier product, the 19 checks here plus a developer review of the database policies are a reasonable bar. If you handle payments beyond a hosted checkout, health, financial or children's data, or B2B customer records, pay for a developer review or a scoped test before launch.

How do I secure Stripe webhooks in an AI-built app?

Verify every webhook with the Stripe-Signature header and your endpoint secret before acting on it, use the raw request body, and make the handler idempotent so a repeated event does not grant access twice. Then run a real test-mode flow: subscribe, confirm access unlocks, cancel, confirm access ends, refund, confirm the status changes.

What should I do if my API key was leaked?

Rotate or revoke the key with the provider immediately. Deleting it from your code does not help, because old bundles and git history keep it. Then check the provider's usage and billing for activity you did not cause, move the key to a server-side environment variable, and redeploy. GitHub's documentation notes that rotating the credential matters more than scrubbing git history.

Why does the AI say my security bug is fixed when it is not?

Because a coding model checks that the feature still works, not that a forbidden action is blocked. A fix that makes the permission error disappear can do it by widening a policy or moving a secret key into the client. Only a test of the forbidden action, such as the two-account test, proves the fix.

Do I need rate limiting on a small app?

Yes, on three endpoints at minimum: login, signup and anything that calls a paid AI model or API. Abuse, spam and runaway bills appear in 22% of the security posts we classified and 25% of those found by a plain security search. One scripted client can burn an AI budget overnight.

Are Firebase apps safer than Supabase apps?

No. The failure is the same shape. Firebase's own documentation warns against rules that allow open access or that only check 'auth != null', which lets any logged-in user read and write everything. Test mode rules left in place are the Firebase equivalent of a missing RLS policy.

Which security checks need a developer?

Writing and testing per-operation RLS policies, auditing views and security definer functions, moving secrets server-side, adding server-side authorization to every route and edge function, verifying webhook signatures, adding rate limits, validating input, updating vulnerable dependencies and setting storage rules and headers. The non-coder checks tell you whether these are needed.

How long does a pre-launch security check take?

The nine non-coder checks take about an hour on a small app. The developer checks take anywhere from an afternoon to a few days, depending on how many tables, routes and integrations the app has. Budget for the second part before you announce a launch date.

Where does this data come from?

From 900+ Reddit posts pulled on September 25, 2026 across builder subreddits and classified into nine failure types, plus BigIdeasDB's warehouse: 99,000+ negative app-store reviews, 273,000+ Capterra reviews, 9,400+ G2 insights, 17,000+ funded companies, 30,000+ Stripe directory companies and 8,600+ revenue-verified startups, within a corpus of 1M+ records.

Cite this page
Last verified: September 25, 2026
BigIdeasDB Research. (2026). Vibe Coded App Security Checklist: 19 Pre-Launch Checks, Ranked by Real Failures. BigIdeasDB. Retrieved from https://bigideasdb.com/vibe-coded-app-security-checklist
Founder, BigIdeasDB
Share →
Keep reading