All Articles
CategoryVibe Coding
Reading Time
13 min read
Published
2025-03-15
Word Count
3,199words

Grab a coffee — this one is a deep dive!

Vibe Coding: Where Prototype Ends and Production Begins

Summary

What is vibe coding, who coined the term, and where's the line between prototype and production code? A clear guide grounded in Karpathy's own definition.

  • Vibe coding is the practice Andrej Karpathy defined on February 6, 2025, of accepting AI-generated code without reviewing it.
  • Karpathy's own definition scopes it to "throwaway weekend projects," not production engineering.
  • The difference isn't the tool but the review: reading diffs, writing tests, and being able to explain the code turns it into "AI-assisted development."
  • Any change touching the data model, authorization, or a multi-person codebase needs to leave vibe mode and enter review mode.
Vibe Coding: Where Prototype Ends and Production Begins

What vibe coding actually is traces back to a single tweet on February 6, 2025. Andrej Karpathy — a co-founder of OpenAI and Tesla's former AI director — put a name on a practice that had existed informally for years when he said he now "fully gives in to the vibes" while coding and forgets the code even exists. This piece explains what the term means, where it works, and draws a clear line for where it crosses from prototype into production.

💡 Pro Tip: Think of vibe coding as a _mode_, not a tool — in the same editor, with the same assistant, you can go from "accept without reading the diff" to "I understand every line" a minute later. The problem isn't the tool; it's not knowing which mode you're in.

Table of Contents

Where the term was born — Karpathy's definition and what he meant

Karpathy wrote on February 6, 2025: "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." In other words: focusing on the outcome so intensely you forget the code exists.

Karpathy describes this not as an abstract philosophy but as his own daily practice: "I ask for the dumbest things like 'decrease the padding on the sidebar by half' because I'm too lazy to find it. I 'Accept All' always, I don't read the diffs anymore." Not reading diffs isn't an oversight here — it's the definition itself. The same discipline holds when an error appears: "When I get error messages I just copy paste them in with no comment, usually that fixes it."

The roots go back further. In 2023, summarizing LLMs' ability to generate code from natural language, Karpathy said "the hottest new programming language is English." Vibe coding is the natural endpoint of that idea: natural language no longer just _describes_ the code — it replaces it.

The definition being short is deliberate — Karpathy didn't publish a methodology, he shared a single tweet describing a habit. That brevity is also what set the term up to be misread: some stretched vibe coding to mean "any line of code written with AI," while others caricatured it as reckless practice. Yet Karpathy's own words carry both a clear scope limit ("throwaway weekend projects") and self-awareness — he isn't praising his own practice, he's describing it.

What vibe coding is NOT

The most common confusion starts here: "writing code with AI" and "vibe coding" are not synonyms. Karpathy's own definition scopes the practice from the start — a method that's "not too bad" for "throwaway weekend projects," not a production-grade engineering method.

The distinction is clear in this line:

text
1AI-assisted development: suggest → read → understand → edit → test → commit
2Vibe coding: suggest → "Accept All" → run → paste error if any → repeat

If a developer working with an assistant like Claude Code or Cursor reads every diff, writes their own tests, and can explain what changed and why — that's AI-assisted engineering, not vibe coding. The difference isn't the tool; it's whether review exists.

Anatomy of the loop: intent → generation → run → fix

The cycle Karpathy describes can be reduced to four steps, in his own words: "I just see stuff, say stuff, run stuff, and copy paste stuff, and it mostly works."

Step
What happens
Difference from the traditional flow
Intent
A casual request in natural language ("cut the sidebar padding in half")
A one-line request instead of a spec or ticket
Generation
The assistant writes/changes the code
The developer doesn't design the code beforehand
Run
The change is accepted directly ("Accept All")
No diff review step
Fix
The error message is pasted back without comment
Trial and error instead of root-cause analysis

The critical feature of this loop is that the developer doesn't debug: instead of the discipline of debugging, there's a continued dialogue with the assistant until the error disappears. In Karpathy's own words, this "mostly works" — but the word "mostly" is the key part.

Written out, this loop looks like this — the developer never asks _why_ the error happened, they just relay it back to the assistant:

bash
1# Representative example — the vibe coding loop, as Karpathy describes it:
2$ npm run dev
3Error: Cannot read properties of undefined (reading 'map')
4 at ProfileList (ProfileList.tsx:42)
5 
6# The developer copies the error message without comment and pastes it to the assistant.
7# The root cause is never asked: "why did this come back undefined?" is skipped.
8# The assistant proposes a fix, it's accepted with "Accept All," the loop starts again.

Where it shines: prototyping, exploration, throwaway code

