← Learn
Apply🌳 Evergreen

The Complete Guide to Vibe Coding: Building 10x Faster with AI

26 min read·2024-12-01·evergreen

Vibe coding is not just using AI to write code. It is a complete mental model shift in how you approach building software. Here is a full playbook for shipping with AI.

TL;DR — Vibe coding is more than using AI to write code — it's a complete mental-model shift in how you approach building software. This is a full playbook: the mindset, the tool stack, and the workflow for shipping real products 10x faster with AI, with the honest caveats.


Vibe coding changes how a feature gets built. A task that traditionally took two to three weeks of focused engineering time — say, a dashboard that shows recurring revenue by customer cohort over time — can be turned around in a single focused session when the workflow is tuned around AI assistance.

This is not because the AI is smarter than the developer. It is because the way of working changes. The mental model shifts. The workflow changes. The assumption about what one person can accomplish in an evening changes completely.

Get more like this.

Weekly, in Makerloop: one AI workflow, one career lesson, one thing shipped. No noise.

M
A
S
O
N

What follows is a complete playbook for how to do it: how to structure work, what works, what does not work, and where the real risks sit.

What Vibe Coding Actually Is

The term vibe coding first appeared in 2023. The original definition was loose: a programming approach where natural language is the primary interface and code is the output. You describe the effect you want, AI generates code, you iterate back and forth until the vibe feels right.

I think this definition undersells what is actually happening. Vibe coding is not just a new interface for writing code. It is a new mental model for building software.

The old mental model: I write the steps, the machine executes them. I am the author of every line. My productivity is limited by my typing speed and my ability to hold complexity in my head at once.

The new mental model: I express intent, AI implements execution, I review and gatekeep. My productivity is limited by my ability to be clear about what I want and my judgment about whether what I got is right.

The critical distinction: vibe coding does not replace your judgment. It amplifies your execution speed. If you do not have good judgment — about what to build, how to structure it, what trade-offs to accept — AI will just help you build the wrong thing faster.

My Tool Stack (2024 Update)

Let me be specific about what I use, because the specific tools matter less than how you use them.

Primary IDE: Cursor

I switched from VS Code to Cursor in March 2023 and have not looked back. Cursor is built on top of VS Code but adds deep AI integration throughout the editing experience.

Key features I use every day:

Cmd+K for inline code editing: I highlight a block of code and ask AI to modify it in natural language. This is the feature I use most — probably 50 times per day.

Composer for multi-file generation: When I need to build a feature that touches multiple files — a new API endpoint plus its database model plus its test file — I use Composer to generate them all in one conversation. This is most useful for new features where I know what I want but do not want to manually create each file.

Agent mode for complex refactoring: When I need to make changes across many files — renaming a function that is used in 20 places, extracting shared logic into a utility module, updating an API interface that propagates through multiple layers — I use Agent mode. It handles the mechanical work while I review the result.

AI Models: Claude 3.5 Sonnet plus GPT-4o

I use both models, for different purposes.

Claude 3.5 Sonnet is my primary model for code generation and technical reasoning. Its context window is long (200K tokens), its technical understanding is deep, and it produces code that is well-structured, readable, and follows conventions I have specified.

I use GPT-4o for tasks that need more creative or open-ended thinking: brainstorming multiple approaches to a difficult problem, generating marketing copy for my landing page, exploring edge cases I had not considered for a feature.

The combination matters. Claude is better at executing a clear plan. GPT is better at helping me figure out what the plan should be.

Backend: Supabase plus Drizzle ORM

Supabase handles the backend-as-a-service layer: Postgres database, authentication, edge functions, real-time subscriptions, and file storage. This means I do not have to manage servers, configure databases, or maintain infrastructure.

Drizzle ORM lets me write type-safe SQL in TypeScript. This matters when working with AI: AI generates better SQL when using an ORM with a defined schema and type system than when writing raw SQL strings.

Frontend: Next.js

I write React, but Next.js handles the routing, server components, and deployment. Vercel handles deployment with zero configuration — I push to GitHub and the product is live within minutes.

Email: Resend plus React Email

