Studio of One ¡ Part 2
Vibe Coding Gets You a Demo. This Gets You to Production
Bolt, Lovable, and vibe coding get you a demo fast. Shipping a real system takes agentic practices: specs, checks, guards, and review. Here are the ones I use.
Josh McWilliam
7 min read
- vibe-coding
- production
- claude-code
- agentic-systems
- platform
I vibe code.
I want to say that up front, because this post is going to sound like an argument against it, and it isnât. Andrej Karpathy named the practice in a post on X in February 2025: you âfully give in to the vibes, embrace exponentials, and forget that the code even exists.â By the end of the year Collins had made it their word of the year. Itâs the fastest way I know to find out whether an idea is worth building.
It is also, in my experience, the fastest way to end up with a demo you canât ship. The difference between the two outcomes isnât the tool. Itâs what you do around it.
Fair credit first
The prompt-to-app builders are genuinely good at what theyâre for. Describe an app and you get screens, forms, a data model, basic sign-in, and a deploy button, usually on top of a hosted backend. What used to take a weekend takes an afternoon.
For a demo, thatâs not the first 20% of the work. Thatâs the whole thing. If the goal is to show someone what you mean, or to find out whether anyone cares, use the fastest tool and donât apologize for it.
The trouble starts when the demo works and you decide to keep it.
Where the demo stops
Hereâs the line I keep hitting, in roughly the order I hit it. None of this is a knock on the tools. Itâs a description of where âan appâ turns into âa system.â
Authorization beyond login. Sign-in is easy. Roles, organizations, âthis user can see that record but not edit it,â and multi-tenant data are where the generated code starts guessing, and a wrong guess here is a security hole.
Background work. Anything scheduled, queued, retried, or long-running. Demos are request-and-response. Businesses are mostly things that happen when nobodyâs looking.
Integrations that fail. The first call to a payment provider or an email API works. The tenth, when the provider times out and you need idempotency so a customer isnât charged twice, is a different problem.
Data that changes shape. The moment the model needs to change under real records, you need migrations, and a builder that regenerates the schema from a prompt is a builder that will lose your data.
Observability. When it breaks, and it will, can you tell what happened? Demos donât need logs. Anything with a customer does.
The second developer. For me thatâs future me, six months on, opening a codebase I didnât write. Generated code with no structure and no tests is unreadable by anyone, including the person who prompted it.
Tests. Not because tests are virtuous. Because tests are how an agent knows itâs done, which is the whole subject of the second half of this post.
The pattern is that vibe coding is superb at the part of the system you can see and weak at the part you canât. Unfortunately, the part you canât see is most of a business.
Speed isnât automatic
Iâd be cheating if I told you that switching to âagenticâ tools fixes this by itself. The evidence says it doesnât.
In July 2025, METR ran a randomized controlled trial with sixteen experienced open-source developers working in their own large repositories. With AI tools allowed, they took 19% longer to finish tasks. They had expected to be 24% faster. Afterwards, they still believed theyâd been about 20% faster.
The 2024 DORA report found something similar at the organizational level: AI adoption improved individual productivity and satisfaction while hurting software delivery throughput and stability. Its advice was the least glamorous kind: small batches, robust testing.
I believe both of those findings, and I also ship more alone than I used to ship with a team. The reconciliation is that the gain doesnât come from the tool. It comes from practice around the tool that makes checking faster than doing. Without that practice, agents just generate wrong code faster, and you become the verification loop.
The practices, with receipts
Everything below is something I actually do, with the artifact from the studio that proves it. Iâve linked to whatâs public.
1. Write the spec before the build
For a small change, I just do it. For anything that touches more than one file or one decision, I write down whatâs changing, why, and, most importantly, what Iâve decided not to claim or build. When this site was repositioned in early September, that was a spec with a decision table: whatâs live, whatâs coming soon, whatâs out of scope.
Anthropicâs own guidance for Claude Code says the same thing in fewer words: explore first, then plan, then code. Letting the agent jump straight to building âcan produce code that solves the wrong problem.â It can. Iâve watched it.
2. Work in phases with a check between each
The studioâs method has five phases: Frame, Architect, Build, Evaluate, Release. Thatâs the workflow the Faber tooling encodes, and itâs how every change here ships. The important word is âbetween.â The agent that builds a thing is not the one that decides itâs done.
3. Give the agent a check it can run
This is the single practice Iâd keep if I could only keep one. From the same Claude Code guidance: âGive Claude a check it can run: tests, a build, a screenshot to compare. Itâs the difference between a session you watch and one you walk away from.â
For this site, the check is a type check, a full build, a content guard, and a link checker, all behind one command. The agent runs it, reads the failure, fixes the failure, runs it again. I only look when it passes. The guidanceâs other line is the one Iâd tattoo somewhere: âIf you canât verify it, donât ship it.â
4. Turn your past mistakes into build failures
The content guard deserves its own paragraph. Itâs a short script that scans every generated page for strings that must never appear: a name Iâve decided not to use, a claim Iâve decided not to make, a link to a page that no longer exists, a placeholder that was supposed to be filled in. If it finds one, the build fails and nothing deploys.
Every rule in that list is a mistake that already happened once. Thatâs the point. An agent will make the same plausible mistake again, and so will I. The guard doesnât care which of us made it. Itâs the cheapest, most reliable engineer in the studio.
5. Branches, pull requests, and a human on every diff
Nothing ships from a working directory. Every change is a branch and a pull request, and I read every diff before it merges. That review is the biggest recurring cost in the studio and Iâve stopped trying to eliminate it. Itâs the cost of shipping reviewed code, which is the only kind worth shipping.
6. Let the documentation follow the code
Agents work from written context. The conventions here live in one place and are distributed to every repo that needs them by Codex, so the agent building in this repo knows the rules without my repeating them, and when a rule changes, every repo gets the change. The Claude Code guidance calls the per-project version of this a CLAUDE.md and says to treat it like code: prune it, test it, and notice when the agent stops following it. Thatâs been my experience exactly.
7. Keep everything in formats you could leave with
Markdown, YAML, JSON, and a site thatâs a folder of files. If I stopped using every tool in the studio tomorrow, Iâd still have all the work. Thatâs not paranoia. Itâs what lets me change tools without changing the business, and itâs what makes the work legible to the next agent, or the next me.
The rule underneath
If thereâs one idea in all of that, itâs this: move the discipline out of your head and into the system.
Vibe coding fails in production not because the code is generated but because the discipline is optional. Every practice above makes something that used to depend on remembering into something that runs whether you remember or not. The spec is written down. The check runs by itself. The guard fails the build. The review is a step you canât skip.
Thatâs what âagenticâ means to me in practice. Not an agent that does everything. A system in which the agent does the doing, the checks do the checking, and the human does the deciding.
For the teenager, and for the founder
If youâre a teenager, or the parent of one: this is why Make First teaches building with AI tools rather than coding, and why it still has pass/fail gates at every stage. The gate is the discipline. A first build that a stranger can use, evidenced by a URL, is a check the student can run. Thatâs the same idea as everything above, scaled to a first business.
If youâre a founder building alone: the stack I do this with is open source, Apache-2.0, on the Platform page, and the tools I reach for are in the Stockyard, with their sources labeled and no affiliate links. Vibe code the demo. Then do the boring part. The boring part is the business.
This is the second post in the Studio of One series. Previous: How I Run a Dozen Ventures Alone. The argument about owning your stack is in Platform Limitations Are Your Prison.