TL;DR: Vibe Coding is an intent-centric way of building software, popularized by Andrej Karpathy in early 2025. You describe what you want in natural language and let an AI agent generate, run, and fix code. This post explains what the term actually means, why it became possible in 2025, how a typical loop works, and — just as important — where it breaks down and what you still owe the code before it reaches production.
Introduction
In early 2025 a term caught on across developer communities almost overnight: Vibe Coding. As coding-capable LLMs and agentic tooling matured, a lot of everyday building shifted from typing code to describing intent and reviewing what came back. That shift is real and worth understanding — but it is a change in where your effort goes, not a promise that judgment stopped mattering.
This article looks at what Vibe Coding is, why it became practical in 2025, how a typical workflow runs, and where the honest limits are. If your goal is production software, the last part matters most.
Why This Matters: From Syntax-Centric to Intent-Centric
For decades, a large share of programming has been "translation": turning human intent into syntax a computer accepts (C++, Java, Python), and spending real time on memory management, type checking, and the fine print of API docs.
Vibe Coding compresses much of that translation layer. As reasoning-capable models crossed a practical usefulness threshold for multi-step coding tasks in 2024–2025, they stopped being only autocomplete and started handling larger units of intent — scaffolding a feature, wiring a component to an API, fixing a failing test. That lets you spend less time on mechanical translation and more on deciding what to build and whether the result is actually correct.
The word "compresses" is deliberate. The translation layer gets smaller and cheaper; it does not vanish. Someone — you — still has to confirm that the generated behavior matches the intent, and that nothing unsafe slipped in along the way.
What is Vibe Coding?
The Origin: Andrej Karpathy's Post
In February 2025, Andrej Karpathy — former Tesla AI lead and an OpenAI co-founder — posted on X:
"There's a new kind of coding I call vibe coding, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists."
The line spread quickly. Karpathy was describing a mode where you interact less with specific syntax and more like a director guiding an actor: describing the behavior, interaction logic, and feel of the software you want, and letting the agent handle much of the mechanical implementation.
It's worth reading that framing as an observation about a style of interaction, not a literal claim that the code no longer matters. The code still exists, still runs, and still fails in the usual ways — Vibe Coding just changes how much of it you type by hand.
Core Definition: Intent-Driven Development
At its core, Vibe Coding is a strong form of intent-driven development, with a few defining traits:
- Natural language first: Your intent (the prompt) is the primary input.
- End-to-end autonomy: The AI acts as an agent, not just a completion tool — it can read files, run terminal commands, install dependencies, and iterate on its own output.
- Behavior-first review: You often judge success by how the program behaves rather than by reading every line. That's a convenience, not a guarantee — for anything that touches data, money, or auth, "it seems to work" is not the same as "it's correct."
The Underlying Logic: Why It Became Practical
Vibe Coding didn't appear from nowhere. It became practical as three capabilities matured together:
- Larger context windows: Models can hold much more of a codebase in working memory at once, so they reason about a change in the context of the whole project instead of a single file.
- Reasoning-capable models: Better multi-step reasoning lets a model anticipate that a change in file A affects logic in file B — though it still gets this wrong often enough that review matters.
- Tool use (agentic workflows): The model gained "hands" — direct access to the file system and terminal — closing a "write → run → read the error → fix" loop without a human in every step.
Each of these is a capability, not a correctness guarantee. A larger context window means the model can see more, not that it always uses the right parts. Tool use means it can run and fix code, not that its fix is the right one.
The Core Workflow: The DGRR Loop
Vibe Coding tends to run as a fast iterative loop — Describe, Generate, Run, Refine:
1. Describe Intent
This is more than a one-line prompt. Effective intent usually includes functional requirements, visual references, and constraints — the sharper the constraints, the less the model has to guess.
- Example: "Build a minimalist finance app. Use a muted, Morandi-style palette. Add smooth spring animations on button clicks. Use Supabase for data storage. Users must only see their own transactions."
That last sentence matters: constraints like "users must only see their own data" are exactly the kind of requirement the model will not infer on its own. If a rule is important, state it — and then verify it, because stating it does not guarantee the model enforced it.
2. AI Generates
The agent scans the directory, decides whether to modify existing files or create new components, installs packages, and configures the environment.
3. Run
The agent runs the app (for example npm run dev) and you observe the behavior directly in the preview.
4. Observe & Refine
Instead of editing line 45 by hand, you describe the change: "The sidebar is too wide — make it auto-hide on mobile." The agent locates the relevant code and applies the fix. For anything correctness-critical, "observe" should include actually checking the behavior — logging in as a second user, submitting invalid input, reading the query — not just glancing at the happy path.
Where Vibe Coding Breaks Down
The speed is real, and so are the failure modes. Treating these as afterthoughts is how prototypes quietly become fragile production systems.
The Maintenance Black Hole
Code generated without an architectural anchor is fast to produce and slow to maintain. Once a codebase grows past what fits comfortably in context, changes start causing regressions the model can't foresee. The mitigation is not "stop using AI" — it's giving the work structure: a clear architecture, module boundaries, and (for anything non-trivial) a written spec the generation has to satisfy.
Correctness You Didn't Verify
Behavior-first review has a blind spot: you see that the happy path works and assume the rest does too. But the paths that matter most in production — invalid input, concurrent access, the unauthorized request — are exactly the ones a quick visual check skips. Tests help here, but note the trap: an agent can write tests that pass while asserting the wrong thing. Read the assertions, especially on error and permission paths.
Security Is Not a Vibe
This is where "forget the code exists" is most dangerous. Left unattended, generated code will happily introduce unvalidated inputs, string-built SQL, secrets hard-coded for convenience, or overly permissive defaults. A few boundaries don't move no matter how good the tooling gets:
- Authentication is identity, not authorization. Generated login code proves who is calling; it does not prove they're allowed to act on a specific record. Object- and tenant-level checks are your responsibility and must run on every request.
- Validate untrusted input at the boundary. The model won't reliably add this for you.
- Insecure defaults are for local dev only. Fallback secrets and open CORS are fine on your laptop and must never reach a deployed environment.
- Treat model output as a draft, not an authority. It doesn't set your security policy, your access rules, or your data model — you do.
The "Missing Middle"
Vibe Coding is strong at the small scale (a prototype) and, with heavy structure, at the large scale (a spec-driven module). The awkward zone is in between: a real app that has outgrown a prototype but hasn't been given the architecture and specs a large system needs. That's usually the point to shift from pure vibes toward more deliberate practices — see Spec Coding and Harness (Constraint Systems).
Advantages, Kept in Proportion
None of the above cancels the upside — it just frames it honestly:
- Prototyping speed: The time from idea to a runnable prototype drops dramatically, which changes what's worth trying at all.
- Lower barrier to entry: People who aren't full-time engineers can build working software, especially for personal and internal tools.
- Cognitive headroom: Experienced developers can orchestrate several moving parts at once, delegating mechanical work and spending attention on design and review.
The pattern across all three: Vibe Coding is excellent at producing software quickly and weaker at guaranteeing it. The value you get is proportional to how well you keep the second part.
Paradigm Shift: Vibe Coding vs. Traditional Coding
| Feature | Traditional Coding (Manual) | Vibe Coding (Intent) |
|---|---|---|
| Focus | Syntax, logic, implementation (How) | Business, experience, final output (What) |
| Developer Role | Author of every line | Architect, director, reviewer of intent and output |
| Error Handling | Manual debugging, stack traces | Paste the error, describe the expectation, review the fix |
| Learning Curve | Steep (language/framework mastery) | Flatter to start, but production use still demands system thinking |
| Unit of Delivery | Functions, classes, modules | Features, pages, sub-systems |
Note the learning-curve row: getting started is far easier, but shipping something reliable still requires understanding architecture, security, and testing. Vibe Coding lowers the entry cost, not the competence ceiling.
Conclusion: Will Programmers Be Replaced?
Karpathy's framing is that Vibe Coding raises the level of abstraction rather than removing the programmer. The skills that matter shift from syntax fluency toward system design, clear communication of intent, and — increasingly — the judgment to verify what an agent produced. If anything, the ability to review AI-generated code critically becomes more valuable, not less.
To run Vibe Coding safely for real workloads, pair it with structure: use Spec Coding to pin down requirements and a Harness (Constraint System) to keep generated code inside the boundaries that matter.
Related Reading: