AI-built MVPs · 2026

I deployed 12 vibe-coded apps to production.
The same 6 things broke every single time.

Lovable, Bolt, Cursor and Claude Code ship great prototypes. Production exposes the same six holes every time — leaked keys in the bundle, unbounded queries, CORS wildcards, timezone bugs, fragile file paths, and background work that never runs. Here is what to fix before launch.

Close the production gap before launch.

Worker processes, real env vars, log access and pattern-based Telegram alerts on every Belmo plan — including the always-on free tier.

No credit card required 1 service free forever Workers + cron included Encrypted env vars by default
Frequently asked

Quick answers

Why do vibe-coded apps break in production but work locally?

A coding model writes the code in front of it. It cannot see your DNS, env vars, cold-start behavior, database connection limits, timezone, or that your "production" is a laptop with ngrok. It is trained on a corpus where "it works locally" usually means "it works" — true for a single-laptop side project, wildly false for a deployed app with real users across real networks and timezones. The code isn't wrong; production exposes assumptions the model could not see.

How do I check if an AI coding tool leaked an API key into my client bundle?

Grep your built output for the key prefix before deploying: run grep -r "sk_live_" against your dist/, .next/, public/ and build/ directories. If anything matches, the secret is shipping to every browser via View Source. Move that call to a backend route — the client requests your server, and your server, holding the secret in an env var, calls the third party.

What is the most common Lovable or Bolt failure in production?

By a wide margin, the unbounded query. SELECT * FROM users WHERE org_id = ? is fine with 4 users in dev, but in production your largest customer has 80,000 rows that exhaust your connection pool and return a blank white screen. Paginate everything, enforce a default LIMIT (50 is fine) at the query layer, and add an index on the column you filter by.

Why is CORS with a wildcard origin dangerous?

When you ask a model to fix a CORS error it reliably suggests Access-Control-Allow-Origin: *. That removes the error and opens your API to every site on the public internet — a real problem the moment you have a session cookie or auth token. Whitelist your own domain, your staging domain, and localhost for dev instead. If your AI tool wrote app.use(cors()) with no options, you have a wildcard.

How should background work like emails and billing runs be handled?

Never inline inside an HTTP handler or via setTimeout — those vanish on redeploy or cold start. You need a real worker process, a real schedule (cron, not setTimeout), and retry logic with dead-letter behavior. Lightweight options: BullMQ on Redis, RQ for Python, Sidekiq for Rails, GoCron for Go, or your platform's managed worker tier. Enqueue from the handler and let the worker retry until it succeeds.