If you want the definition and where the term came from, the guide covers that. This piece is about the tools, and about the one thing that decides whether any of them work for you.

Because the tools are the easy part. What decides whether you end up with a working product or an unmaintainable pile is not which one you picked.

The tools, by what you are making

MakingReach forWhy
A web app from nothingPrompt-to-app buildersThey own the scaffolding, hosting and database, so there is nothing to set up before you see something.
A change to something that existsAn agent in your editor or terminalBuilders are weak here. Agents read the code around the change first.
A script or automationA terminal agentIt can run the thing it just wrote, which is most of the work.
A document, deck or datasetAn agent that is not code-onlyMuch of what people vibe-code is not code, and a code-first tool will treat a spreadsheet as an afterthought.
Something with real usersAny of the above, plus testsWhatever you were going to use, plus something that can verify the result.

The cliff

Vibe coding works beautifully up to a point and then stops working rather suddenly. The point is not a number of lines. It is the moment you can no longer tell whether a change broke something.

PROGRESS SIZE OF WHAT YOU HAVE BUILT YOU CAN NO LONGER TELL IF IT STILL WORKS FAST EVERY CHANGE BREAKS TWO THINGS
The cliff is not complexity. It is the loss of verification.

Before that line, the model writes, you glance, it works, you move on. After it, every change breaks something you did not look at, and because you did not read the code you have no map of what depends on what. Progress does not slow down - it reverses.

What is the fix, if you still do not want to read the code?

Tests. Not because tests are virtuous, but because a test is the only way to keep a verification signal when you have given up reading. It replaces "I understand this code" with "the machine can tell me if I broke it", which is exactly the thing vibe coding removed.

The right time to start is before the cliff, and the tests do not have to be yours - "write tests for what this currently does" is a good instruction, and it works better than it sounds because the behaviour is already there to be described.

What good vibe coding actually looks like

  1. Describe the outcome, not the implementation. "Users can reset their password by email" beats "add a POST endpoint that...". You are buying judgement; do not spend it specifying.
  2. Keep the loop closed. Something must be able to say "this works" - a test, a build, a page you can open. Without it you are not vibe coding, you are hoping, and this is the failure it produces.
  3. Commit constantly. Your undo is git, not memory. This costs nothing and saves entire afternoons.
  4. Read the interfaces, skip the bodies. Knowing what talks to what is enough of a map. You do not need to read every function to stay oriented.
  5. Stop and reset when it drifts. When the agent starts fixing its own last fix, the context is poisoned. Start a new thread and describe the current state fresh. If you are new to all of this, the loop is worth understanding first.
A Jenga tower still standing with several blocks removed and set beside it.
Every block that comes out makes the tower faster to build and harder to trust. Vibe coding is this game. Photo by Valery Fedotov on Unsplash

Did that land?

Three questions.

What marks the point where vibe coding stops working?

Why do tests matter more in vibe coding than in ordinary coding?

The agent starts fixing bugs introduced by its own previous fix. What is the right move?

Sources

  1. Andrej Karpathy, post coining "vibe coding", 2 February 2025.
  2. Merriam-Webster added "vibe coding" to its slang and trending words, 2025.

An agent that runs your checks

W1 runs the tests and reports what passed - which is the signal vibe coding needs most. Free during beta.

Download free beta