Why One-Shotting Apps with Claude Code Fails (And How to Actually Build Software)
I handed my PRD to Claude Code and said “implement everything, run tests, deploy.” Three hours later, I had a deployed app on Railway. Literally nothing worked correctly.
The login page crashed. The database schema was wrong. The API endpoints returned 500 errors. The tests I asked for? They passed locally but failed in production.
I thought AI coding tools were supposed to make me faster. Instead, I wasted a whole day debugging a broken monolith.
The Problem: The One-Shot Fantasy
I fell for the viral demos. You know the ones - a developer types a prompt, hits enter, and boom: a working app appears. Marketing materials promise this is the future of coding.
So I tried it. I spent hours crafting the perfect Product Requirements Document:
Here's my PRD for a task management app:[20 pages of requirements]
Please implement everything, write tests,and deploy to production.The result was a disaster. Not because Claude Code is bad, but because my approach was fundamentally flawed.
Why One-Shotting Fails
The core issue: “implement everything” bakes in too many assumptions that compound into cascading failures.
Here’s what actually happens when you one-shot an app:
PRD with 15 features │ ▼Claude makes assumption #1: Database schema │ ▼Claude makes assumption #2: Auth flow │ ▼Claude makes assumption #3: API structure │ ▼Assumptions conflict → Integration bugs │ ▼Generated tests pass (wrong assumptions) │ ▼Deploy → Nothing worksThe Hidden Problems
| Problem | What Happens | Why It Breaks |
|---|---|---|
| Context dilution | AI tries to handle 15 features at once | Each feature gets shallow attention |
| Assumption cascade | Early decisions lock in wrong paths | Later code builds on broken foundations |
| Integration complexity | Features built in isolation | Don’t mesh together when combined |
| Hidden dependencies | Unexpected interactions | Only surface at scale |
| Testing gaps | Generated tests miss edge cases | Tests assume happy paths |
I saw this firsthand. My “perfect” PRD didn’t specify how user authentication should interact with the task assignment system. Claude made a reasonable assumption. But that assumption conflicted with how the notification system was designed. Neither feature worked in production.
What Actually Works: Iterative Development
After my failed deployment, I talked to experienced developers who use AI tools daily. None of them one-shot apps.
“You can’t one-shot an app or software, not even with CC or Opus on max level effort. Anyone who you see claiming otherwise has no idea what they’re doing.”
Another developer told me:
“It usually takes me several months to release something useful. You have to iterate tens, hundreds, thousands of times before the app becomes remotely good.”
The Better Approach
Instead of one shot, think of it as building a house. You don’t pour foundation, frame walls, install plumbing, and wire electricity all at once. You do them in sequence, checking each step.
Phase 1: Foundation├── Define the SINGLE most critical feature├── Build just that feature├── Test manually└── Fix issues before moving on
Phase 2: Core Features (one at a time)├── Add second feature├── Verify integration with first feature├── Refine both based on interaction└── Repeat for each feature
Phase 3: Polish├── Add secondary features├── Improve error handling├── Optimize performance└── Comprehensive testing
Phase 4: Production Ready├── Security review├── Load testing├── Documentation└── Deployment pipelineA Concrete Example
For my task management app, here’s what I should have done:
Day 1: Just the database schema
- Define tables
- Create migrations
- Test with sample queries
- Fix any schema issues
Day 2: User authentication only
- Implement login/logout
- Test auth flow
- Verify session management
- Fix auth bugs
Day 3: Basic task CRUD
- Create, read, update, delete tasks
- Test each operation
- Integrate with auth
- Fix integration issues
Week 2: Task assignment feature
- Add assignment logic
- Test with multiple users
- Check edge cases
- Refine
Each day, I ship something that works. Each feature gets tested before the next one starts.
Common Mistakes I Made
| My Mistake | Why It Failed | What I Do Now |
|---|---|---|
| ”Implement everything” | Assumptions cascade | ”Implement login first” |
| Skipping manual tests | Bugs hide until deployment | Test each feature locally |
| Ignoring incremental deploy | Integration bugs multiply | Deploy each working piece |
| Treating AI as magic | Unrealistic expectations | Treat AI as a fast junior dev |
| Not reading generated code | Understanding gaps grow | Review every section |
Why This Is Actually Faster
Here’s the counterintuitive truth: iterative development with AI is faster than one-shotting.
One-shot timeline:
Day 1: Implement everything (8 hours)Day 2-5: Debug broken integration (32 hours)Week 2: Rewrite broken parts (40 hours)Week 3: Fix tests (20 hours)Total: 100 hours, still brokenIterative timeline:
Day 1: Foundation + auth (6 hours)Day 2-3: Core features (12 hours)Day 4-5: Polish (10 hours)Week 2: Testing + deployment (16 hours)Total: 44 hours, working appThe difference? In iterative development, bugs are caught when they’re cheap to fix. In one-shot development, bugs compound until they’re expensive to untangle.
How to Change Your Workflow
If you’ve been trying to one-shot apps, here’s how to shift:
-
Break down your PRD. Instead of one big document, create feature cards. Each card is one small, testable piece.
-
Set smaller prompts. Instead of “build the whole app”, try “build just the user registration endpoint, including error handling and tests.”
-
Test after each piece. Don’t move to the next feature until the current one works.
-
Deploy incrementally. Ship working pieces. This gives you confidence and catches issues early.
-
Review generated code. Read what Claude writes. Ask questions. Make sure you understand your own codebase.
Summary
In this post, I shared why one-shotting apps with Claude Code fails and what to do instead. The key point is that iterative development - building one feature at a time, testing thoroughly, integrating carefully - is actually faster than trying to build everything at once.
Stop trying to one-shot your apps. Start building incrementally. You’ll ship faster and with more confidence.
Final Words + More Resources
My intention with this article was to help others share my knowledge and experience. If you want to contact me, you can contact by email: Email me
Here are also the most important links from this article along with some further resources that will help you in this scope:
Oh, and if you found these resources useful, don’t forget to support me by starring the repo on GitHub!
Comments