"Your successes and failures are made in the planning phase." That's the core lesson from developer Keegan Leitz after using Claude Code to build hypothesis.sh, a suite of internal developer tools including an iframe proxy, message stream handlers, encoders, formatters, and a webhook handler.
The results split cleanly along one axis: greenfield vs. legacy. Building new tools from scratch worked remarkably well. Claude Code could take a clear specification and produce working code with minimal intervention. Simple features ran almost autonomously. Complex features needed step-by-step guidance, but the output was still dramatically faster than writing everything by hand.
Legacy codebases were harder. Claude Code needed more iteration, more correction, and more context about existing patterns and constraints.
The cost stayed within a standard Claude Pro subscription, which makes this approach viable for small teams and solo developers who need internal tooling but can't justify weeks of manual development.
Three practical patterns emerged from the project. First, invest disproportionately in planning. Detailed specifications before any code generation produced far better results than iterating through vague prompts. Second, code quality standards matter less for internal tools. When you're the only user, "working" beats "elegant." Third, break complex features into discrete steps rather than asking for everything at once.
This matches what we've seen across the Claude Code user base: the tool works best when you treat it less like autocomplete and more like a junior developer who needs a clear brief.