Yesterday I went down a rabbit hole and ended up building not one, but two complete projects with Claude Code. Figured I’d share what happened and some tricks I picked up along the way.
What I Actually Built (in one day)
So I started with this annoying problem: our preview deployments have URLs like pr-1234-feature-xyz-staging.k8s.example.com
. Nobody can remember these things, and sharing them in Slack is painful.
Project 1: Codenames Library
A TypeScript library that turns numbers into consistent, memorable names. PR #1234
always becomes london
, PR #5678
always becomes tokyo
, etc.
The scope got a bit out of hand:
- Core hashing algorithm (FNV-1a) for deterministic output
- 77+ ESM package exports with full TypeScript definitions
- 12 themed word lists (cities, animals, colors, etc.) in 5 different sizes each
- Comprehensive test coverage for all combinations
- CLI tool with
codenames
andcn
aliases - Zero dependencies (because I’m apparently that person)
- Works everywhere: Node, Bun, Deno, browsers
Project 2: PR Codename Action
Then I thought „hey, what if this just worked automatically?“ So I built a GitHub Action that comments a codename on every new PR.
Combined stats: ~100 files across both repos, published NPM package + GitHub Marketplace action
The Tricks That Actually Worked
1. CLAUDE.md is your secret weapon
Honestly, this changed everything. I wrote out exactly how I wanted the code to look upfront – TypeScript style, no comments, Bun for runtime, zero deps if possible. Claude Code just… followed it religiously across every single file. No manual cleanup needed.
# Technology Stack
- **Runtime**: Bun
- **Language**: TypeScript
- **Build**: Zero dependencies preferred
# Coding Principles
- Write lean, clear, and efficient code
- NO COMMENTS unless explicitly requested
The consistency was wild. Every file had identical structure, naming conventions, export patterns. Like having a really obsessive junior dev who never gets tired.
2. Delegate the boring searches
Instead of grep-ing around manually, I just asked Claude Code to figure stuff out:
„Find all the files importing from cities and update them to use the new API“
It autonomously searched, analyzed, and came back with exactly what needed changing. Saved probably 2 hours of manual detective work.
3. Batch everything you can
Claude Code can run multiple commands at once. Instead of asking for git status, waiting, then asking for git diff, just ask for both. Same with file reads, tests, whatever. Much faster workflow.
4. Let it handle the repetitive nightmare stuff
I needed 60 individual TypeScript files (12 themes × 5 sizes each). My brain started melting just thinking about it. Claude Code churned them all out with perfect consistency – proper exports, types, JSDoc, the works.
5. The todo system is clutch for big tasks
✅ Core hashing algorithm
✅ Generate 60 theme files
⏳ Build CLI interface
⏳ Write tests for everything
⏳ GitHub Action implementation
Keeps you sane when juggling multiple moving pieces.
6. Be specific about your actual use case
Don’t ask for generic stuff. I said: „PR 1234 needs to always become ‚london‘ and PR 5678 always becomes ‚tokyo‘ – same input, same output, every time.“ This helped Claude Code understand I needed deterministic hashing, not random generation.
How It Actually Went Down
Morning: Started with the codenames library idea. Spent 30 minutes writing a solid CLAUDE.md file with all my requirements.
Midday: Core hashing algorithm was done in about 2 hours. Had deterministic output working perfectly – same PR number always maps to same city name.
Afternoon: This is where things got crazy. Generated all 60 theme files, built the CLI, added comprehensive tests. The repetitive stuff that would normally take days.
Evening: Realized I could make this even easier to use, so I built the GitHub Action. Simple workflow file that auto-comments codenames on new PRs.
Late evening: Documentation, final polish, published both to NPM and GitHub Marketplace.
The Weird Stuff That Surprised Me
Everything was consistent. Like, unnaturally consistent. Every single file had identical exports patterns, TypeScript types, JSDoc formatting, variable naming conventions. Zero manual cleanup needed anywhere.
Error handling just appeared. I mentioned wanting it „production-ready“ and suddenly every function had proper input validation, helpful error messages, edge case handling. I didn’t specify any of that stuff.
The package.json got gnarly. 77+ export paths with proper ESM mappings, TypeScript declarations, multi-runtime support (Node/Bun/Deno). Claude Code just handled all the complexity without breaking a sweat.
What I Ended Up With
Codenames Library:
- Published NPM package:
npm install codenames
- Full TypeScript support with proper IntelliSense
- Works everywhere: Node, Bun, Deno, browsers
- Zero dependencies (because apparently I have trust issues)
- Comprehensive test coverage
GitHub Action:
- Published to GitHub Marketplace
- Auto-comments codenames on new PRs
- Simple one-liner setup in your workflow
Both are actually being used in production now. Our preview URLs went from pr-1234-feature-branch-k8s-staging.example.com
to london.example.com
. Much easier to share with the team.
The Real Takeaway
Look, Claude Code didn’t just write code for me. It maintained perfect consistency across ~100 files and followed every weird convention I specified. The stuff that normally takes a week of careful, tedious work was done in a day with zero inconsistencies.
If you’re doing anything complex, spend 30 minutes upfront writing a solid CLAUDE.md with your requirements and coding standards. Claude Code will follow them religiously, and you’ll save hours of manual cleanup later.
Also, the Task tool is genuinely useful – it’s like having a senior dev who can instantly understand your entire codebase and tell you exactly what needs changing.
Anyone else gone down similar rabbit holes with Claude Code? Would love to hear what you’ve built!
Try it yourself:
P.S. – Our Slack channels are now full of people saying „check out the tokyo environment“ instead of trying to copy-paste insane URLs. Small wins, but they add up. 🎯