The real-world impact is significant: in early March 2025, Y Combinator managing partner Jared Friedman revealed that a quarter of startups in the W25 cohort had codebases that were 95% AI-generated. As Friedman put it: "A year ago, they would have built their product from scratch — but now 95% of it is built by an AI."

So it's not just non-technical people driving this speed increase — even "highly technical" founders are doing it. In the same conversation, YC partner Diana Hu stressed that using vibe coding well still requires skill: "You have to have the taste and enough training to know that an LLM is spitting bad stuff or good stuff." The tool is automatic, but the eye evaluating the output is still human.

In practice, the areas where vibe coding is strongest fall into three categories:

These three areas share a low margin for error. When a prototype breaks, the only thing lost is a few minutes of retrying; nobody's data, money, or access is at risk. Vibe coding's speed advantage peaks in this low-risk zone, where the cost of the "Accept All" reflex stays low too.

Where it breaks: data model, authorization, multi-person codebases

That same speed advantage turns into fragility the closer you get to critical business logic. The step vibe coding skips by definition — not reading the diff, fixing without understanding — gets expensive precisely in these three areas:

  1. Data model: When a relationship is designed incorrectly, the error doesn't show up right away; data integrity breaks silently.
  2. Authorization: Even when a permission check "looks like it works," its scope can be wrong — and that won't be caught in a diff nobody reviewed. The prompt-injection risks of granting authorization to an AI coding agent addresses exactly this blind spot.
  3. Multi-person codebase: A change shaped by one person's "vibe" can invisibly break assumptions another developer built on top of.

An authorization gap compiles, runs, and stays silent

Let's make this concrete with a simple rule-engine example — the check below shows what can be missed when it's written "by vibe" and accepted without testing:

typescript
1// A common "looks like it works" check in vibe coding:
2function canEditPost(_userId: string, _post: { authorId: string }) {
3 return true; // passed with "Accept All," went unnoticed in testing
4}
5 
6// The version that went through review:
7function canEditPost(
8 userId: string,
9 post: { authorId: string },
10 role: "admin" | "user",
11) {
12 return role === "admin" || userId === post.authorId;
13}

The first function compiles, runs, and throws no error during the demo — because its bug isn't a _runtime crash_, it's an _authorization hole_. These kinds of bugs hide exactly where reading the diff gets skipped.

An invisible assumption collision

There's a second breaking point in multi-person codebases: a change one developer makes "by vibe" can unknowingly invalidate an assumption another developer already relies on in that file. Because the diff isn't read, this collision doesn't surface at compile time — it shows up weeks later as a production incident, and by then the root cause costs far more to find than reading the diff would have.

The 5 questions that draw the line (a decision checklist)

Distilled from Karpathy's own framing and the discussion of that period, five questions can help decide whether a change belongs in "vibe" mode or review mode:

Question
Answer suited to "vibe"
Answer that requires review
Who pays what cost if this breaks?
Only I see it, low risk
User data/money is affected
Could I explain this code to someone else?
Doesn't matter, it's throwaway
Yes, I need to be able to explain it
Single-user or multi-person?
Single-user (software for one)
Shared/production codebase
Does it touch the data model or authorization?
No
Yes
Will it need long-term maintenance?
No, throwaway
Yes, it will be maintained

If two or more of the five questions fall into the "requires review" column, that change is no longer vibe coding — it's normal engineering work that needs the diff read, tests written, and the ability to explain it.

Asking these five questions might seem time-consuming, but in practice it takes seconds, because for most changes the answers are already obvious. Changing padding in a personal weekend project falls into the "vibe" column on all five; touching a payment flow falls into "requires review" on the very first question, and you don't need to ask the other four. The list's value is that it makes the decision conscious — the difference between "Accept All without thinking" and "Accept All on purpose" lives in that few-second pause.

What to do after the prototype — the handoff of responsibility

A prototype produced through vibe coding is, by definition, not "production-ready." The common thread in the period's discussion is this: moving from prototype to production requires a handoff of responsibility — the code read line by line, tests written, and at least one person able to explain the code to someone else.

A distinction Anthropic's engineering team draws for agentic systems offers a useful mental model: predefined, auditable code paths (workflow) versus open-ended systems where the model manages its own process (agent). Leaving vibe coding behind means moving toward the "auditable" side — being able to explain which code path runs and why.

The three items of the handoff

In practice, this handoff can be summarized in three steps:

json
1{
2 "handoffChecklist": [
3 "Every diff was read and approved through understanding, not comment lines",
4 "Data model and authorization paths were separately reviewed by at least one person",
5 "Tests were written for critical flows (unit tests plus at least one integration scenario)"
6 ]
7}