Resend is the email-sending service. React Email lets me write email templates in React. This matters for vibe coding because AI can generate React components for emails just as easily as it generates React components for web pages.

The Complete Workflow

Step 1: Write the Specification First (Not Code)

Before building any feature, I write out the specification in plain English. Not pseudocode. Not technical design diagrams. Plain English that anyone could understand.

I describe:

  • What the feature does, from the users perspective
  • How the user interacts with it
  • What states it needs to handle (loading, empty, error, success, boundary)
  • What edge cases exist
  • What data it needs and where it comes from
  • What it should not do (negative specifications are often more valuable than positive ones)

Example: I need to build a feature where users receive automatic reminders before their subscription renews.

My specification reads: Users receive email reminders at three intervals before their renewal date: 7 days, 3 days, and 1 day. Each email includes the subscription name, renewal date, renewal amount in the users preferred currency, and a one-click renewal link. If the user has already renewed, no reminders are sent. If the user has cancelled, no reminders are sent. If the user has disabled email reminders in settings, no reminders are sent. Reminders are sent at 9 AM in the users configured timezone. If email sending fails, retry up to 3 times with 1-hour intervals between retries. Log all send attempts, successes, and failures with timestamps for debugging.

This specification does something important: it forces clarity. If I cannot write it clearly in English, I cannot give AI clear enough instructions to generate what I actually want.

Step 2: Break It Down

Once I have the specification, I break it into pieces that AI can handle in a single conversation. Each piece should be no more than 300 lines of code. If it is more than that, I split it further.

This is not a rule about AI capability — it is a rule about keeping context coherent. Large, complex prompts produce messy, inconsistent code that reflects the confusion in the prompt. Small, focused prompts produce precise code that does exactly one thing well.

I also think carefully about order: what is the minimum viable version that works end to end? I build that first. Then I add complexity. I resist the temptation to build the full feature at once.

Step 3: Iterate, Do Not Aim for Perfect First Version

I start by asking AI to generate the core logic — get the basic flow working end to end, even if it is incomplete. Then I add edge cases. Then I optimize.

The AI first answer is usually a 60 out of 100. What you want is 90. Getting from 60 to 90 requires iteration, not a better prompt.

Here is my iteration pattern:

  1. Generate the core feature
  2. Test it manually with real data
  3. Identify what is wrong or missing
  4. Ask AI to fix specific issues one at a time
  5. Repeat until it works

Each iteration is small and specific. I am not trying to get AI to produce a perfect feature in one shot. I am iterating toward a good feature through many small improvements.

Step 4: Review (Never Skip)

When reviewing AI-generated code, I ask myself three questions:

  1. Can I explain why this code was written this way? Not just what it does, but why this approach was chosen over alternatives.
  2. What are the edge cases? Have I tested them?
  3. Will I understand this code in six months when something breaks in production at 2 AM?

If I cannot answer yes to question 1 — even if the code runs without errors — I ask AI to regenerate. I explain specifically what I do not understand. I ask for a simpler approach. I break the task into smaller pieces.

This is the discipline that separates vibe coding that produces maintainable codebases from vibe coding that produces technical debt at 10x speed.

Step 5: Test

AI-generated code gets three sets of test cases:

  • Happy path: the normal case where everything works as expected
  • Edge cases: empty data, boundary values, unusual inputs, maximum load
  • Error cases: what happens when something fails — network error, database error, third-party API timeout

I write these tests myself, based on the specification I wrote in step 1. The specification tells me what to test. AI does not always know what edge cases are important for my specific product and users.

Common Mistakes

Mistake 1: Treating AI Like a Search Engine

Prompt: "Help me find a Node.js library for handling subscription payments"

This is not vibe coding. This is searching with extra steps. AI can give you a list of library names, but it cannot tell you which one is right for your specific situation, your existing codebase, and your future maintenance capacity.

The right approach: describe the problem you are trying to solve and ask AI to both recommend a solution and implement it.

Mistake 2: Trusting AI First Response Too Much

The AI first answer is typically 60% of the way there. The remaining 40% comes from iteration.

