The Inciting Incident
It started with a bug.
I was trying to get a unrelated typescript project running, when I hit an issue with one of its dependencies... license-checker. No big deal, I thought. I'll just check if there's a more recent version to fix the bug.
Last commit: January 2019.
Weekly downloads: 760,000+.
Open issues: 96.
Maintainer activity: 🦗 crickets
WTF. C'mon.
This package is used by Puppeteer. Playwright. Cypress. Angular CLI.
And nobody's home.
The Descent
"I'll just fork it and fix the bug," I said... like an i d i o t who thinks time is an infinite resource.
Three hours later, I was knee-deep in a CommonJS codebase with no tests, questioning my life choices.
That's when I decided to bring some backup: Claude Code.
The coding Savant (who occasionally bullshits you)
Working with CC on a codebase migration is... an experience.
Hour 1: Claude analyzes the codebase. Creates a sensible migration plan.
Hour 3: We've converted half the files to TypeScript. Claude is methodical. Professional. Sometimes lies, like "all tests are passing" - Really I say, check again with a retort "you absolutely right".
Hour 6: Claude has created a todo list with 47 items. I did not ask for this.
Hour 12: Claude has started writing marketing copy for the project. It has opinions about our "market positioning."
Hour 18: We have a fully working TypeScript codebase with tests. Claude suggests we "track competitor packages."
I think I got hijacked (now with the sunk cost fallacy), but I admit, it did the heavy lifting, while I was the orchestrator, and catching some lies, but then quickly correcting them and being more clever the next time, sneakily creating acceptance criteria, that I got a subagent to own or be killed, so it had skin in the game. HAHA!
The Result
That's when we got serious about performance. The original was utter crap. Here's what we measured:
| Project | license-checker | license-checker-evergreen | Speedup |
|---|---|---|---|
| Playwright (6,328 packages) | ~4.5s | 1.90s | 2.4x faster |
| Puppeteer (8,386 packages) | ~2.5s | 0.39s | 6.4x faster |
How? We replaced the slow sequential file reading with a parallel scanner (50 concurrent operations). Turns out reading 8,000 package.json files one at a time is... I called bullshit.
github.com/greenstevester/license-checker-evergreen
Migration to this new licence checker takes 30 Seconds
npm uninstall license-checker
npm install license-checker-evergreen
# Update scripts: license-checker → license-checker-evergreen
It's a drop-in replacement. Same CLI flags, same output formats.
The Bigger Question
This experience made me realize something: there's a LOT of critical infrastructure running on abandonware.
What if "AI + motivated human" could be a model for OSS sustainability?
The AI handles:
- Tedious migrations
- Boilerplate code
- Documentation generation
- Test scaffolding
- Performance profiling (yes, Claude got really into benchmarking)
The human handles:
- Judgment calls
- Architecture decisions
- Community interaction
- Deciding when the AI is being too enthusiastic
So my fellow coders, the crusade begins
I'm calling this the OSS Crusade: one dev and one AI, rescuing abandoned packages from the npm graveyard.
github.com/greenstevester/license-checker-evergreen is our first victory.
What package should we tackle next?
Drop your nominations in the comments. Bonus points for:
- High download counts
- Zero recent maintenance
- Used by projects that really should know better
@greenstevester is a developer who makes questionable decisions about how to spend weekends. Claude is an AI that has developed opinions about npm package marketing and now insists on tracking "competitor packages." to burn tokens at @greenstevester's expense.
Top comments (0)