I’ve been vibe coding apps and websites that I would actually use myself.
Usually, the first version is full of broken things.
This time I changed the process.
Instead of throwing a prompt directly at the coding agent, I first used ChatGPT to write a proper design spec. Then I had Claude Opus 5 implement the frontend.
Once I was happy with the direction, I spent around 50 minutes with ChatGPT Web defining exactly how I wanted the app to be built:
• project structure
• component boundaries
• where files should live
• how APIs should be called
• linting rules
• quality gates
• verification before marking work complete
• mandatory TDD
• independent code review
And one more important rule:
After all of that passed, a separate QA agent had to open the app in a real browser and verify the feature that was just implemented.
The difference in quality was ridiculous.
The app worked.
Roughly 90% of the functionality worked as expected on the first proper run. The project structure matched what I had specified. Components were where they were supposed to be. The architecture, tests, verification and QA process were actually followed.
And here’s the interesting part.
The frontend was built with Opus 5, but most of the rest was Composer 2.5 Fast.
I burned through both my X Premium+ and Cursor Start limits 😂
Composer got roughly 70% of the project done.
The remaining work was finished with DeepSeek V4.1 Flash through OpenCode Go.
The biggest lesson for me:
The model matters, but the process around the model matters a lot more.
Give an agent a vague prompt and you get vibe-coded software.
Give it a spec, architecture, tests, quality gates, code review and browser-based QA, and suddenly it starts looking a lot more like software engineering.