If a prototype moves to production before these three items are complete, the speed gain is temporary and the technical debt is permanent. Tool guides like 10x productivity with Cursor AI and the Claude Code MCP ecosystem describe tools that can speed up this handoff — but the tool doesn't do the handoff, discipline does.

The handoff can also be gradual

The handoff doesn't have to be a one-time event — it can also be gradual: the most critical files (authentication, payments, data model) move into review mode first, while lower-risk parts stay in vibe mode a while longer. What matters is that the team knows explicitly which files are in which mode, instead of silently assuming "everything is production-ready."

GOLDEN TIP

The most valuable insight in this article

This tip holds the article's most important takeaway.

Easter Egg

You found a hidden gem!

There's a hidden detail in this section. Want to uncover it?

Reader Reward

We've gathered the steps that get missed when moving from prototype to production into a single checklist. This list is a practical summary of the five questions and the handoff section above — items you can walk through in order before handing a vibe coding prototype off to the team.

FAQ

What is vibe coding?

A coding practice Andrej Karpathy defined on February 6, 2025, in which the developer accepts AI-generated code without reviewing it ("Accept All") and moves forward by pasting error messages back without comment. In his own words, it means "fully giving in to the vibes and forgetting the code even exists."

Who coined the term vibe coding?

Andrej Karpathy — a co-founder of OpenAI and Tesla's former AI director — coined it in a tweet on February 6, 2025, while describing his own daily habit, not proposing a methodology — which is why the definition was narrow from the start.

What's the difference between vibe coding and normal AI-assisted coding?

Not the tool — review. In AI-assisted coding, the developer reads diffs, writes tests, and can explain the change. In vibe coding, that step is deliberately skipped — in Karpathy's own words, "I don't read the diffs anymore."

Can you write a production app with vibe coding?

Karpathy's own definition scopes it to "throwaway weekend projects," not production-grade engineering. Moving to production requires a handoff of responsibility: reading diffs, writing tests, reviewing authorization and the data model.

Is vibe coding safe?

Vibe coding itself isn't unsafe, but the areas it leaves unreviewed — authorization, the data model — leave the door open for security holes to slip into production unnoticed. Critical business logic should be written in review mode, not vibe mode.

Which projects does vibe coding work well for?

Best for prototyping, architectural exploration, and single-user/throwaway tools. Per Y Combinator data, a quarter of W25-cohort startups produced 95% of their codebase this way — but even those are still run by technical founders.

Update (September 2026)

According to sources compiled by Wikipedia, adoption of the term has expanded rapidly since March 15, 2025: Collins English Dictionary named "vibe coding" its 2025 Word of the Year. In January 2026, Linus Torvalds was reported to have vibe-coded a small visualization tool for a hobby project using Google Antigravity; in his own README notes he wrote, "the python visualizer tool has been basically written by vibe-coding" — consistent with Karpathy's original "throwaway weekend project" framing, showing that even an experienced engineer stays within the same boundaries.

After this article, the debate split in two directions: "spec-driven" flows that put a written intermediate step between intent and generation, and the auditing of agent authorization.

Both topics are, in fact, a natural continuation of this article's central distinction. "Spec-driven" flows try to bring back the "understanding" step vibe coding skips, by inserting a step between intent and generation — writing down what will be done first, then generating the code. Auditing agent authorization addresses, at an organizational scale, exactly the risk pointed out in the "where it breaks" section. The 10 misconceptions about AI coding article, which compiles where AI coding tools mislead in the real world, captures the current state of this same boundary debate.

Conclusion

Vibe coding has remained a topic of debate since Karpathy defined it on February 6, 2025 — but most of that debate stems from forgetting the term's own boundaries. Karpathy's definition was narrow from the start: throwaway, low-risk, single-user projects. Stay within that boundary and vibe coding delivers a real speed gain; cross it — touching the data model, authorization, or a multi-person codebase — and that same speed becomes a silent risk.

You can see the concrete steps for moving from prototype to production in the guide to building a full-stack app from a prompt with Lovable and the Bolt.new browser flow; you can find the security risk of authorization granted to agents in the article on granting authorization to an AI coding agent. A tool used with knowledge of its boundary is worth far more than the same tool used without knowing it.

Sources

Tags

#vibe coding#AI-assisted development#prototyping#software architecture#code review#production readiness
Muhittin Çamdalı

Muhittin Çamdalı

Lead Mobile Engineer

Lead Mobile Engineer with 12+ years of experience. Expert in iOS, Android and cross-platform architectures with Swift, SwiftUI, Kotlin and Flutter. I build performant, user-friendly mobile apps.

iOS Development News

Weekly Swift tips, SwiftUI tricks and iOS best practices. No spam, only valuable content.

We respect your privacy. You can unsubscribe at any time.

Share