In this article
- The common mistake is asking AI to build the whole thing
- Vibe coding works best when the shape is clear
- Fresh files matter more than clever prompts
- Full replacement files are often safer than snippets
- Small patches beat big rewrites
- The boring system is what makes vibe coding usable
- The best prompt is usually plain
- The AI is great at momentum
- It gets bad when the AI drives without supervision
- Visual building works well with AI
- AI makes me more ambitious, but also more cautious
- Vibe coding is not the same as not knowing what you’re doing
- The real skill is knowing what to ask for next
- A practical vibe coding workflow
- What to watch out for
- How I test AI-generated changes
- Final takeaway
Vibe coding is real, useful, and probably one of the better things to happen to solo builders in the last few years.
It can help you move faster, get past the blank page, build rough versions of ideas, and push through the boring middle of a project.
But it isn’t magic.
The best version of vibe coding is not:
Tell the AI to build an app and hope for the best.
That usually produces something that looks impressive for about five minutes, then slowly reveals itself as a nice-looking mess.
The better version is more controlled.
You bring the idea, the direction, the current files, and the judgement. The AI brings speed. Then you test the result like it might be wrong, because sometimes it is.
That’s the part people skip when they talk about AI coding tools.
They’re very good at momentum, scaffolding, boilerplate, layout changes, and helping you keep going. They’re much less reliable when you let them become the product manager, developer, designer, architect, and QA tester all at once.
Used well, vibe coding can be a huge advantage for solo builders.
Used badly, it turns into code soup with a confident explanation attached.
The common mistake is asking AI to build the whole thing
The biggest mistake I’ve made with vibe coding is also the most tempting one: asking for too much at once.
It usually starts with something like:
Build me an app that does this.
or:
Add this whole feature.
or:
Refactor this section and improve the UI while you’re there.
The result can look impressive at first. You get pages, buttons, panels, maybe a dashboard, maybe some nice spacing. It feels like progress because there’s something on the screen.
Then the problems start showing up.
The AI invents structure. It invents assumptions. It invents missing pieces. It changes patterns that were already working. It quietly removes something important. It builds a feature that looks finished but doesn’t actually fit the product.
That’s the trap.
The danger isn’t always broken code.
Sometimes the danger is building the wrong thing faster.
AI coding tools are good at producing output. They’re not automatically good at knowing what should exist.
That job still belongs to the builder.
Annoying, yes. Still true.
Vibe coding works best when the shape is clear
I don’t need to know every line of code before I ask for help.
That would defeat the point.
But I do need to know the shape of the thing.
I need to know what the page is for. I need to know what the user should do next. I need to know what should be visible, what should stay hidden, what should not be built yet, and what “done” means for this step.
When I can answer those questions, AI coding becomes much more useful.
The better workflow sounds plain, but it works:
Here is the current file. This page already works. I only want to move this panel below the summary section. Keep the existing data logic intact. Return the full modified file.
That doesn’t sound like a futuristic agent building software while you drink coffee.
But it’s the version that actually works.
The AI is much better when it has a clear job, current context, and a small target. It can still make mistakes, but the mistakes are easier to spot because the task is narrow.
Vibe coding gets worse when the assistant has to guess.
The more it has to invent, the more likely it is to create problems.
Fresh files matter more than clever prompts
One of the most boring but important lessons I’ve learned is this:
Always give the AI the current file.
Or, when possible, the current codebase.
A lot of weird AI coding mistakes happen because the assistant is working from memory, old snippets, partial context, or an imaginary version of the project. It confidently edits code that doesn’t exist anymore. It refers to functions that were renamed three changes ago. It gives you a tiny replacement for a large file and acts like nothing important was lost.
That’s why my current workflow is boring but effective.
I give the AI a fresh file or fresh ZIP. The AI edits that exact version. It returns full replacement files. I overwrite locally or on the server. I test. Then I commit with GitHub Desktop.
This sounds slower than saying “just patch it,” but it usually saves time because I’m not hunting strange bugs caused by missing context.
Vibe coding without current files is basically gambling.
Sometimes it works.
Sometimes it gives you a 20-line replacement for a 700-line file and politely pretends everything is fine.
Full replacement files are often safer than snippets
Snippets can be useful, especially for small examples or when you know exactly where something belongs.
But for real project work, I usually prefer full replacement files.
Full files reduce copy-paste ambiguity. I don’t have to guess whether a block goes above this function, inside that condition, or before some closing tag halfway down the file. They also make the AI account for the wider structure, instead of throwing a patch into the void.
The important instruction is simple:
Return the full modified file and keep everything else intact.
That one sentence does a lot of work.
It tells the AI not to redesign the whole thing. It tells it the existing file matters. It tells it the goal is a controlled change, not a creative rewrite.
This is one of those practical habits that sounds small until it saves you an afternoon.
And I am very much in favour of saving afternoons.
Small patches beat big rewrites
The AI is much better when I ask for one focused change at a time.
Moving a panel works. Adding sorting to a table works. Creating a new page using the existing layout works. Updating copy works. Moving inline CSS into the stylesheet works. Adding a small trust signal under a recommendation works.
That kind of work suits AI coding tools well.
The task is clear, the output is easy to check, and the risk is contained.
Big rewrites are where things get risky.
A big rewrite gives the AI too many chances to misunderstand the routing, duplicate logic, break a view, rename something important, remove a working pattern, or “clean up” code that was already doing its job.
The issue isn’t that AI can never handle bigger jobs.
Sometimes it can.
The issue is that the cost of checking the work becomes too high.
A small change is easy to test. A large rewrite turns you into the assistant’s debugger. Now you’re not building your product. You’re trying to figure out what the AI changed, why it changed it, and which bit broke the thing that worked an hour ago.
That’s not momentum.
That’s a side quest.
And side quests are only fun when they’re optional.
The boring system is what makes vibe coding usable
The fun part of vibe coding is the fast building.
The boring part is what makes it safe.
My basic system is simple:
- keep a working copy
- make one change at a time
- test after each patch
- commit when it works
- don’t let the AI touch environment files unless there’s a very good reason
- don’t accept partial snippets when full files are safer
- don’t assume the AI understands the project just because it sounds confident
None of this is glamorous.
It’s not the part people show in demos.
But this is the part that keeps the project from turning into a pile of almost-working files.
AI coding tools make it easier to move quickly, which also means they make it easier to make a mess quickly.
The boring system is the guardrail.
Without it, vibe coding becomes code soup.
The best prompt is usually plain
I don’t think the best AI coding prompt is a massive magic spell.
The useful version is usually very plain:
Here is the current file.
Here is what I want changed.
Keep everything else intact.
Return the full modified file.
Add comments around the changed section if useful.
Do not rewrite unrelated code.
That’s enough for a lot of tasks.
The point isn’t to sound technical.
The point is to remove ambiguity.
A vague prompt gives the AI room to invent. Sometimes invention is useful. In coding, it’s often where bugs come from.
This is especially true when working with an existing project.
The AI needs to understand that the current structure is not optional decoration. There may be routing decisions, database assumptions, CSS patterns, naming conventions, and weird little fixes that exist for a reason.
A good prompt tells the assistant where the fence is.
Inside the fence, it can help.
Outside the fence, it needs to leave things alone.
The AI is great at momentum
For all the warnings, I don’t want to undersell the useful part.
AI coding tools are very good at momentum.
They help get past the blank page. They help turn a rough idea into something visible. They can draft a page, a component, a SQL query, a small script, a layout, a form, or a workflow much faster than starting from nothing.
They’re also useful when I’m tired and know what I want but don’t feel like manually typing everything out.
That matters more than people admit.
A lot of small web projects don’t die because the idea is bad. They die because the boring middle takes too long.
You get stuck on a layout, a repetitive form, a small admin screen, some fiddly table behaviour, or a bit of wiring that isn’t hard, just annoying.
AI helps push through that.
Not perfectly. Not safely without checking. But enough to keep going.
For solo builders, that’s a big deal.
Momentum is often the difference between:
I should build this someday.
and:
I’ve got a rough version running.
That is not a small difference.
It gets bad when the AI drives without supervision
The bad version of vibe coding is when I let the AI become everything at once.
It becomes the project manager, developer, designer, product owner, architect, and QA tester. That’s when it starts making strange choices.
It adds features I didn’t ask for. It rewrites wording that was already good. It creates new patterns instead of following existing ones. It solves the wrong problem elegantly. It makes everything look finished while quietly skipping the important bit.
This is why I think AI coding tools need a short leash.
Not because they’re useless.
Because they’re powerful enough to create a lot of work very quickly.
A junior developer who moves slowly gives you time to catch misunderstandings. An AI assistant can misunderstand the task and produce six files before you’ve finished your coffee.
That speed is useful, but only when the direction is clear.
Speed in the wrong direction is still wrong.
Just with nicer indentation.
Visual building works well with AI
I’ve also learned that I work best when I can see the thing.
I build a bit, refresh the page, look at it, move things around, ask for a change, and test again.
That loop suits me better than trying to plan everything in abstract technical terms.
The AI can help with the code, but my judgement often kicks in properly when I see the interface. I’ll notice that a panel is in the wrong place, the hierarchy is off, the table is too dense, the call-to-action isn’t obvious, or a feature I thought mattered doesn’t actually help.
Sometimes I don’t know what I want until I see what I don’t want.
That’s not a failure.
That’s just how visual building works.
This is one reason screenshots, live previews, and small UI changes are so useful when working with AI. You can move quickly, but still make decisions based on the actual product instead of a vague idea in your head.
For me, this is where vibe coding feels most natural.
Not as “AI builds the whole app.”
More like:
I steer, it moves fast, I look, I correct, we keep going.
That’s a much better loop.
AI makes me more ambitious, but also more cautious
AI has definitely made me more willing to start projects.
A few years ago, some of the things I’m building now would have felt too big to bother with. Not impossible, exactly. Just big enough that I probably would have put them in the “later” pile forever.
Now I can get something running much faster.
That’s the good side.
The caution is that it’s also much easier to create technical debt without noticing.
The first version is easy. The tenth version is where structure starts to matter. The twentieth version is where you find out whether those earlier shortcuts were actually shortcuts or just delayed pain.
That’s why I’m more ambitious now, but also more careful about workflow.
I’ll happily use AI to move faster.
But I’m much less willing to let it make broad changes without a clear reason.
That feels like the healthier way to use these tools.
Not anti-AI.
Not AI worship.
Just using the tool without letting it drive the bus into a hedge.
Vibe coding is not the same as not knowing what you’re doing
There’s a version of the vibe coding conversation that makes it sound like the whole thing is just randomly prompting until something works.
That can happen.
It’s not the good version.
The better version is closer to guided building.
I may not write every line myself, but I’m still making the decisions. I’m still testing. I’m still deciding whether the output fits the product. I’m still responsible for what gets deployed.
That responsibility part matters.
If the app breaks, “the AI wrote it” doesn’t help the user. It doesn’t fix the bug. It doesn’t make the product safer. It doesn’t make the database design better.
AI can assist, but the builder still owns the result.
The way I think about it now is simple:
The AI is part assistant, part accelerator, part very fast junior developer that sometimes forgets what project it’s working on.
Useful, yes.
Trustworthy without review, no.
The real skill is knowing what to ask for next
A lot of vibe coding skill isn’t really about code.
It’s about knowing the next useful move.
Not the biggest move.
Not the most impressive move.
The next useful one.
That might be cleaning up the header. It might be fixing table spacing. It might be adding a small trust signal. It might be making a page easier to scan. It might be moving repeated code into shared files. It might be adding one feature that supports the main loop.
Or it might be stopping and writing the workflow down.
That last one is easy to ignore, but it matters. Sometimes the best next step is not more code. Sometimes it’s documenting how the thing works so you can keep building without losing the plot.
AI makes it very easy to keep generating.
But building a useful product is not the same as generating more code.
The real skill is knowing when to ask for another patch, when to test, when to commit, when to refactor, and when to stop.
Especially that last one.
Rude little skill, but important.
A practical vibe coding workflow
The workflow I trust most right now starts with one small change.
I don’t ask for a whole project phase if I can avoid it. I ask for one clear improvement.
Add sorting to this table. Move this section below the summary card. Make this page use the same layout as the existing dashboard. Fix this error without changing the data model.
Small requests produce work I can actually review.
The next part is giving the AI the current file or codebase. I don’t want it guessing. If the change touches one file, I give it that file. If it touches multiple parts of the project, I give it a fresh ZIP. Old context creates weird bugs.
Then I set boundaries.
I tell the assistant what not to touch:
- don’t change the database queries
- don’t rename existing functions
- don’t modify the routing
- don’t change CSS class names unless required
- keep the existing layout pattern
This is where a lot of AI coding prompts improve.
Not by being clever.
By being clear about the edges.
For many project changes, I ask for full replacement files. I’ll say something like:
Return the full modified file only.
or:
Return each modified file in full, with the file path above it.
That makes the update easier to apply and easier to review.
Then I test immediately.
I don’t stack five AI changes before checking the first one. I apply the patch, refresh the page, run the script, check the form, look at the console, and try the obvious failure cases.
AI output should be treated as a draft, not a finished product.
Once the change works, I commit it.
That gives me a safe point to return to if the next patch goes wrong.
Vibe coding feels much less risky when I know I can roll back.
What to watch out for
The main thing to watch for is confidence.
AI coding tools are very good at sounding sure.
They’ll explain a change clearly even when the change is wrong. They’ll sometimes remove important code and describe the result as a simplification. They’ll make broad assumptions and present them like obvious decisions.
So I try to watch for warning signs.
If the AI changes files I didn’t ask it to change, I slow down.
If it rewrites working code without a clear reason, I check carefully.
If it introduces new patterns instead of following existing ones, I ask why.
If the patch is much larger than the request, I get suspicious.
If it says something is “cleaner” but the product behaviour changed, I don’t accept that as a win.
Clean code is nice.
Working product behaviour is nicer.
How I test AI-generated changes
Before trusting an AI-generated change, I check the basics.
- Does the page still load?
- Does the changed feature actually work?
- Did anything unrelated change?
- Did the AI remove existing behaviour?
- Did it rename functions, routes, classes, or variables unnecessarily?
- Does the UI still match the rest of the app?
- Does the change work with real data, not just ideal data?
- Are there obvious edge cases?
- Have I committed the last working version?
This doesn’t need to become a huge formal process for every tiny tweak.
But the habit matters.
AI is fast enough that a little testing discipline saves a lot of pain later.
Tiny checklist. Big relief.
Final takeaway
Vibe coding is real, useful, and very easy to overhype.
It works best when you treat the AI as a fast assistant, not the person in charge of the project. You still need to bring the idea, the direction, the current files, and the judgement. The AI can bring speed, but speed only helps if you’re pointing it at the right problem.
For me, the best version is simple: I give the AI a clear task, keep the change small, test the result like it might be wrong, and only move on when I understand what changed.
Because sometimes it is wrong. Sometimes confidently. Sometimes with lovely formatting.
When that loop is working, vibe coding feels less like magic and more like having a very fast workshop assistant. Not someone who owns the product. Not someone who decides what the project should become. Just a useful helper that makes it easier to build small things on the web without getting stuck for days on every awkward little detail.
That’s enough.
Actually, that’s quite a lot.