Do not expect perfect output in one prompt. Do not try to write the perfect prompt that produces perfect code in one shot. Write an adequate prompt, look at the output, identify what is wrong or incomplete, and ask for improvements.

Mistake 3: Not Giving AI Sufficient Context

"Optimize this database query"

AI does not know how much data you have in that table. It does not know what your latency requirements are. It does not know what indexes already exist or what your team conventions are around query optimization.

Give AI context: "Optimize this database query. Current table has 50,000 rows and is growing at approximately 1,000 rows per day. We need sub-100ms response times for this endpoint under normal load. Here is the current query and the PostgreSQL EXPLAIN ANALYZE output."

Mistake 4: Letting AI Generate Code You Cannot Explain

This is the biggest risk in vibe coding. You generate code quickly, it works in testing, you ship it. Six months later, something breaks. You open the code, stare at it, and have no idea what it does or how to debug it.

My rule: if I cannot explain a piece of code to a junior developer in five minutes, it does not go into my codebase.

What Works and What Does Not

Vibe coding excels at:

  • CRUD features with clear business logic
  • Test generation for existing code
  • Documentation drafting from code
  • Refactoring well-understood code to new patterns
  • Data migration scripts where you know the mapping
  • Boilerplate for new features
  • Debugging specific error messages
  • Code explanation for unfamiliar libraries

Vibe coding struggles with:

  • Novel architectural decisions — AI is conservative and recommends the most common approaches, which are often wrong for novel situations
  • Security-critical code — AI code has higher vulnerability rates than expert-written code
  • Performance optimization in high-concurrency scenarios — AI generates code that works but may not perform at scale
  • Deep domain knowledge that AI does not have

Honest Risk Warning

Vibe coding has real risks. I want to be explicit about them.

Risk 1: You stop understanding your own codebase. If you are not careful, your codebase becomes a collection of AI outputs you do not fully understand. When something breaks at 2 AM, you are helpless because you cannot debug code you do not understand.

Risk 2: AI-generated code has biases. AI models are trained on existing code, which contains all the biases, outdated patterns, and non-optimal solutions of the programming ecosystem. I have seen AI generate code using a library that was deprecated three years ago. I have seen AI generate code using a pattern that was an anti-pattern in 2015. I have seen AI generate code that works in a small startup context but would fall apart at scale.

Risk 3: You lose the ability to code without AI. I have seen developers who became completely dependent on AI to write any code. When Cursor was down for maintenance one evening, one of these developers literally could not do anything. They sat staring at a blank editor, unable to start without AI assistance. Do not let that be you.

Risk 4: Technical debt compounds at 10x speed. AI writes code quickly. Bad architecture also gets built quickly when you are using AI. You can build a spaghetti codebase at 10x the speed you could before. Enforce architectural discipline even when using AI.

When NOT to Use Vibe Coding

When extreme performance is critical: AI-generated high-concurrency code might not be as performant as code written by an experienced engineer with your specific load profile in mind. I have seen AI generate code that works for 100 users but would fall over at 10,000.

When deep security auditing is required: financial, medical, or regulated applications need expert security review. AI can help write the code, but it cannot replace security expertise.

When you are learning a new technology: if you are learning Rust for the first time, using AI to generate Rust code will skip the most valuable part of the learning process — understanding why Rust works the way it does. Use AI to supplement learning, not replace it.

When the problem is ambiguous: vibe coding works best when the problem is well-defined. If you do not know what you want to build, AI cannot help you figure it out.

The Specific Prompt Structures I Use

Over two years of vibe coding, I have developed specific prompt structures that work well for different types of tasks.

The Feature Prompt Structure

When I need a new feature, my prompt structure is:

Context: [what this feature does and why it matters] Existing code: [relevant code snippets from my codebase] Tech stack: [specific libraries and versions] Requirements: [numbered list of specific requirements] Edge cases: [numbered list of edge cases I know about] Constraints: [any performance, security, or style requirements]

This structure forces me to think through the feature before prompting. It also gives AI the context it needs to produce useful output.

The Debug Prompt Structure

When debugging, my structure is:

