Let me start with something I actually believe: AI-assisted coding is one of the best things to happen to our industry. I use it every day. It removes the boring parts. It lets a person with an idea turn it into something real over a weekend. That's genuinely beautiful, and I'm not here to gatekeep it.
But I've also watched a quiet pattern repeat itself over the last year. Someone builds an app with AI. It works. They demo it. People clap. They ship it. And then a few weeks later, the same person is messaging me with a different tone entirely:
"It worked perfectly when I built it. Now it's slow, the bill is insane, two customers can see each other's data, and I have no idea why."
That gap — between "it works on my screen" and "it works for ten thousand people you've never met" — is what this post is about. Not to scare anyone off. To teach the part the demo never shows you.
The Demo Lies. Not on Purpose.
Here's the uncomfortable truth about software: the easy 80% is what you see, and the hard 20% is what actually keeps you up at night.
When you "vibe code" — you describe what you want, the AI writes it, you run it, it works — you are operating entirely inside that easy 80%. The AI is brilliant at producing code that runs. It is far less reliable at producing code that survives contact with reality: real users, real load, real money, real attackers, real regulators.
And here's the trap. Because the thing works, you assume it's done. But "it runs on my laptop for one user" and "it's a product" are separated by a long list of questions you didn't know to ask.
First, Let's Be Honest About What "Vibe Coding" Is
The term gets thrown around loosely, so let me define it the way I see it on the ground.
Vibe coding is building software by describing intent to an AI and accepting the output based on whether it appears to work — rather than because you understand why it works. You're steering by vibes, not by comprehension.
There's nothing wrong with this as a starting point. Prototyping by vibes is fantastic. The problem begins when the prototype quietly becomes the production system — and nobody stopped to fill in the understanding that was skipped along the way.
Vibe coding is a great way to start. It is a dangerous way to finish.
The skill that's disappearing isn't "writing code." The AI has that covered. The skill that's disappearing is knowing what you don't know — the instinct to ask "okay, but what happens when…?" Let me show you the questions that instinct asks.
The Iceberg of "Done"
Picture an iceberg. The part above the water — the part everyone celebrates — is "it works." Below the waterline, where the ship actually sinks, is everything nobody demoed.
None of these six things tend to show up when you're building for yourself. All six show up the moment a real, second human starts using your product. Let's teach each one — properly, the way I'd explain it to an engineer sitting next to me.
The Six Blind Spots — A Quick Course
1. Scale — "It's fast" is a lie until you prove it
Your app feels instant because you are the only user, you have twelve rows in the database, and there's no network between you and the server. Real scale changes the physics. That database query with no index is invisible at 12 rows and catastrophic at 12 million. The AI happily wrote SELECT * FROM orders and it worked — because it had no reason to think about the millionth row.
2. Multi-Tenancy — the bug that becomes a headline
This one terrifies me the most, because it's invisible and it's a breach. When you build for yourself, there's only one tenant: you. So the code never needs to ask "whose data is this?" Then a second customer signs up, and unless every single query is scoped to the right user, customer A can see customer B's data. AI-generated CRUD code very often forgets the WHERE tenant_id = ? clause, because in the demo there was only ever one tenant.
"Why can I see another company's invoices?" is not a bug report. It's a regulatory incident.
3. Governance — who is allowed to do what?
In a demo, you're an admin, a user, and a god, all at once. In a real product, a junior support agent should not be able to delete the entire customer table. Governance is the set of rules that decides who can do which action on which data — roles, permissions, approvals. Vibe-coded apps almost always start with one role: "logged in." That's not access control. That's an open door with a sign that says "please be nice."
4. Audit — if you can't answer "who did that?", you have a problem
The day something goes wrong — a record vanishes, money moves, data leaks — the first question is "who did this and when?" If your app has no audit trail, you cannot answer. For a hobby project, fine. For anything touching money, health, identity, or other people's data, the absence of an audit log isn't a missing feature — it's a liability. And it's nearly impossible to add convincingly after the incident.
5. Cost — success can bankrupt you
Here's a cruel irony: with serverless functions, managed databases, and pay-per-call AI APIs, your app getting popular can be the thing that breaks you. That LLM call you make on every page load costs fractions of a cent — times a million users, times every refresh. The demo cost you nothing because you were the only traffic. Nobody vibe-codes a cost model. But cloud bills are very good at teaching it to you, retroactively, in red.
6. Security — the part attackers love that you skipped
The AI will gladly write code that takes user input and drops it straight into a SQL query, a shell command, or an HTML page. It works! It also happens to be a textbook SQL injection or XSS vulnerability. Hardcoded API keys, missing input validation, secrets committed to the repo, no rate limiting — these never break the demo. They're not bugs in the "it doesn't work" sense. They're bugs in the "someone you've never met now owns your database" sense.
The Vocabulary Nobody Taught You — Scaling & Tenancy, Explained
Two of those blind spots — scale and tenancy — come with a pile of words that get thrown around in architecture discussions like everyone was born knowing them. Scale up, scale out, multi-instance, multi-tenant… Nobody actually sits you down and explains the difference, so let me do that here. Once these click, you'll start hearing the right alarm bells before you ship.
Think of it in two families. Scaling is about handling more load. Tenancy is about how you separate different customers. They're related, but they answer completely different questions.
Now the full vocabulary, each with the same three questions answered: what it is, why you'd do it, and when / for which apps it makes sense.
Scaling Up (Vertical)
Give the same server more muscle — more CPU, RAM, or faster disk. One machine, just bigger.
Scaling Out (Horizontal)
Add more servers and spread the work across them with a load balancer. Ten small boxes instead of one giant one.
Auto-Scaling
The system adds or removes machines automatically based on live demand — scale out at the morning rush, scale back in at night.
Multi-Instance (Single-Tenant)
Each customer gets their own private copy of the whole app and database. Ten customers = ten separate, isolated deployments.
Multi-Tenancy (Shared)
One app instance serves all customers; their data lives in the same database, separated by a tenant_id on every row and query.
WHERE tenant_id=? leaks everyone's data.Stateless vs Stateful
Stateless: a server keeps no memory between requests — any node can serve anyone. Stateful: a server remembers things locally (a session, a file).
Still feels abstract? Here's the cheat sheet I wish someone had handed me — which approach fits which kind of app:
| Your app is… | Reach for | Why |
|---|---|---|
| A weekend MVP / few users | Scale up (one box) | Don't over-engineer. A single bigger server is fine — add complexity only when traffic demands it. |
| A growing SaaS product | Scale out + Multi-tenant | Cheap to run for many customers; horizontal nodes handle growth. Just scope every query by tenant. |
| Spiky traffic (sales, events) | Auto-scaling + Stateless | Demand swings wildly — let the platform add and remove nodes automatically so you pay for what you use. |
| Regulated / enterprise client | Multi-instance (single-tenant) | Compliance and contracts often require hard data isolation. Each client runs in their own walled garden. |
| A heavy database / legacy core | Scale up first | Databases are hard to split. Vertical scaling buys time before you invest in sharding or replicas. |
Two People, Same Prompt, Very Different Endings
Here's the thing — I'm not telling you to stop using AI. I'm telling you the difference between the two people using it. They type the same prompt. One understands the output; one just accepts it. Watch where the paths diverge.
Notice what the engineer's path is not: it's not slower because they avoided AI. They used the exact same AI. The difference is one extra loop — "why does this work, and what did it skip?" — that turns a demo into a product.
Demo vs Production — The Same App, Two Worlds
If you remember one table from this whole post, make it this one. It's the mental checklist I run on anything before I'd put my name on it.
✗ Demo Reality
- One user (you)
- A handful of rows
- Everyone's an admin
- No second tenant to leak to
- Errors? Just refresh
- Costs nothing — no real traffic
- Secrets hardcoded, who cares
- "It works on my machine"
✓ Production Reality
- Thousands of strangers, concurrently
- Millions of rows, growing
- Roles, permissions, least privilege
- Every query scoped to its tenant
- Errors logged, alerted, recoverable
- Cost modeled per request, capped
- Secrets in a vault, rotated
- "It works for people I'll never meet"
Look at the prompts, too. The way you ask the AI is part of the skill. Here's the difference between a vibe and an instruction:
// The vibe prompt
"Make an API that lets users save and read their notes."
// The same request, asked like an engineer
"Make an API for notes. Each note belongs to a user.
Every read and write MUST be scoped to the authenticated
user — no user can access another's notes. Validate input,
parameterize all queries, rate-limit the endpoints, and
log who created or deleted each note with a timestamp."
Same feature. The second prompt bakes tenancy, security, and audit into the request itself. The AI is just as happy to write the safe version — but only if you know to ask for it. That knowing is the whole job now.
Real-World Problems → Real-World Solutions
Let's get concrete. These aren't hypotheticals — every one of these has happened to real teams, repeatedly, in the last couple of years as AI-built apps flooded the internet. The good news: 2026 has a mature, mostly off-the-shelf solution for every single one. You don't have to invent anything. You just have to know it exists.
The AI hardcoded your API key right in the source. You pushed it to a public GitHub repo. Within minutes, automated bots scanning GitHub found it and spun up crypto miners on your cloud account. You wake up to a $40,000 bill.
Keep secrets out of code entirely — use environment variables locally and a secret manager in production (AWS Secrets Manager, Doppler, HashiCorp Vault). Add a pre-commit hook (gitleaks, git-secrets) and turn on GitHub Push Protection so a key can never leave your laptop in the first place. Never paste real keys into AI prompts either.
Your app calls an LLM on every page load. It goes mildly viral, a retry loop kicks in, and there's no spending cap. The token meter runs all night. Success became the disaster.
Set hard budget caps and billing alerts in your cloud and AI provider consoles on day one. Add per-user rate limits, cache repeated responses, pick the cheapest model that does the job, and cap max_tokens. Treat every external call as a line item you multiply by a million before shipping.
Customer A logs in and sees Customer B's invoices. The AI-generated query fetched records by ID but forgot to also filter by the logged-in tenant. It was invisible in your single-user demo. Now it's a breach notification.
Enforce isolation at the database layer, not just the app. Postgres Row-Level Security (RLS) — used by Supabase and others — makes the database itself refuse cross-tenant reads. Scope every query by tenant_id, and write an automated test that logs in as A and confirms it cannot see B.
The AI concatenated user input straight into a SQL string. Someone typed '; DROP TABLE users;-- into a search box and your data is gone. Or they pasted a script tag and now it runs in every visitor's browser.
Always use parameterized queries or a reputable ORM (Prisma, Drizzle, SQLAlchemy) — never string-build SQL. Validate and sanitise all input at the boundary with a schema library (Zod, Pydantic). Put a WAF (Cloudflare) in front to catch the obvious attacks for free.
The app was down for six hours. You had no logging, no error tracking, no uptime monitor. The first you heard of it was an angry customer post. You still don't know what broke.
Wire up observability before launch, not after the outage. Error tracking (Sentry), uptime monitoring (UptimeRobot, Better Stack), and structured logs you can search. You can't fix what you can't see.
You asked the AI for a "quick schema change," ran it straight on production, and it silently dropped a column of real customer data. There were no backups. It's unrecoverable.
Use a managed database with automated, point-in-time backups (most managed Postgres/MySQL offer this) — and actually test a restore once. Run migrations on a staging copy first. Never let an AI-suggested destructive command touch production unreviewed.
The AI wrote you a custom login system. The password reset link never expires, sessions don't invalidate on logout, and there's no brute-force protection. Auth is the one thing you can least afford to get subtly wrong.
Don't build auth yourself. Use a managed provider — Clerk, Auth0, Supabase Auth, Firebase Auth. They've already solved MFA, session handling, social login, and the dozen edge cases you'd miss. This is the highest-leverage "don't reinvent it" in the whole stack.
The Modern Vibe-Coder's Toolbox
One reason it's a genuinely great time to build is that the hard problems above mostly have a managed service that solves them for you. The skill isn't building these from scratch — it's knowing which concern maps to which tool and wiring them in. Here's my go-to reference map.
| Concern | Don't build it — use | Why |
|---|---|---|
| Auth & users | Clerk · Auth0 · Supabase Auth | MFA, sessions, social login, password resets — all the edge cases solved. |
| Database | Supabase · Neon · PlanetScale · RDS | Managed backups, scaling, and RLS so you don't run a server yourself. |
| Payments | Stripe · Paddle | PCI compliance, fraud handling, subscriptions — never touch raw card data. |
| Secrets | Doppler · AWS Secrets Manager · Vault | Keeps keys out of code and rotates them safely. |
| Errors & logs | Sentry · Better Stack · Axiom | You learn about problems before your users tweet about them. |
| Edge / WAF / CDN | Cloudflare · Fastly | Free DDoS protection, rate limiting, and caching at the edge. |
| Input validation | Zod · Pydantic · Valibot | One schema rejects malformed and malicious input at the boundary. |
| Background jobs | Inngest · Trigger.dev · queues | Move slow work off the request path so the app stays responsive. |
| Hosting / deploy | Vercel · Render · Fly.io · Railway | Push to git, get auto-scaling, staging, and rollbacks for free. |
The Build Lifecycle — From Vibe to Production
Here's the part to actually bookmark. Vibe coding isn't wrong — it's a phase. The mistake is stopping at phase one. This is the path I'd walk anyone through, and where vibing freely is fine versus where you need to slow down and understand.
Prototype Vibe freely
Go fast. Let the AI write everything. Don't worry about scale, tests, or security yet — you're validating that the thing is even useful. Speed beats polish here. Most ideas die at this stage, and that's fine; you don't harden what you're about to throw away.
Understand Slow down
The moment a real second person will use it, stop adding features. Read the code. Trace how data flows from the user to the database and back. Run the six questions — scale, tenancy, governance, audit, cost, security — against every part. You can't own what you can't explain.
Harden Be deliberate
Move secrets to a vault. Add input validation and parameterized queries. Scope every query by tenant. Swap home-rolled auth for a managed provider. Add rate limits and budget caps. This is unglamorous and it's the difference between a toy and a product.
Instrument Make it observable
Wire in error tracking, uptime monitoring, and structured logs. Turn on automated backups and test a restore. Add an audit trail for anything that changes data. You're building the instruments you'll desperately want during your first incident.
Launch small Roll out gradually
Deploy to staging first. Release to a small group, watch your metrics and costs, then widen. Use a host that gives you instant rollback. A quiet, boring launch is the best kind.
Operate Keep owning it
Review costs monthly. Patch dependencies. Watch your error rates. Have a simple plan for "what do we do when it breaks." Shipping isn't the finish line — it's the start of ownership.
Do's and Don'ts — The Quick Reference
Pin this section. When you're deep in a build and not sure if you're about to do something you'll regret, this is the gut-check.
✓ Do
✗ Don't
.env files or keys to git.How to Vibe Code Responsibly (Without Killing the Magic)
I want to be clear: the answer is not "go learn five years of computer science before you're allowed to build anything." That's gatekeeping, and it's wrong. The answer is to keep the speed of AI and add a thin layer of deliberate understanding on top. Here's the checklist I'd hand to anyone building with AI today.
Before you call it "done" — run this list
Final Thoughts — Build Anyway, Just With Your Eyes Open
I genuinely love that more people can build now. The barrier falling is a gift. Some of the best products of the next decade will be built by people who, ten years ago, would never have written a line of code. I want that future.
But I also know that "it works" and "it's ready" are two very different sentences, and AI has made it dangerously easy to confuse them. The demo will always look done. The product is the part you can't see.
So build. Use every AI tool you can get your hands on. Ship fast. Just don't mistake the tip of the iceberg for the whole thing. Learn to ask the six questions. Learn to read what the machine wrote. Keep the speed — add the understanding.
The future doesn't belong to people who can prompt an AI. It belongs to people who can prompt an AI and still know what they're looking at.
That second part used to be the easy half. Now it's the whole game. And honestly? That makes it a pretty good time to be someone who actually understands what they're building.