Skip to content
back to journal

vibe-coding

What Is Vibe Coding? (And Why Most Explanations Get It Wrong)

Vibe coding is a real way to build software by letting AI generate most of the code while you steer through prompts, feedback, and taste. Here is what it actually means.

IBF EditorialApril 28, 202615 min read
<p>Vibe coding is not magic. It is also not a joke.</p> <p>That is why most explanations miss it.</p> <p>The loudest version says vibe coding is the future of software development, where anyone with an idea can build an app by talking to an AI model. The skeptical version says it is reckless, unserious, and basically just copy-pasting code you do not understand.</p> <p>Both takes are too clean.</p> <p>So, what is vibe coding? It is a real way to build software by letting an AI model generate most of the code while you steer through prompts, feedback, screenshots, errors, and taste. The vibe coding meaning depends on one uncomfortable detail: in the original framing, you are not carefully reading every line. You are guiding the output and judging whether the thing works.</p> <p>That can be insanely productive.</p> <p>It can also leave you with a codebase nobody wants to touch.</p> <p>The difference is not whether you used AI. The difference is whether you had a workflow.</p> <h2>The original definition of vibe coding: Andrej Karpathy's framing from February 2025</h2> <p>The term vibe coding came from Andrej Karpathy in February 2025. His original framing was not a polished framework or a product category. It was a casual description of a very specific way of building with AI.</p> <p>The key line was this:</p> <blockquote> <p>"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."</p> </blockquote> <p>That quote matters because it is more extreme than the way most people use the term now.</p> <p>Karpathy was not describing normal AI-assisted programming where you ask an editor for help, review the diff, and keep ownership of the code. He was describing a mode where you talk to the model, accept the changes, run the app, paste errors back in, and keep moving. The code becomes less like something you author and more like a weird substrate the model manipulates on your behalf.</p> <p>That is the original vibe coding definition: you steer by outcome, not by implementation.</p> <p>In practice, that means you ask for things like "make this onboarding screen feel less cramped," "add a Stripe checkout flow," or "fix this error," then you let the model make the code changes. You judge the result by what you can see, test, and feel.</p> <p>That is powerful. It is also where the danger starts.</p> <h2>What vibe coding actually looks like in practice</h2> <p>A vibe coding session usually starts with intent, not architecture.</p> <p>You do not open a blank file and start designing modules. You open Lovable, Cursor, Windsurf, Replit, Bolt, Claude, or whatever tool fits the moment, and you describe what you want the thing to do.</p> <p>A typical first prompt might look like this:</p> <p>"Build a simple CRM dashboard for a small consulting firm. It needs a sidebar, a client list, a deal pipeline, a notes panel, and a clean modern interface. Use placeholder data for now."</p> <p>The model returns a working first pass. Maybe it scaffolds a React app. Maybe it generates a UI with fake records. Maybe it wires up state locally. It will probably be rough, but it will be visible. That is the hook.</p> <p>Instead of spending the first hour deciding folder structure, installing packages, and debating component boundaries, you are already reacting to something on the screen.</p> <p>So you keep going.</p> <p>"Make the pipeline cards more compact. Add priority labels. Add a search bar. Let me click a client and see their notes. Make it feel more like Linear and less like a Bootstrap admin template."</p> <p>The model edits the code. You accept. You run it. Something breaks.</p> <p>You paste the error back in.</p> <p>"Fix this."</p> <p>It fixes it, or appears to. You keep moving.</p> <p>That loop is the real shape of vibe coding: prompt, generate, run, react, correct, accept. The user is not writing code line by line. The user is directing a machine that writes code.</p> <p>When it works, it feels almost unfair. You can go from vague idea to usable prototype before a traditional project would have finished setup.</p> <p>But notice what is missing from the default loop: tests, design constraints, code review, data modeling, security review, long-term maintainability, and a handoff plan.</p> <p>That is fine for a throwaway prototype. It is not fine once real users, money, data, or a team enter the picture.</p> <h2>The productivity spike in vibe coding is real — here's why</h2> <p>The reason vibe coding took off is simple: it removes a brutal amount of friction from early software creation.</p> <p>Most software work is not typing clever algorithms. It is scaffolding, wiring, naming, styling, package setup, boilerplate, state management, API glue, debugging syntax errors, and remembering the exact incantation for whatever framework you are using this week.</p> <p>AI eats a lot of that.</p> <p>That does not mean the AI is always right. It means the first version appears much faster than it used to.</p> <p>For a prototype, that speed matters more than elegance. You can test the shape of an idea before you emotionally commit to it. You can see whether the dashboard makes sense. You can click through the onboarding flow. You can show a client or teammate something tangible instead of asking them to imagine it from a spec.</p> <p>The biggest win is not just code generation. It is the iteration loop.</p> <p>Before AI, changing a screen often meant finding the right file, understanding the component tree, editing CSS, fixing layout breakage, and refreshing repeatedly. With vibe coding, you say what feels wrong: "too much whitespace," "make this mobile-friendly," "add an empty state," "this form needs validation."</p> <p>The model handles the mechanical translation from intent to code.</p> <p>That is why non-developers can build things they could not build before. It is also why developers use it even when they know better. Nobody misses writing boilerplate by hand.</p> <p>The productivity spike is real because vibe coding compresses the distance between idea and working artifact.</p> <p>That does not make the artifact good. It makes the artifact exist.</p> <p>Sometimes existence is the whole point.</p> <h2>The failure mode of vibe coding nobody talks about enough</h2> <p>The failure mode starts quietly.</p> <p>The first ten prompts feel great. The app looks better. Features appear quickly. Bugs get patched. You feel like you are moving faster than the old rules of software should allow.</p> <p>Then the model starts drifting.</p> <p>You ask it to add one thing, and it changes three unrelated files. You ask it to fix a bug, and it reintroduces an old one. You ask for a small layout tweak, and it rewrites a component that was already working. It forgets why earlier decisions were made. It duplicates logic. It adds a second version of something that already existed.</p> <p>That is model drift.</p> <p>The further the codebase gets from the original prompt, the more the AI has to infer. If the project has no tests, no clear architecture, and no written constraints, the model is guessing inside a growing mess. It may still sound confident. That does not mean it understands the system.</p> <p>This is where vibe coding becomes expensive.</p> <p>Not immediately. That is the trap.</p> <p>You can stack 50 rounds of "just fix this one thing" before the structure collapses. Each individual prompt feels reasonable. Each generated patch feels faster than slowing down. But eventually, the codebase becomes a pile of local fixes with no global design.</p> <p>Then you hit the wall.</p> <p>The app works, but you are afraid to touch it. A simple feature breaks something weird. The model cannot fix the bug because the bug is not one line. It is the accumulated result of unclear state, duplicated components, missing tests, and decisions nobody remembers making.</p> <p>That is when the rewrite conversation starts.</p> <p>What a drift-affected file actually looks like: duplicated state management because the model forgot what existed and created a parallel version. A second auth utility sitting alongside the first, both imported in different places, neither complete. The same validation logic written three different ways because each prompt was blind to the previous ones. It does not look like a disaster. It looks like a project that grew without anyone in charge of the whole.</p> <p>This is what the rewrite conversation looks like from the inside. Not a decision. A realisation. The codebase became illegible to the model before it became illegible to you. By the time you notice, the prompt that caused it is twenty sessions back.</p> <p>The hard truth: many vibe-coded projects do not fail because AI could not build the first version. They fail because nobody planned for the second version.</p> <h2>Vibe coding vs AI-assisted coding — what's the actual difference?</h2> <p>Vibe coding and AI-assisted coding are related, but they are not the same thing.</p> <p>In vibe coding, the AI is effectively driving implementation. You describe outcomes, accept changes, run the result, and keep prompting. You may skim the code, but the defining behavior is that you are not deeply owning every line. You are steering by feel and functionality.</p> <p>In AI-assisted coding, you still own the code.</p> <p>The model helps you write functions, generate tests, explain errors, refactor components, or explore implementation options. But you review the diff. You understand the design. You decide what belongs in the codebase. The AI is a collaborator, not the driver.</p> <p>This distinction matters because people keep arguing about the wrong thing.</p> <p>Vibe coding is not automatically bad. AI-assisted coding is not automatically more professional. They are different workflows for different jobs.</p> <p>If you are building a weekend prototype to test an idea, vibe coding may be the right move. You should not spend three days building a perfect architecture for an idea that might be dead by Monday.</p> <p>If you are changing a production billing flow, vibe coding is reckless. You need tests, review, and accountability.</p> <p>This is where more structured approaches — [AI pair programming], or reaching for a [best AI coding assistant] with deliberate review gates — keep engineering judgment in the loop.</p> <p>That is the line: in vibe coding, the model owns more of the implementation. In AI-assisted coding, you do.</p> <p>Neither is morally superior. But confusing them causes bad decisions.</p> <h2>When vibe coding is the right choice</h2> <p>Vibe coding is the right choice when speed matters more than maintainability.</p> <p>That sounds like an insult. It is not.</p> <p>There are plenty of situations where maintainability is not the immediate goal. A prototype does not need to survive five years. It needs to answer a question. Does this workflow make sense? Does this customer care? Does this dashboard help? Does this internal tool save time? Can this landing page explain the product?</p> <p>For those cases, vibe coding is excellent.</p> <p>It is especially useful for prototypes, MVPs, personal projects, proof-of-concept apps, internal demos, one-off scripts, and throwaway experiments. It is also useful when the person with the idea is not a developer and would otherwise be blocked entirely.</p> <p>A non-technical founder can build a clickable app. A sales team can mock an internal workflow. A consultant can automate a repetitive spreadsheet process. A product person can test an onboarding flow without waiting for engineering bandwidth.</p> <p>That is not a small thing.</p> <p>The mistake is pretending every prototype is secretly production software. It is not. Sometimes you are building to learn. Sometimes you are building to sell the idea. Sometimes you are building to decide whether the real build is worth paying for.</p> <p>In those situations, vibe coding is not sloppy. It is efficient.</p> <p>Just be honest about what you are making.</p> <h2>When vibe coding will cost you later</h2> <p>Vibe coding gets expensive when the code starts to matter.</p> <p>The moment other people need to maintain it, you need a different standard. The moment customers depend on it, you need a different standard. The moment it touches payments, authentication, permissions, private data, financial records, health information, or anything with real-world consequences, you need a different standard.</p> <p>That does not mean AI has no place there. It means pure vibe coding is the wrong workflow.</p> <p>The risky pattern is building a prototype with no boundaries, getting traction, and then continuing to stack features on top of it because momentum feels good. That is how a weekend project becomes a production liability.</p> <p>Here is how it plays out. A founder builds a Lovable prototype over a weekend. It looks good. It works in demos. They keep adding features — a client view, a reporting tab, an invite flow. Users start signing up. Real data accumulates. Then someone asks how the accounts are secured, and the answer is: local state check. No backend auth. No session management. It was never built because the first prompt never asked for it and nothing in the demo revealed the gap. The prototype felt production-ready because it worked. Working and secure are not the same thing.</p> <p>Existing codebases are another danger zone.</p> <p>If you point an AI tool at a mature app and start accepting broad changes without understanding them, you can break assumptions the original system depends on. The model may not understand the business logic. It may not know why a weird edge case exists. It may simplify something that looks ugly but is actually protecting revenue.</p> <p>This is where teams often need a [fractional CTO] or senior developer to step in before the mess hardens. Not because vibe coding was stupid, but because the project has crossed into a different phase.</p> <p>The rule is simple: vibe coding is great for discovery. It is dangerous when treated as a substitute for engineering discipline.</p> <h2>The vibe coding workflow that actually holds up</h2> <p>There is a version of vibe coding that holds up longer than the hobby version.</p> <p>It starts with scope.</p> <p>Before asking the model to build anything, write down what the thing does and what it does not do. This does not need to be a 40-page spec. It can be a tight brief:</p> <ul> <li>Who is this for?</li> <li>What is the core workflow?</li> <li>What screens are required?</li> <li>What data matters?</li> <li>What is explicitly out of scope?</li> <li>What would make the prototype successful?</li> </ul> <p>That one page can prevent a lot of drift.</p> <p>Then use the right tool for the stage.</p> <p>Lovable is strong when you want to move fast on UI and product shape. Cursor gives you more control when logic and codebase structure matter. Claude is useful before the build when you need to think through architecture, data models, edge cases, or implementation plans. Bolt and Replit are useful when setup friction would kill momentum.</p> <p>This is where people searching for [best AI app builder 2026] or the best vibe coding tools often go wrong. They want one tool to be the answer. The better question is: what stage am I in?</p> <p>The switch from Lovable to Cursor usually becomes obvious at a specific moment. When you start needing custom API logic that does not fit the prompt layer. When the component structure gets abstract enough that you cannot describe what should change without reading the code first. When a generated component is 400 lines and you can no longer prompt against it reliably without risking the parts that work. At that point, staying in a UI-first tool is friction, not speed. Move into an editor where you can read what you are actually changing.</p> <p>Next, test at milestones, not at the end.</p> <p>After the login flow works, manually try five edge cases before stacking the next feature on top. Wrong password. Expired session. Two accounts with the same email. Mobile viewport. Slow network. Not enterprise process — just the habit that catches the assumption the model made when you were not looking. One round of intentional edge-case testing after each milestone is what separates a prototype that held together from one that fell apart at the worst moment.</p> <p>After the first screen works, test it. After authentication works, test it. After data persistence works, test it. After the payment flow works, stop vibe coding and get serious.</p> <p>You do not need enterprise process for a prototype. But you do need checkpoints.</p> <p>Finally, know when to hand off.</p> <p>The handoff point is usually obvious if you are willing to admit it. The prototype works, but every change is scary. The AI is fixing one bug and causing another. You do not understand the data model. You want real users. You need reliability.</p> <p>That is when a real developer, technical lead, [fractional CTO], or [consultancy] should stabilize the foundation before you keep stacking features.</p> <p>The winning workflow is not "never vibe code." It is: vibe code until the project proves it deserves engineering discipline.</p> <p>Then switch modes.</p> <h2>The vibe coding tools people actually use</h2> <p>The vibe coding tools people use most tend to fall into a few categories.</p> <p>Lovable is popular for UI-first prototypes because it turns product descriptions into working app screens quickly. It is good when the visual flow matters and you want something demoable fast.</p> <p>Cursor is better when you want AI inside a real editor and need more control over the code. It fits the boundary between vibe coding and AI-assisted development.</p> <p>Claude is useful as a planning and reasoning layer. It is often better for thinking through requirements, architecture, or debugging strategy before touching the code.</p> <p>Windsurf, especially with Cascade, is built for more agentic multi-step sessions. Bolt is good for fast browser-based experiments. Replit is useful when you want coding and deployment in one place.</p> <p>There is no universal winner. The best vibe coding tools depend on whether you are shaping UI, editing an existing codebase, planning architecture, or trying to deploy something without setup pain.</p> <p>We cover the full breakdown in [vibe coding tools]. This post is about the workflow, not a padded rankings list.</p> <h2>What most vibe coding content gets wrong</h2> <p>Most vibe coding content tries to force the topic into one of two buckets.</p> <p>Either it is the future and everyone should get on board, or it is reckless nonsense and serious developers should mock it.</p> <p>That framing is lazy.</p> <p>Vibe coding is not one thing. It is a technique, and techniques depend on context.</p> <p>A solo founder using vibe coding to validate a product idea is not doing the same thing as a developer blindly accepting AI patches into a production codebase. A non-coder building a personal tool is not doing the same thing as a team shipping customer-facing infrastructure. A prototype meant to be thrown away is not the same as a system expected to scale.</p> <p>The missing piece in most explanations is workflow discipline.</p> <p>They talk about prompts. They talk about tools. They talk about how fast the first version appears. They do not talk enough about constraints, tests, handoff, refactoring, code ownership, or the moment when speed stops being the main priority.</p> <p>That is the real dividing line.</p> <p>People who ship with vibe coding are not necessarily the people who prompt the best. They are the people who know when to stop prompting and start engineering.</p> <p>That is less exciting than the hype version.</p> <p>It is also how real products survive.</p> <h2>The bottom line on vibe coding</h2> <p>Vibe coding works.</p> <p>That is the first thing to admit. It can take an idea from nothing to working prototype faster than almost any previous way of building software. It gives non-developers leverage. It gives developers speed. It makes early product exploration cheaper.</p> <p>But the discipline is optional only until it is not.</p> <p>At some point, the prototype either stays a toy or becomes a product. When it becomes a product, the rules change. You need structure. You need tests. You need security review. You need maintainable code. You need someone who can explain how the system works without asking the model to guess.</p> <p>The best use of vibe coding is not pretending code no longer matters.</p> <p>The best use is moving fast enough to prove what matters, then slowing down before the mess becomes the product.</p> <p>If your vibe-coded prototype is working but you are afraid to touch it, that is exactly the point where we come in. We help teams stabilize, extend, and rebuild AI-generated prototypes without losing the momentum that made them worth building in the first place.</p> <p>Talk to us about what you built.</p>