Vibe Coding, Revisited: From Weekend Chaos to Repeatable Craft
A sequel to “10 Ways to Vibe Code"
A few weeks ago we celebrated vibe coding as fast, loose sketching in code, perfect for experiments but perilous for production. Since then I have been dissecting Tom Blomfield’s recent YC talk1. His lessons do not contradict the original ethos; they extend it. Think of this article as Part II, showing how to keep the vibes and still ship something you are willing to maintain.
Start with a Plan/Spec, even for vibes
Tom spends the first ten minutes hammering one point: write a plan with the LLM before you touch a file.
A lightweight PLAN.md
, co‑authored with the model, gives you:
a north star
a backlog of won’t‑dos that stay out of your diffs
a checkbox list you can tick off after each green test run
Keep the plan malleable. Strike out tasks with strikethrough rather than deleting them; the paper trail reminds you why an idea was deferred.
Git is Your Reset Button
Use version control religiously, and commit everything that works. Then if you’re stuck in a loop with the LLM then git reset --hard HEAD
is the escape hatch2. Every time the LLM guesses wrong three times in a row, nuke the branch and replay the single good attempt on a clean slate. You trade history for clarity, the right bargain when the code is clay rather than contract.
Test Driven Development on Steroids
Humans craft the test cases(in the spec), LLMs write the implementation. Make the tests end‑to‑end (click a button, expect JSON). With that harness in place you can:
ask the model to refactor without fear
detect collateral damage the moment you suspect hallucination
treat every passing commit as a checkpoint for more experiments
Structured Debugging Loops
The fastest bug‑hunt recipe from the talk:
Paste the raw error (no explanation) into chat.
If the model fixes nothing in two cycles, run
git reset
and try a different model, whether Claude, GPT‑4.1 or Gemini.Once a fix emerges, replay it on the pristine branch.
Discarding partial progress prevents the barnacle effect, layers of half‑thought patches that neither you nor the AI can reason about later.
Expand the Model’s Context Locally
Online docs can be flaky. Instead, download API docs into /docs
and tell the agent, “read before coding.” Pair that with a project‑specific instruction file (cursor‑rules.json
, .windsurf.md
and so on). Several YC founders maintain 300‑line rulebooks and claim a three‑fold speed‑up once the groundwork is done.
Stack Choice Still Matters
Popular languages like Python, Java, JavaScript, and frameworks like Rails, React shine because decades of convention feed the training sets. Rust, Zig, and Elixir less so, at least for now. Pick a stack the model already knows unless learning the hard way is the goal.
Input Tricks: Screenshots and Voice
Screenshot UI bugs or inspiration and paste them directly; models diff pixels better than prose.
Dictate prompts with Aqua or macOS Voice Control. One‑hundred‑forty words per minute beats even a fast typist, and punctuation errors barely matter.
Refactor, Rinse, Repeat
When the tests pass, ask the model to spot duplication and compress it. Smaller files lead to clearer vibes and better future prompts, letting momentum snowball.
Where Does That Leave Our Original Rules?
The vibe remains improvisational, but now there is a backstop of professional practice. Call it structured chaos.
Vibe coding was never meant to replace engineering rigour; it was meant to lower the cost of curiosity. Tom’s tactics show how to preserve that creative spark while quietly adding the scaffolding that stops a weekend project from collapsing under its own entropy.
As always, share your war stories and counter‑tips. Our collective vibe only gets sharper.
Link to YT talk
`git reset —hard HEAD` means resetting the current branch to the most recent commit.