The Vibe Coding Workflow That Actually Ships
My five-step vibe coding loop in detail: context discipline, prompt shapes, when to interrupt an agent, and the cleanup rhythm that keeps a codebase sane.
The five-step loop — describe the product, demand a plan, generate small chunks, review with taste, ship — is the skeleton. This guide is the muscle: the small, unglamorous habits that decide whether vibe coding makes you faster or just busier.
Everything here comes from shipping real products solo. None of it requires talent. Most of it requires discipline, which is more annoying.
Feed the context, don’t apologise for it
The single biggest efficiency lever is what the AI knows before it starts. An agent that has seen your data model proposes features that fit it. An agent that hasn’t will confidently invent a second, slightly different data model, and you’ll spend the afternoon negotiating a peace treaty between the two.
Practically, that means:
- Keep a project rules file that states the stack, the conventions and the forbidden moves (“never write to
bookingsoutsidefunctions/bookings.ts”). Write it once; it pays rent forever. - Point at real files. “Like the leads drawer in
LeadDrawer.tsx, but for bookings” beats three paragraphs of abstract description. - State what already exists. Half of AI-generated duplication happens because the model didn’t know there was already a
useDebouncehook. Tell it.
Give prompts a shape
My feature prompts have converged on the same four lines, whether it’s for TaskMondo or a game prototype:
- Who: who uses this and on which platform.
- What: what they must be able to do, concretely.
- Never: what must not happen (touch other modules, add dependencies, mutate X).
- Exists: which data, hooks and components are already there to build on.
Four lines. Thirty seconds. It reliably saves the half hour where the AI builds a beautiful feature next to the one you needed.
Interrupt early, and without guilt
Watching an agent go down the wrong path and letting it finish “to see where it goes” is a sunk-cost trap with syntax highlighting. The moment a plan or diff shows a misunderstanding — wrong layer, new dependency, sudden service class — stop it, correct one assumption, restart. Correcting after step one costs a sentence. Correcting after step nine costs a refactor.
The reverse habit matters too: when the diff is good, take it and move. Don’t re-prompt for a slightly more perfect version of code you’ve already decided to rewrite by hand in the taste pass anyway.
Keep diffs reviewable, keep sessions short
I aim for changes I can hold in my head: one component, one hook, one query. When a session drags past the size of my attention, the review quality collapses — and unreviewed AI code is where the real problems breed. Long agent sessions also accumulate context drift: the model’s picture of your codebase slowly diverges from the actual codebase, like a colleague who stopped listening ten minutes ago but keeps nodding.
Ship the chunk. Start fresh. Fresh sessions are cheap; untangling drift is not.
The cleanup rhythm: build fast, stop, tighten
Every few features, I stop building and spend a session only tightening: consolidate near-duplicate components, cache the queries that got copy-pasted, narrow the types that quietly became any’s roommates, delete the dead ends. AI is a phenomenal builder and a terrible janitor — it will happily stack new floors on scaffolding it forgot it erected.
This rhythm is the difference between a codebase that compounds and one that only accumulates. “Build fast forever” ends with a codebase understood by you, two AI models and possibly a priest.
Automate your own taste
Anything you correct twice, encode: a lint rule, a type, a line in the rules file, a snippet in the prompt. The goal is for the AI’s first draft to drift steadily closer to what your taste pass would have produced anyway. My drafts today start far closer to done than a year ago — not because the models improved (they did), but because the guardrails around them kept accumulating.
That’s the whole secret, honestly. The loop stays the same; the guardrails compound. If you’re picking tools for it, start with my stack and how I choose models in Cursor.