You can ship a vibe-coded app, but only after it clears a quality bar the prompt never mentioned. Lock every table with Row Level Security, keep secret keys on the server, design the failure states, move schema changes into migration files, turn on backups and set up alerts. Supabase, Vercel, Next.js and Stripe publish that bar as production checklists, and one focused week covers it.
Vibe coding production apps works when the app clears a quality bar the prompt never mentioned: every table locked by Row Level Security, every failure showing the user something useful, every schema change in a migration file, and an alert that reaches you before a customer does. That bar is public. Supabase, Vercel, Next.js and Stripe each publish a production checklist, and this guide folds them into one pass you can run in about a week.
Built from the vendors' documentation, checked October 2026, not from a case study of our own app: Supabase's production checklist, API keys, Row Level Security, advisors, migrations and backups pages; Vercel's production checklist; the Next.js production guide; Stripe's go-live checklist; Lovable's security docs; and Veracode's Spring 2026 GenAI code security update.
The examples use Supabase, Next.js, Vercel and Stripe because it is a common stack for AI-built apps and the one our own guides use. The same seven questions apply to any stack. If vibe coding itself is new to you, start with our vibe coding guide; if you build with an agent in the terminal, the Claude Code complete guide explains the tools this page leans on.
Can you ship vibe coded apps?
Yes, on one condition: you verify what you did not write. The risk is not that AI-written code fails to run. It runs, which is why the demo looks finished. The risk is what it leaves out when nobody asked for it.
- 80 coding tasks across Java, JavaScript, C# and Python
- Cross-site scripting tasks passed only 15% of the time
- Pass rates stayed flat across model generations
Source: Veracode, Spring 2026 GenAI Code Security Update, 24 March 2026
Read that number for what it is. Veracode tested isolated coding tasks built around four flaw types (SQL injection, cross-site scripting, log injection and weak encryption choices), not whole apps, and Veracode sells security tooling. The useful part is the trend: it reports security pass rates "essentially flat" regardless of model generation or release date. A newer model does not excuse the checks.
- The idea can be built
- The main flow works for one user on one device
- The interface is good enough to show people
- You can describe the product clearly
- Strangers cannot read or edit each other's data
- Failures show a message and lose nothing
- The database can change without losing rows
- Someone is told when it breaks
- Payments work with real cards and real webhooks
The quality bar for vibe coding production apps
Seven areas separate a prototype from something you can charge for. In each one the prototype default is reasonable for a demo and wrong for production, and in each one the vendor has already written down what "right" means.
| Area | Prototype default | Production bar | Where the bar comes from |
|---|---|---|---|
| Data access | Tables readable with the public key | Row Level Security on every exposed table, tested as two users | Supabase production checklist |
| Secrets | Keys pasted wherever the code needed them | Secret keys on the server only, rotated before launch | Supabase API keys docs, Stripe go-live checklist |
| Authentication | Sign-up works for you | Email confirmation, CAPTCHA, your own SMTP, and a permission check inside every server action | Supabase and Next.js checklists |
| Error states | Happy path only | Custom error and 404 pages, expected errors shown as messages, payment declines handled | Next.js and Stripe checklists |
| Data changes | Schema edited live by the AI | Every change is a migration file; backups on; one restore rehearsed | Supabase migrations and backups docs |
| Monitoring | You hear about it from a user | Persistent logs, an error alert, spend alerts, a known rollback | Vercel production checklist |
| Payments | Checkout works in test mode | Live webhooks registered; duplicates, delays and out-of-order events handled | Stripe go-live checklist |
- 01Demo works
One user, one device, the happy path.
- 02Data is locked
RLS on every table; secrets off the client.
- 03Failure is designed
Errors, empty states and declines show something useful.
- 04Change is safe
Migrations, backups and a rehearsed restore.
- 05You can see it
Logs, alerts and spend limits.
- 06Money is live
Production webhooks and rotated keys.
Data access and auth: who can read what?
Start here, because this is the failure with the worst outcome: one user reading another user's data. A Supabase app ships its publishable key to every browser, and that is by design. Supabase's docs say the key is safe to expose and "only reaches what Row Level Security allows". So the key is not the lock. RLS is, and the docs put it bluntly: enable RLS on every table in an exposed schema.
alter table public.reports enable row level security;That line is from Supabase's RLS guide. Once RLS is on and no policy exists, no data is accessible through the API with a publishable key, so the next step is a policy that says who may see which rows. The guide's example lets signed-in users read only their own:
create policy "Individuals can view their own todos."
on todos for select
to authenticated
using ( (select auth.uid()) = user_id );You do not have to audit this by reading code. Open Advisors in the Supabase dashboard, or run supabase db advisors, and clear the errors first:
| Security Advisor check | Level | What it flags |
|---|---|---|
| 0013_rls_disabled_in_public | ERROR | A public table has no RLS, so anyone with the project URL can access it |
| 0023_sensitive_columns_exposed | ERROR | An API-accessible table with likely sensitive columns has no RLS |
| 0015_rls_references_user_metadata | ERROR | A policy relies on user_metadata, which users can edit |
| 0010_security_definer_view | ERROR | A public view runs with elevated privileges and skips RLS |
| 0024_permissive_rls_policy | WARN | A policy uses an always-true condition, such as USING (true) |
Then run the test no scanner replaces. Create two accounts, sign in as the second, and try to read and edit the first one's rows from the app and from the browser console. If that works, nothing else on this page matters yet.
Three more items from the vendor checklists close most of the remaining auth gaps:
- Turn on the sign-up protections. Supabase's checklist lists email confirmations, CAPTCHA on sign-up, sign-in and password reset, and a one-time-code expiry of 3,600 seconds or lower.
- Connect your own SMTP server. Without it, Supabase limits endpoints that send email to 2 emails per hour (checked October 2026). Your third sign-up in an hour gets no confirmation email.
- Check permissions inside every server action. The Next.js production guide says to verify authentication and authorization inside each action and not to rely on proxy, layout or page-level checks alone.
On keys: Supabase says it is deprecating the legacy anon and service_role keys by the end of 2026 in favour of publishable and secret keys, so generated code that still uses the old names needs a pass. Stripe's checklist says to rotate API keys before going live in case they were saved somewhere outside the codebase during development. For a vibe-coded app, "somewhere" includes every chat you pasted a key into.
Error states: what does the user see when it fails?
A prototype has one state: it worked. A product needs an answer for every way it does not. The Next.js docs split errors into two kinds, and the split is a useful checklist on its own.
- Expected errors are part of normal operation: a failed validation, a declined request. The docs say to return them as values and show them to the user, not to throw.
- Uncaught exceptions are bugs. They need custom error pages (
error.tsxandapp/global-error.tsx) and a 404 page, so the user sees a way back and not a blank screen.
Stripe's checklist adds the test data: try your integration with incomplete data, invalid data and duplicate data, and pay attention to what you show users, because a declined card is a different message from a failure on your own server. Its best line is that someone else should test the integration, "especially if that other person isn't a developer". Click through these by hand before launch:
- A brand-new account with no data yet
- A slow or dropped connection in the middle of saving
- A form submitted twice in a row
- A session that expired while the tab was open
- A declined card and a cancelled checkout
- A link to a record that was deleted
Data migrations and backups: can you change the schema safely?
In a prototype the AI edits the live database and nobody minds. With real rows in it, every schema change needs to be a file you can read, replay and roll forward. Supabase's migration docs recommend never changing the schema directly on the remote database, because that bypasses the migration history.
| Command | What it does |
|---|---|
| supabase migration new <name> | Creates a new, empty migration file in supabase/migrations |
| supabase db diff -f <name> | Turns changes made in the local dashboard into a migration file |
| supabase db reset | Replays every migration and the seed data on the local database |
| supabase link | Connects the CLI to your remote project |
| supabase db push | Sends pending migrations to the remote database |
| supabase db pull | Captures the current remote schema as a migration file |
If the prototype's schema was built by clicking or prompting, supabase db pull is the starting point: it captures what exists as the first migration. From then on, the rule for your coding agent is one line in its instructions file: schema changes go in a new migration, never in the dashboard.
Backups are the other half. Checked October 2026, Supabase backs up Pro, Team and Enterprise projects daily and keeps 7, 14 and up to 30 days respectively. The backups page lists no automatic backups for the Free plan and recommends exporting with db dump; the production checklist adds that Free projects with low activity over 7 days may be paused. Two details are easy to miss: point-in-time recovery is a paid add-on that needs at least a Small compute add-on, and database backups do not include files stored through the Storage API.
A backup you have never restored is a hope, not a backup. Restore one into a scratch project once. If your backend lives inside an app builder instead, ask the same two questions of it: where is the change history, and how do I get my data out? Our Lovable vs Base44 comparison covers how two builders answer.
Monitoring: how do you find out before your users do?
You need to learn about a failure from a machine, not from a customer email. Vercel's production checklist starts its operations section with an incident response plan that includes rollback strategies, and tells you to get familiar with staging, promoting and rolling back deployments before you need to.
- Persist the logs. The checklist says to enable Log Drains to persist logs from your deployments. Stripe says the same from its side: log important data on your end too.
- Alert on errors. Send them to a channel you read. Vercel lists Observability Plus for investigating errors and traffic on Pro and Enterprise plans.
- Alert on spend. The checklist says to configure Spend Management and its usage alerts. Do the same on the database and on your AI API account.
- Limit abuse. The checklist says to consider rate limiting, and Supabase offers CAPTCHA on its auth endpoints.
Spend alerts matter more for AI products than for most, because one user in a loop can run up a model bill. Our guide to building an AI SaaS has a section on pricing around token costs.
Payments: is the money path live or still in test mode?
Test-mode checkout proves less than it seems to. Stripe's go-live checklist says objects created in a sandbox, such as products and coupons, are not usable in live mode, so they must be recreated with the same IDs. It also says to register live webhook endpoints and confirm they handle delayed notifications, duplicate notifications and events that arrive out of order.
This stretch, from locked data to live billing, is where most prototypes stall. Our AI SaaS Builder program takes it in order: Supabase database design, Row Level Security and authentication, deployment on Vercel, production hardening for the Claude API, then pricing models and Stripe integration.
Vibe coding real projects: a one-week hardening plan
The pass fits in a week if you stop adding features while you do it. That is the hard part. Every new prompt adds surface the checklist has to cover again.
- 1Day 1: Freeze features and list what exists
Stop prompting for new features. List every table, every page that needs a login, every outside service and every key.
- 2Day 2: Lock data access
Enable RLS on every exposed table, write the policies, clear the Security Advisor errors, then test with two accounts.
- 3Day 3: Close auth and secrets gaps
Email confirmation, CAPTCHA and your own SMTP. Move secret keys to the server and rotate any key that was pasted into a chat.
- 4Day 4: Build the failure paths
Error and 404 pages, empty states, validation messages and a decline path for payments. Click through each one.
- 5Day 5: Migrations and backups
Capture the current schema as a migration, turn on backups and restore one into a scratch project.
- 6Day 6: Monitoring and money
Persist logs, set error and spend alerts, register live payment webhooks and rehearse a rollback.
- 7Day 7: Launch to a small group
Invite a handful of real users, watch the logs for a day, fix what they hit, then open the doors.
- Security Advisor shows no ERROR-level findings
- Two test users cannot read or edit each other's rows
- No secret key in the frontend or the repo, and every pasted key has been rotated
- Email confirmation is on, custom SMTP is connected, and sign-up works from a fresh inbox
- Custom error and 404 pages exist, and a forced failure shows a message
- Every schema change since the prototype is a migration file
- A backup exists and has been restored once into a scratch project
- Logs persist somewhere and an error alert reaches you
- Spend alerts are set on hosting, database and AI API accounts
- Live payment webhooks are registered and one real payment has been refunded
How to make the AI do the hardening work
The tool that wrote the app can check it, as long as it checks with fresh eyes and shows evidence. Asking the same chat "is this secure?" mostly returns reassurance.
- In Claude Code, the built-in
/security-reviewcommand checks the current diff for security vulnerabilities and/code-reviewchecks it for correctness bugs. A Stop hook can keep a turn from ending while tests fail. Our spec-driven development walkthrough wires those gates together. - In Lovable, a Quick scan runs automatically every time you publish and flags tables without row-level security and vulnerable dependencies. A Deep scan, run on demand, reviews application code for access control, leaked secrets, unsafe input, payments and authentication.
- In any tool, ask for artefacts you can check: a list of every table with its policies, and a test that signs in as one user and requests another user's rows.
Scans narrow the search; they do not close it. Lovable's own docs say its security tools "do not replace a thorough security review" and that you are responsible for meeting the security requirements of your use case. Treat a clean scan as permission to run the two-account test, not as a substitute for it.
When is a vibe-coded app not ready for production?
Two questions decide it: what the app holds, and whether anyone has reviewed the code that guards it.
The bottom-right cell is where vibe coding earns its bad reputation, and it is avoidable. A few hours of review on authentication, policies and the payment webhook is a small cost next to a week of building.
Mistakes that keep a prototype a prototype
- Adding features during the hardening week. Each one reopens data access and error handling. Freeze first.
- Treating a clean scan as a pass. Scanners find known patterns. The two-account test finds your bug.
- Testing as one user. Almost every data leak needs a second account to see.
- Editing the schema in the dashboard after launch. The next migration will not know about it.
- Leaving payment objects in test mode. Recreate products and webhooks in live mode and run one real payment.
- Having no rollback. Know which button restores the previous deployment before you need it.
Vibe coding production apps: FAQ
Can you ship vibe coded apps to production?
Yes, if you verify what you did not write. A vibe-coded app is ready when every table is protected by Row Level Security, secret keys live only on the server, failures show the user a useful message, schema changes are migration files, backups exist and someone is alerted when it breaks. Supabase, Vercel, Next.js and Stripe publish production checklists that cover each of those points.
Is vibe coding safe for real projects?
It is as safe as the checks you run afterwards. In Veracode's Spring 2026 update, AI models introduced a known security flaw in 45 percent of its code generation tasks, and the rate was flat across model generations. Those were isolated tasks, not whole apps, but the lesson holds: treat generated code as unreviewed until you have tested data access, authentication and payments yourself.
What breaks first when a vibe-coded app gets real users?
The vendor checklists point to the same places. Tables without Row Level Security can be read by anyone with the project URL. Supabase limits its built-in email sending to two emails an hour until you connect your own SMTP server, so sign-up confirmations stall. Payment objects created in a Stripe sandbox do not exist in live mode. None of these show up in a one-person demo.
Do I need to know how to code to take a vibe-coded app to production?
You need to be able to verify, not to write. Several checks are dashboards and clicking: Supabase's Security Advisor lists open tables, and a two-account test shows whether one user can read another's data. For the parts that touch money and personal data, pay for a few hours of review from someone who reads code. That costs far less than a leak.
What is the minimum monitoring for a small production app?
Four things. Logs that persist beyond the hosting dashboard, which Vercel's checklist handles with Log Drains. An error alert that reaches a channel you read. Spend alerts on hosting, database and AI API accounts. And a rollback you have rehearsed once. Add performance data such as Vercel Speed Insights after those four are in place.
How do I change the database after launch?
Through migration files, never by editing the live database. With Supabase, supabase migration new creates a file in supabase/migrations, supabase db reset replays every migration locally, and supabase db push sends them to the remote project. Supabase's docs advise against making schema changes directly on the remote database because that bypasses the migration history.
Should I rebuild a vibe-coded prototype before launch?
Not by default. Keep the parts you can verify and rewrite the parts you cannot. If the app passes the data access test, has migration files and handles failures, a rebuild adds delay without adding safety. If nobody can explain how authentication or billing works in the current code, rebuild those two areas with a written spec before real users arrive.
Prototype works? Now make it a product.
AI SaaS Builder, included in All Access, takes the same path in order: Supabase database design, Row Level Security and authentication, Vercel deployment, launch, then pricing and Stripe integration, with the other three programs, live coaching and the private community in one subscription.
Get a second pair of eyes in the free Discord
Post your stack and your checklist results, and ask what other builders would check before launch.