For 7 days I poured energy into ChatProof β a testing framework for AI chat UIs. The problem was real: every team building Claude/GPT wrappers hits the same streaming-render bugs, and existing e2e tools weren't built for non-deterministic LLM output. I had a competitive analysis. I had a PRD. I even had a name. Then I admitted something to myself: product/market work just isn't my strength. I'm a builder. I love writing TypeScript. I love designing APIs. I love npm test going green. I do not love writing cold DMs. I do not love figuring out which subreddit my ICPs hang out in. I do not love crafting positioning documents. Once I named it, the pivot was obvious. Instead of one ambitious SaaS, I'd ship tiny zero-deps libraries that solve specific Anthropic SDK pain points I personally hit. Each one: The goal isn't to build a unicorn. It's to leave a GitHub trail that demonstrates I can ship real code, get organic distribution through npm + search, and let the work compound over months. Day 1 β claude-stream-collector Consume Anthropic Messages streaming events into a typed CollectedResult . Handles tool_use input JSON delta accumulation (the SDK leaves this to you) and merges cache token usage across message_start
- message_delta (the SDK overwrites). ~120 lines, 6 tests. Day 3 β claude-retry Smart retry for Anthropic API calls. Respects retry-after headers (which the SDK's built-in retry doesn't always honor), exponential backoff with jitter, custom retry predicates, AbortSignal support. ~180 lines, 25 tests. Day 5 β claude-pricing Calculate Claude API cost from token usage. Bundled pricing table with smart model-alias resolution (strips date suffixes), batch API discount, session CostTracker with budget alerts. ~180 lines, 19 tests. Three packages, ~480 lines of code, 50 unit tests. All public. All on npm.
- Match the work to who you are, not who you think you should be. Indie Hackers and Twitter are full of advice assuming you're a generalist who loves every part of building a company. Many great engineers aren't, and that's fine. Tiny libraries are a perfectly valid path if you optimize for shipping over selling.
- Zero-deps is a feature, not a constraint. Every dependency is a future maintenance burden, a potential security issue, and a reason for someone to skip your package. For 100β500 line utilities, you almost never need anything but Node's standard lib.
- Series narratives compound. Each package on its own is a small thing. But three packages with shared types (TokenUsage flows from claude-stream-collector β claude-pricing cleanly) form a tiny ecosystem. Each new package strengthens the others.
- Build in public β build for engagement. I posted about each release on X and ε³ε». Engagement so far: zero likes, zero replies. Downloads on the first package: 129 in 7 days. People install packages they discover via search and never engage with the announcement. That's fine β the artifacts persist longer than any tweet.
- Pivoting hurts less when you preserve learning. ChatProof isn't dead. The painpoint research, competitive analysis, and architecture thinking from those 7 days informed every package since. Especially: I knew the streaming pain because I'd done the homework.
More small packages: claude-cache-helper
, claude-tools-typed
, maybe claude-prompt-toolkit
. Same shape β small, focused, zero-deps. I'll keep posting about them but won't measure success in likes. If you're stuck on an indie project trying to be a "real founder," maybe try shipping a single utility you'd actually use. You might find you ship four more before you'd have written a single landing page. Three packages: claude-stream-collector β typed stream eventsclaude-retry β smart retry + backoffclaude-pricing β cost calc + trackerBuilding in public: ship-log-2026