Studio of One ¡ Part 3
What I Ship in a Week With Claude Code: A Build Log
A week of shipping in a studio of one: the decisions, the pull requests, what Claude Code did, what I did, what got cut, and how I knew it was safe to merge.
Josh McWilliam
7 min read
- build-log
- claude-code
- studio-of-one
- production
- open-source
Most writing about building with AI agents is either a demo or a manifesto. This is neither. Itâs a log of one working week, on one real project, with the pull request numbers.
The project is this website. In the first week of September I repositioned it from âa directory with a studio attachedâ to âa studio with a directory attached,â which touched nearly every page, the data behind them, the build, and the legal pages. I picked this week because itâs concrete: the spec and the commits exist, the pull requests have numbers, and the result is the site youâre reading.
Hereâs what happened, day by day.
Wednesday: decide before building
The week started with no code. It started with a document.
I wrote a spec with a decision table: what the studio is and isnât, which brand leads, whether the Foundry has members yet (no), whether it has a paid tier (no), whether the âDeployâ product in the nav was live (no), whether the Stockyardâs âreviewsâ were hands-on reviews (no), whether any affiliate links existed (none), and which open-source license the platform tools carry (Apache-2.0). Fourteen rows. Each one a claim the site was making or was about to make, with a yes or no next to it.
That table did more for the week than any prompt. Every ânoâ became something to remove. Every âyesâ became something the agent could build against without asking. And the whole thing became the input to the content guard Iâll get to below, because a decision youâve written down is a decision a script can enforce.
Anthropicâs guidance for Claude Code puts it as âexplore first, then plan, then code,â and warns that skipping the plan âcan produce code that solves the wrong problem.â Iâd put it more bluntly: an agent will build whatever you ask for, quickly and well, so the expensive mistakes are all in the asking.
One more thing I found on Wednesday: the main branch hadnât deployed since a dependency upgrade in March. The live site was running an older build. First engineering job of the week, before any of the exciting work: make the build work again.
Thursday: build and ship the repositioning
Thursday was the big day. Ten commits, one pull request (#7), about 4,800 lines added and 4,400 removed, merged that evening.
In order:
- Toolchain. Pin Node 22, add a type check to the build, fix a blog schema error that had been silently breaking things. This was the March problem, fixed forward rather than rolled back.
- Layout foundation. One base layout for every page, page titles composed from data, branded share images generated by a script, and a content guard: a script that scans every built page for strings that must never appear and fails the build if it finds one. The forbidden list came straight from Wednesdayâs table.
- Ventures as data. A
/venturespage driven by a single data file, with redirects from the old portfolio paths, and the platform tools rendered from data rather than hand-written HTML. - Navigation as data. Header and footer built from one nav definition. The âDeployâ item, which pointed at a product that wasnât live, removed.
- Home. A studio-first hero, a founder block, and a strip showing the ventures.
- Stockyard honesty. A methodology page explaining where the 865 listings come from, âVerifiedâ relabeled to mean âofficial or production-grade sourceâ rather than âtested by us,â and search scoped to listings.
- Copy. About, Foundry, Learn, Platform, Philosophy, Contact rewritten to the decisions.
- Legal. Terms of use and a privacy policy, drafted for counsel review.
- Blog alignment. The five posts lightly edited for the studio identity.
- Docs. The spec recorded with its resolutions, the projectâs
CLAUDE.mdrefreshed, and the sub-brand links whose domains didnât resolve parked with dated notes rather than shipped as dead links.
What Claude Code did, and what I did
The honest split, for anyone trying to picture it:
Claude Code did the reading, the refactoring, the data modeling, the component work, the redirect plumbing, the share-image script, the guard script, the first drafts of every pageâs copy, the legal page drafts, and the fixes when the checks failed. It ran the build-and-verify loop itself and came back with results rather than guesses.
I did the decision table, the review of every diff, the wording of every claim about what the studio is, the choice of what to remove, and the final read of every page. I rejected a paid-membership pitch for the Foundry that read well and wasnât true. I rejected âreviewed and testedâ language for the Stockyard for the same reason. I rejected a slide for a product that didnât exist. None of those were the agentâs fault. They were plausible. Plausible is exactly the failure mode a human is for.
How I knew it was safe to merge
One command runs the type check, the full build, the search index, and the content guard. If any of it fails, the command fails. A second command checks every venture link and reports which domains resolve.
The agent ran these until they passed. Then I read the pull request. Then it merged, and the site deployed itself within minutes.
Thatâs the loop. The agent does the doing and the checking. The checks decide whether itâs done. I decide whether it ships. From the âGive Claude a way to verify its workâ section of the Claude Code guidance: âIf you canât verify it, donât ship it.â The whole week was built around making that sentence cheap to obey.
Friday: three small follow-ups
With the foundation in place, Fridayâs changes were small and fast, which is the point of a foundation.
- #8: a new venture, live sub-brands for another, a âLiveâ badge in the status vocabulary. Forty-one lines added.
- #9: a venture Iâd removed the day before came back with a narrower focus, its two former standalone ventures folded under it as sub-brands. Sixteen lines. I changed my mind, and changing my mind cost sixteen lines.
- #10: Make First had gone live at its own domain, so the Learn page, the home carousel, and the About page were updated to say so, and a sub-brand whose site had just started returning a real response got its link. Fifty-four lines.
Each was its own branch, its own verify run, its own pull request, its own review. Small batches, which is exactly what the 2024 DORA report says keeps delivery stable when AI is in the loop.
Saturday: three lines
Pull request #11 changed three lines. A leftover count of thirteen ventures in one blog post became âa dozen,â and a sub-brandâs status note was updated after its site had been returning a healthy response for a day.
I mention it because three-line pull requests are most of what a studio of one ships, and because the content guard now fails the build on that old count, so the mistake canât come back.
What got cut, and why
A week is what you ship and what you decline to. From the specâs out-of-scope list:
- A Tailwind 4 migration. Real, deferred. It would have doubled the diff for no visible change.
- Newsletter and analytics. Both would need a privacy policy update. Not this week.
- Individual venture pages. The data model supports them. The ventures arenât far enough along to deserve them.
- A paid Foundry tier and a partner track. Not real yet, so not on the site.
Scope cutting in a studio of one is less noble than it sounds. I donât have a roadmap meeting to defend a feature in. I have Mondayâs question: what moves a venture to the next status with the hours I have? Everything else waits, and I try to write down that itâs waiting.
What broke
The March build failure is the honest one, and itâs worth sitting with. A dependency upgrade merged in March never deployed, and for five months the main branch and the live site disagreed. Nothing told me, because nothing was checking.
Thatâs the failure the week was really about. The repositioning was the visible work. The type check in the build, the content guard, the link checker, and the one command that runs all of them are the durable work, because they turn ânothing told meâ into âthe build fails.â Every one of the later pull requests that week was small and calm because of the Thursday morning spent on plumbing.
What you can copy
None of this depends on my tools. The practices are:
- Write the decisions down before the code. A table of claims with yes or no next to each. Itâs the best prompt youâll ever write, and itâs reusable as a guard.
- One command that says pass or fail. Types, build, whatever guards you have. Give it to the agent and let the agent run it until it passes.
- Turn every past mistake into a build failure. A forbidden-strings list is twenty lines of script and it never sleeps.
- Small pull requests, one branch each, a human on every diff. Yours, if youâre alone.
- Fix the plumbing first. If the build isnât trustworthy, nothing shipped on top of it is either.
The stack I did this with is on the Platform page and the tools I reach for are in the Stockyard. The next post in this series is about the part of the job agents donât do at all: deciding what to build in the first place.
This is the third post in the Studio of One series. Previous: Vibe Coding Gets You a Demo. This Gets You to Production. The tools are described in Building the Fractary Platform.