CBT ToolsHow I turned 36 free GitHub tools into a $9.99 product — zero backend, zero cost, honest results.
You built 36 free tools. 157 people cloned the repo. Revenue: $0.
Here's what I did next — and the 3 lessons I learned about the gap between "free" and "paid."
Over 30 days, I built 36 free mental health tools — all vanilla JavaScript, zero dependencies, zero backend, zero signup. Cognitive Behavioral Therapy (CBT) thought records, distortion detectors, safety behavior trackers, core belief drills. Each one a single HTML file that runs entirely in the browser.
157 people cloned the repo. 445 clones total. 2 stars. $0 revenue.
That's not a failure — it's a signal. The tools work. People want them. But "free on GitHub" and "product you pay for" are different categories.
A GitHub cloner is someone who:
That's a much warmer audience than a random Dev.to reader. They've already self-selected as interested + capable.
The question was: how do I convert that warmth into revenue without being extractive?
I didn't paywall anything. All 36 tools remain free on GitHub forever. Instead, I created a bundle that adds convenience:
What's in it:
The tools are free. The convenience costs $9.99.
A structured, daily email course that walks you through:
I made the CBT Thought Record — the most popular tool — free on Gumroad. Zero friction entry point. It cross-links to the $9.99 bundle.
The funnel: $0 Thought Record → "Need more tools?" → $9.99 Bundle
The entire revenue infrastructure runs on free tiers:
| Component | Platform | Cost |
|---|---|---|
| 36 tools (hosting) | GitHub Pages | $0 |
| Product pages + payments | Gumroad | $0 (10% per sale) |
| Lead magnet delivery | Gumroad | $0 |
| Cross-links + upsell | Gumroad API | $0 |
| README → product bridge | GitHub README | $0 |
Total infrastructure cost: $0/month. Gumroad takes 10% per sale. Everything else is free.
import requests
# Create a product
resp = requests.post('https://api.gumroad.com/v2/products',
headers={'Authorization': f'Bearer {token}'},
json={'name': 'Complete CBT Bundle', 'price': 999, 'description': '...'})
That's it. No Stripe integration, no payment form, no webhook handling. Gumroad handles all of it.
# Add a cross-link from the free product to the paid bundle
requests.put(f'https://api.gumroad.com/v2/products/{free_id}',
headers={'Authorization': f'Bearer {token}'},
json={'custom_fields': {' Bundle': 'https://gumroad.com/l/cowjn'}})
Now every person who downloads the free Thought Record sees a link to the $9.99 bundle.
Zero sales. But the infrastructure is in place. The next step is traffic — getting the funnel in front of people who aren't already GitHub cloners.
"Free on GitHub" and "$9.99 on Gumroad" serve different needs. The free version is for people who want to read the code, modify it, and are comfortable with raw HTML files. The paid version is for people who want convenience — one download, a hub page, a PDF workbook, email support.
Don't think of it as paywalling. Think of it as offering a convenience layer.
The $0 → $9.99 funnel is deployed. The cross-links are live. The README bridge is in place. Zero sales means the funnel isn't converting yet — but it's ready to convert. When traffic arrives, the infrastructure is there.
Build the funnel before you need it.
157 cloners. 0 sales. The conversion rate is 0% — but that's because there was nothing to convert to until this week. Now there's a $9.99 bundle linked in the README.
The next metric to watch: bundle sales from GitHub referral traffic.
The tools stay free. The convenience costs money. And the funnel is ready.
All 36 tools are free on GitHub. The Complete Bundle is $9.99. The 7-Day Email Course is $9. No paywalls, no signup, no tracking.