Error: [exact error message and code] Context: [what the code is trying to do] What I have tried: [steps I have already taken] Environment: [relevant system information]

Claude has consistently found root causes faster when I use this structure.

The Refactor Prompt Structure

When refactoring, my structure is:

Current code: [the code to refactor] Goal: [what the refactored code should achieve] Constraints: [what must not change — behavior, API surface, performance] New patterns: [any patterns I want to enforce]

This structure prevents AI from changing behavior while refactoring, which is the most common failure mode of AI-assisted refactoring.

How to Evaluate AI Code Quality

Not all AI-generated code is equal. Here is how I evaluate quality:

Readability: Can I understand this code without external context? Good AI code is readable. Bad AI code is clever.

Consistency: Does this code use the same patterns as the rest of my codebase? AI often generates code that is internally consistent but inconsistent with existing conventions.

Simplicity: Is this the simplest solution that works? AI tends toward complex solutions. If a simpler approach exists, AI may not find it.

Safety: Are there obvious security issues? SQL injection, hardcoded secrets, missing error handling? AI code often has subtle security issues.

Testing: Does this code have obvious edge cases that are not handled? AI generates happy-path code more readily than robust code.

I run through these criteria for every significant piece of AI-generated code.

The Specific Code I Would Not Let AI Write

There are categories of code I write myself, always:

Authentication and authorization: AI-generated auth code has subtle vulnerabilities. I write this myself or use established libraries with minimal AI assistance.

Payment processing: Stripe integrations, refund logic, subscription management. AI-generated payment code can have serious business consequences if wrong.

Security-sensitive operations: Password handling, token generation, encryption. AI has a poor track record on security code.

Complex database queries: AI generates SQL that works but is not optimized. I write complex queries myself or review AI-generated SQL carefully.

Anything involving race conditions: Concurrency code is notoriously hard. AI often generates code that looks correct but has subtle race conditions.

For everything else, AI helps. For these categories, AI assists but I review heavily.

How AI Changed What I Actually Build

Before AI, I had a mental filter for what I would attempt to build. If a feature seemed too complex, I would simplify it or skip it. After AI, that filter is different — I attempt things now that I would have avoided before.

Example: webhook handling. Before AI, I had never built a webhook processing system because it seemed complex. Stripe webhooks require signature verification, idempotent processing, retry logic, error handling, and logging. Each of these is a separate problem to solve.

After AI: I described what I wanted to Claude. It generated a working implementation in 20 minutes. I reviewed it, understood it, and shipped it. The mental filter changed from "too complex to attempt" to "complex but doable."

This is the real productivity gain from vibe coding: not just faster execution, but a lower threshold for attempting difficult things.

The Difference Between Vibe Coding and Traditional Pair Programming

I have done pair programming with colleagues. Vibe coding is different in important ways.

Pair programming: two humans, both capable of independent judgment, collaborating in real time. The junior learns from the senior. The senior catches the juniors mistakes. Communication is bidirectional and immediate.

Vibe coding: one human, one AI, asynchronous collaboration. The human has judgment. The AI has no judgment but can execute quickly. Communication is mostly unidirectional — human describes, AI implements, human reviews.

The key difference: vibe coding requires the human to have judgment that pair programming does not. In pair programming, the junior can defer to the senior on hard decisions. In vibe coding, there is no senior to defer to.

This is why vibe coding is not for everyone. It works best when you already know how to build things and just need help building them faster.

The Future of Vibe Coding

I expect vibe coding tools to improve significantly over the next two years. What I expect:

Better context awareness: AI will maintain context across sessions, understanding your codebase as a whole rather than individual files.

Better architectural reasoning: AI will get better at suggesting structural improvements, not just implementing individual features.

Better code review: AI will catch more issues in generated code, reducing the review burden.

The fundamental limitation — AI has no judgment — will remain. The tools will get better at execution. The human will remain responsible for strategy.

vibe codingAI programmingindie devtooling

I write Makerloop weekly — building with AI, career growth, and learning in public. Subscribe →

Did this article help you? If you're working through career direction, or want to use AI to work smarter, let's talk — I'm happy to help you think it through.

Let's talk →