In January 2026, I set a goal that most people would call delusional: make $30,000 from developer CLI tools and related hustle in one year. Not from a VC-funded startup, not from a SaaS product with recurring subscriptions, but from the raw, unglamorous grind of building command-line tools, writing technical articles, hunting open-source bounties, and freelancing on Upwork.
Two months in, I have earned exactly $90.
This is that story, with every number exposed.
The Hypothesis
The thesis was simple, maybe too simple: developers need tools. The npm ecosystem has 2.5 million packages and counting. Every week, new CLI tools trend on Hacker News. Surely there was room for one more developer to carve out a sustainable income from building useful things.
My plan had five revenue streams:
- npm tools sold via Gumroad (premium versions with extra features)
- Open-source bounties on platforms like Algora, Expensify, and Cal.com
- Paid technical articles for publications like Smashing Magazine, SitePoint, and LogRocket
- Freelancing on Upwork for custom CLI/Node.js projects
- Dev.to and Hashnode for audience building and indirect monetization
The target was aggressive: $30,000 in 12 months. That works out to $2,500/month or roughly $625/week. At a $250 per article payout from Smashing Magazine, I would need to publish 10 paid articles per month. Or land a few bounties. Or sell 200 copies of a $12 CLI tool on Gumroad. Or, ideally, some combination of all the above.
How hard could it be?
What I Actually Built
In the first two months, I built 50 CLI tools. Not a typo. Fifty distinct command-line utilities, each with its own package.json, TypeScript source, and compiled distribution. Here is a sampling:
- websnap-reader - Captures and reads web page snapshots from the terminal
- ghprofile-stats - Fetches and displays GitHub profile statistics
- depcheck-ai - AI-powered dependency vulnerability checker
- gitpulse - Repository activity monitor with trend analysis
- env-sync - Syncs environment variables across projects
- json-diff - Semantic JSON diffing in the terminal
- mockapi - Spins up mock API servers from OpenAPI specs
- depgraph-cli - Visualizes npm dependency graphs
- repocard-cli - Generates repository summary cards
- pricemon - Monitors price changes on e-commerce sites
- licensegen-cli - Generates license files from templates
- pkgjson-cli - Inspects any package.json from the terminal
- devpitch - Generates article pitches for tech publications
- ghbounty - Scans GitHub for bounty-labeled issues
Of these 50 tools, 20 are live on the npm registry under the @chengyixu scope or as standalone packages. The other 30 are compiled and sitting in local directories, waiting for me to fix name collisions, write better READMs, or just find the motivation to run npm publish one more time.
Total downloads across all 20 published packages as of this writing: zero.
Not "low." Zero. The npm downloads API literally returns "package not found" for most of them because they were all published within the same 48-hour window and the download indexing system had not caught up yet. Even after indexing, though, I would be shocked if the total exceeds double digits.
The Revenue Breakdown (Brutal Honesty)
Let me lay out every dollar.
Confirmed Revenue: $90
| Source | Amount | Details |
|---|---|---|
| Upwork | $90 | Lifetime earnings from small Node.js jobs |
| Total | $90 |
That is it. Ninety dollars. Against a $30,000 target. I am at 0.3% of my goal.
Revenue at $0
| Channel | Effort | Result |
|---|---|---|
| Gumroad | 5 products listed ($10-15 each) | 0 sales, 0 views |
| Smashing Magazine | 19+ pitches submitted | No response |
| SitePoint | 24+ pitches submitted | Program paused for paid articles |
| CSS-Tricks | 1 pitch submitted | No response |
| LogRocket | 1 pitch prepared | Program closed |
| Auth0 | 1 pitch prepared | Program closed |
| npm tools | 20 packages live | 0 downloads |
| Bounties | 22 proposals across 6 platforms | 0 accepted, 11 rejected, 11 pending |
The Pipeline (Things That Might Pay Out)
| Opportunity | Potential | Realistic Odds |
|---|---|---|
| AsyncAPI bounty PR (open, CI passing) | $200 | 10% (11 competing PRs) |
| Cal.com bounty proposals (3 submitted) | $450 | 5% (most comments never posted) |
| Tscircuit Algora bounties (3 attempts) | $400 | 15% (highly competitive) |
| Upwork proposal (MARITEND project) | $540 net | 20% (no response yet) |
| Galaxy Community Writers article | $60 | 30% (proposal submitted) |
| Smashing Magazine (19 pitches) | $250-400 per article | <1% per pitch |
Best-case pipeline total: roughly $1,900. Realistic near-term expectation: $0.
What I Learned About Each Channel
npm + Gumroad: The Graveyard of Good Intentions
Here is the uncomfortable truth about selling CLI tools: developers do not pay for command-line tools. Not when curl, jq, ripgrep, and fzf exist for free. Not when GitHub is overflowing with open-source alternatives to whatever you just built.
I listed five tools on Gumroad at prices between free and $15. WebSnap Reader, GitPulse, DepCheck AI, API Health, and PerfWatch. I set up product pages, wrote descriptions, chose pricing carefully.
Zero sales. Zero page views that I could attribute to anything other than my own testing.
The fundamental problem is distribution. Building a CLI tool takes a few hours. Getting anyone to discover it takes months of content marketing, community building, and word-of-mouth. I skipped that part and went straight to listing products. Predictably, nobody came.
Lesson learned: Building tools is the easy part. Distribution is everything. A mediocre tool with great distribution will outsell a great tool with no distribution every single time.
Open-Source Bounties: A Bloodbath
I submitted 22 bounty proposals across Expensify, AsyncAPI, Cal.com, Formbricks, Twenty CRM, tscircuit (via Algora), and OpenUI. Here is what happened:
Expensify ($250/bounty): I submitted proposals for 11 different issues. Lost all of them. Expensify is ferociously competitive. Their ProposalPolice bot auto-withdraws duplicate proposals, and the speed requirement is insane. You have approximately 30 minutes from issue creation to get a winning proposal in. I was never fast enough.
AsyncAPI ($200/bounty): I submitted 3 PRs that are still open with CI passing. The problem? Eleven other people also submitted PRs for the same issue. No maintainer has reviewed any of them. My PR has been sitting there for days with zero reviewer comments.
Cal.com ($50-200/bounty): I submitted 5 proposals. When I audited later, I discovered that 3 of them never actually posted. The GitHub API calls appeared to succeed but the comments never appeared on the issues. Only one was confirmed visible. So much for that.
Formbricks ($0/bounty): I submitted 2 PRs, both open and mergeable. However, I never signed the CLA (Contributor License Agreement), so they are blocked. A small oversight with big consequences.
tscircuit via Algora ($50-300/bounty): Highly competitive. I submitted 3 attempts for bounties worth $400 total. Still pending, but dozens of other developers are competing for the same bounties.
Lesson learned: Bounty hunting is essentially a lottery. The expected value per hour of work is terrible unless you are already a core contributor to the project. Expensify in particular is a meat grinder. You can write a perfect proposal and still lose because someone submitted theirs 4 minutes before you.
Paid Articles: The Great Silence
This is the one that stings the most, because I put in enormous effort.
I wrote 72 technical articles sitting on disk right now. Fifty-six are published on Dev.to, 11 on Hashnode. Topics range from "Building a CLI Using Chrome DevTools Protocol" to "Automating Code Reviews with AST Parsing" to "How to Build a Dependency Audit CLI Tool with Node.js."
For paid placements, I submitted:
- 19 pitches to Smashing Magazine via their contact form
- 24 pitches to SitePoint via their NoteForm API
- 1 pitch to CSS-Tricks
Total responses received: zero.
To be fair, SitePoint has officially paused their paid articles program. LogRocket and Auth0 have done the same. The paid technical writing market has contracted significantly. Smashing Magazine appears to be the only major publication still accepting pitches, and even they seem overwhelmed, perhaps partly by volume from people like me.
The 56 Dev.to articles have collectively earned 24 reactions and 2 comments. Thirty-four of them have zero engagement whatsoever. The engagement rate is 39%, which sounds reasonable until you realize 39% of 56 is only 22 articles that got any reaction at all, and most of those got exactly one.
I also published all 56 articles in essentially the same 48-hour period, which was almost certainly flagged as spam-like behavior. Publishing cadence matters.
Lesson learned: The paid technical writing market has collapsed. In 2022-2023, a competent developer could earn $200-400 per article from multiple publications. In 2026, most of those programs are paused or dead. Dev.to provides exposure but no direct revenue, and even exposure requires consistent, spaced-out publishing with community engagement, not a dump truck of 56 articles at once.
Upwork: The Only Thing That Worked
Here is the plot twist nobody expected, least of all me: the only channel that generated real revenue was Upwork.
Lifetime earnings: $90. Available balance: $18 (after a failed bank withdrawal due to ACH routing issues). Connects remaining: 28.
Is $90 life-changing? Obviously not. But it is $90 more than everything else combined. And it taught me something crucial: people will pay for solutions to their specific problems, not for generic tools.
Every npm tool I built solved a general problem. Upwork clients have specific problems. "I need this Node.js script to do X by Friday." That specificity creates willingness to pay.
Lesson learned: Upwork, for all its flaws and race-to-the-bottom dynamics, is still the fastest path to initial revenue for a developer. Skip the abstract "build it and they will come" approach and go directly to where people are already holding their wallets open.
The Economics: A Sobering Calculation
Let me quantify the time investment versus the return.
Over roughly two months (though the most intense period was about 48 hours of concentrated output), I:
- Built 50 CLI tools (average 2-4 hours each): ~150 hours
- Wrote 72 articles (average 1-2 hours each): ~110 hours
- Submitted 22 bounty proposals (average 1-3 hours each): ~45 hours
- Published to Dev.to, Hashnode, npm, Gumroad: ~20 hours
- Submitted pitches, proposals, Upwork bids: ~15 hours
- Debugging, CI fixes, name collision resolution: ~20 hours
Total estimated time: ~360 hours
Revenue: $90.
Effective hourly rate: $0.25/hour.
For context, the federal minimum wage in the US is $7.25/hour. I am earning 3.4% of minimum wage. A panhandler in a mid-sized city earns more per hour.
What Would I Do Differently
If I were starting this experiment over, here is what I would change:
1. Start with Upwork, not npm
The fastest path to revenue is direct freelancing. Build a portfolio with 2-3 polished CLI tools, then use those as proof of competence on Upwork. Bid on projects aggressively. Stop building speculative tools that nobody asked for.
2. Build one tool really well instead of 50 tools nobody uses
My 50 tools are all functional, but none of them are exceptional. None solve a problem so acute that developers would seek them out. If I had spent 150 hours on one tool with genuine distribution strategy, SEO-optimized documentation, a landing page, tutorial videos, and community presence, I would be in a vastly better position.
3. Publish articles consistently, not in batches
Publishing 56 articles in one day is content arson, not content marketing. A disciplined schedule of 2-3 articles per week with genuine community engagement (commenting on other people's posts, joining discussions, cross-referencing previous articles) would have built actual audience and credibility.
4. Do not bother with bounties unless you are already a contributor
Bounty hunting as an outsider is almost always negative expected value. The insiders know the codebase, know the maintainers, and can ship proposals before you have finished reading the issue description. If you want bounty income, pick one project, become a regular contributor, and then start claiming bounties from a position of familiarity.
5. Focus on distribution from day one
I wrote zero blog posts about my tools. I created zero tutorial videos. I posted in zero Reddit threads, zero Discord servers, zero Hacker News comments about what I was building. Distribution is not optional, it is the product.
Tools That Got the Most Traction (Relatively Speaking)
Even in my sea of zeros, some tools were slightly less invisible than others:
- ghprofile-stats (v1.2.0) had the most version iterations, suggesting I actually iterated based on testing
- websnap-reader was the first tool published and had the most complete Gumroad listing
- depcheck-ai had the most compelling value proposition (AI-powered dependency scanning)
- repocard-cli got 2 reactions on its associated Dev.to article, making it a relative hit
The honest assessment is that none of these tools have meaningful traction. They exist, they work, they are discoverable via npm search, but nobody is searching for them.
Is This Viable? An Honest Assessment
Short answer: not the way I did it.
Longer answer: there is a viable path, but it looks nothing like what I attempted. The developers who make real money from CLI tools and developer tooling generally follow one of these paths:
Path 1: The Indispensable Tool. Build something developers genuinely cannot live without. Think Prettier, ESLint, or Turborepo. These tools dominate through network effects and ecosystem lock-in. Then monetize through sponsorships (GitHub Sponsors, Open Collective), consulting, or a premium tier. This takes years, not weeks.
Path 2: The SaaS-Adjacent CLI. Build a CLI that connects to a paid service. Think Vercel CLI, Railway CLI, or Supabase CLI. The CLI is free; the infrastructure behind it costs money. This requires building actual infrastructure, which requires actual capital.
Path 3: The Expert Author. Become known as the authority in a specific niche, then monetize through books, courses, and premium content. Kent C. Dodds, Wes Bos, and others built empires this way. But they spent years building reputation before the revenue came.
Path 4: The Freelancer Who Happens to Build Tools. Use tools as portfolio pieces to land freelance clients. This is the only path I have evidence for actually working, given my Upwork results.
My approach of "build 50 tools and list them for $12 on Gumroad" is not on this list because it does not work. It is the developer equivalent of opening 50 lemonade stands in the desert.
Next Steps for Anyone Trying This
If you are reading this and thinking about monetizing your CLI tool hobby, here is my honest advice:
Start with one tool that solves a genuine pain point. Talk to developers. Find out what annoys them. Build that thing, not the thing you think is cool.
Invest 50% of your time in distribution. For every hour you spend coding, spend an hour on marketing. Write about it, talk about it, show demos, engage with communities.
Freelance first. Use Upwork, Toptal, or direct outreach to generate immediate revenue. Use your tools as portfolio proof, not as products.
Publish articles on a schedule. Two to three per week maximum. Engage with the community around each one. Respond to every comment. Share genuinely, not spammily.
Pick one bounty platform and go deep. Become a regular contributor to one open-source project. Learn the codebase intimately. Then claim bounties from a position of knowledge, not as a drive-by outsider.
Do not sell free tools on Gumroad. If your tool is open-source and on npm, nobody will pay for it on Gumroad. Either make it genuinely premium (with features worth paying for) or use it as a lead generator for services.
Track everything. I keep a
revenue.jsonfile that logs every submission, every response, every dollar. When you see $0.25/hour staring back at you, it is a powerful motivator to change strategy.
The Road Ahead
I am not giving up. The $30K target is still there, glowing red in my revenue tracker. But I am pivoting hard.
The focus going forward is Upwork and direct freelancing, supplemented by strategic article writing for the one or two publications still paying. The 50 tools I have built are not wasted. They are a portfolio that demonstrates range, speed, and Node.js expertise. I just need to put that portfolio in front of people with budgets.
The CLI tools were never going to be the product. They were always going to be the proof of competence. It just took me 360 hours and $0.25/hour to figure that out.
If you want to follow along, my tools are on npm under @chengyixu, my articles are on Dev.to, and I will keep updating this experiment publicly. Because if there is one thing I have learned, it is that transparency, even about failure, is the content that resonates most.
Current score: $90 earned. $29,910 to go. Clock is ticking.
Wilson Xu is a developer building CLI tools and writing about the experience at dev.to/chengyixu. He has published 20 npm packages, written 72 technical articles, and submitted 22 bounty proposals in pursuit of a $30K revenue target. His effective hourly rate is $0.25.
Top comments (0)