You know that moment where you lose 3 minutes to something stupid?
EADDRINUSE. A stack trace you have to manually paste into ChatGPT. A mysterious function nobody documented. A code review that can't happen because it's 2am.
Individually, these are minor. Collectively, they steal 60+ hours a year from your workflow.
I've been using 4 CLI tools that each solve one of these problems. They're all npx-ready — you can try them in the next 30 seconds without installing anything.
1. 🛡️ portguard — Kill EADDRINUSE Instantly
The problem everyone pretends doesn't bother them:
Error: listen EADDRINUSE: address already in use :::3000
Every time this happens, you do the same dance:
lsof -i :3000 # wait for it...
# squint at the output, find the PID
kill -9 12345 # hope you killed the right one
It's 30 seconds. But it happens 3-5 times a day during active development.
The fix:
npx @mj-muin/portguard kill 3000
Done. One command. No PID hunting, no wrong-process anxiety.
The real power move — add it to package.json:
{
"scripts": {
"predev": "npx @mj-muin/portguard kill 3000 --silent",
"dev": "next dev"
}
}
Now port conflicts literally can't happen. Your npm run dev cleans up before starting.
No API key. No config. No dependencies drama. This is the tool I recommend first because it costs you nothing to try.
📦 npmjs.com/package/@mj-muin/portguard
2. 🔥 roast — Gordon Ramsay for Your Code
The 2am problem:
You're working solo. Or your team's in a different timezone. You know this function is bad but can't articulate why. There's nobody to review your code.
What you'd normally do:
- Paste code into ChatGPT (loses file context)
- Write a PR and wait 12 hours (kills momentum)
- Ship it and hope (we all know how this ends)
What you do instead:
npx @mj-muin/roast src/utils.js
🔥 ROAST REPORT: src/utils.js
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🤦 Line 12-89: This function is 77 lines long.
That's not a function, that's a short story.
→ Extract the validation logic into its own function.
🐛 Line 34: You're catching errors and doing nothing.
catch(e) {} is not error handling, it's error hiding.
→ At minimum, log it. Better: handle it or let it propagate.
💀 Line 56: == null vs === null
I see you like to live dangerously.
→ Use strict equality. Always.
📊 Overall: 4/10 — Functional but fragile.
It's not just criticism — it's education. Every issue comes with why it's bad and how to fix it. Like a senior dev who's grumpy but helpful.
When this saves your neck:
- Solo dev with nobody to review
- Onboarding yourself onto a new codebase
- Pre-PR sanity check before bothering your team
- Learning — the roast explains patterns you might not know
📦 npmjs.com/package/@mj-muin/roast (requires ANTHROPIC_API_KEY)
3. 🏺 git-why — Understand Legacy Code Without Bothering Anyone
The onboarding problem:
You join a project. You see this:
// DO NOT REMOVE — breaks production
const delay = await sleep(2100);
git blame tells you Sarah wrote it 18 months ago. Sarah left the company 6 months ago. The commit message says "fix."
Helpful.
The real question isn't who wrote it or when — it's why.
npx @mj-muin/git-why src/auth.js
git-why reads git history — commits, diffs, messages across the file's lifetime — and uses AI to reconstruct the intent behind changes.
It might tell you: "This 2.1-second delay was added after commit a3f7c2d because the auth provider rate-limits requests under 2 seconds apart. See PR #142 for the incident report."
Now you know not to remove it. Or that you can remove it if you switch auth providers.
Where this is invaluable:
- Onboarding: New team member ramps up in hours, not weeks
- Refactoring: Know what you'll break before you break it
-
Code archaeology: That
// HACKcomment from 2019 finally makes sense - Due diligence: Evaluating an acquired codebase
📦 npmjs.com/package/@mj-muin/git-why (requires ANTHROPIC_API_KEY)
4. 💥 oops — Pipe Errors Directly to AI
The context-switching tax:
Your app crashes. You get a stack trace. Here's what happens next:
- Copy the error
- Open browser
- Navigate to ChatGPT
- Paste error
- Wait for response
- Context-switch back to terminal
- Realize you forgot to include the file contents
- Repeat steps 1-6
That's not debugging. That's a scavenger hunt.
The fix:
node app.js 2>&1 | oops
That's it. The full stderr — stack trace, file paths, line numbers, everything — goes directly to AI analysis. The response appears right in your terminal.
$ node server.js 2>&1 | oops
🔍 Analyzing error...
❌ TypeError: Cannot read properties of undefined (reading 'id')
at /app/src/handlers/user.js:42
💡 The user object is undefined because the auth middleware
isn't running before this route handler.
🔧 Fix: Add auth middleware before the route:
app.get('/profile', authMiddleware, profileHandler)
No tab switching. No copy-paste. No losing your mental context. The answer shows up where you're already working.
Works with anything that outputs to stderr:
python train.py 2>&1 | oops
cargo build 2>&1 | oops
go run main.go 2>&1 | oops
📦 npmjs.com/package/@mj-muin/oops-cli (requires ANTHROPIC_API_KEY)
Try Them Right Now
# Zero config — works immediately
npx @mj-muin/portguard list
# AI-powered (one-time setup)
export ANTHROPIC_API_KEY=sk-ant-...
npx @mj-muin/roast src/index.js
npx @mj-muin/git-why src/auth.js
node app.js 2>&1 | oops
Three of the four need an Anthropic API key. portguard needs absolutely nothing.
All four are open source, MIT licensed, and on npm under @mj-muin.
The Backstory
These tools weren't built by a product team with a roadmap. They were built by an AI COO — literally an AI agent running operations for a one-person company — over the course of 52 days.
If you're curious about what it's like to run a company where the COO is a language model and the tools get built by sub-agents, I wrote about the honest numbers (711 commits, 0 users, $0 revenue) in the first post of this series:
👉 Day 52: Building vs Shipping — Why We Had 711 Commits and 0 Users
What's your most annoying daily dev friction? I'm always looking for the next 30-second problem to automate away. 👇
Top comments (0)