How I Built a Side Project That Makes $500/Month — Full Stack Breakdown
Eighteen months ago I started a side project on a Saturday. Today it generates $500/month in passive(ish) income. Here's exactly what I built and how it works.
What I Built
A simple tool that helps developers generate API documentation from OpenAPI specs. Nothing revolutionary. But it solves a real problem and people pay for it.
Stack:
- Frontend: Next.js + Tailwind CSS
- Backend: Node.js + FastAPI
- Database: PostgreSQL (Supabase)
- Hosting: Vercel (frontend) + Railway (backend)
- Auth: Supabase Auth
- Payments: Stripe
Total monthly cost: $47/month (Railway + Supabase + domain)
The Idea
I was tired of writing API docs manually. Existing tools were either:
- Too expensive ($100+/month)
- Too complicated (enterprise software)
- Too basic (doesn't parse OpenAPI properly)
I thought: what if I just build the minimal viable version of this?
I spent one Saturday building it. Launched it on Hacker News the next week. Got 200 signups on day one.
The Tech Stack (Why I Chose Each Part)
Frontend: Next.js + Tailwind
Next.js for the App Router and server components. Tailwind for styling (I hate writing custom CSS).
npx create-next-app@latest my-api-docs --typescript --tailwind --app
Why not just React? I needed SSR for SEO and OpenAPI spec parsing. Server components made this trivial.
Backend: FastAPI (Python)
I chose Python because:
- OpenAPI specs are JSON/YAML — Python handles this natively
- Pydantic validation is excellent
- FastAPI's auto-generated Swagger docs saved me building an API explorer
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class OpenAPISpec(BaseModel):
spec: dict
@app.post("/generate-docs")
async def generate_docs(spec: OpenAPISpec):
# Parse and generate beautiful docs
return await doc_generator.generate(spec.spec)
Database: Supabase
Supabase gives me PostgreSQL + auth + realtime subscriptions for $0-25/month.
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email TEXT UNIQUE NOT NULL,
plan TEXT DEFAULT 'free',
created_at TIMESTAMPTZ DEFAULT now()
);
Why not Firebase? I wanted real SQL. Firebase's NoSQL queries are painful for complex reports.
Hosting: Vercel + Railway
- Vercel handles the Next.js frontend (zero config, auto-scaling)
- Railway handles the FastAPI backend + PostgreSQL (persistent, $5 credit/month covers my usage)
The Business Model
Free tier: 3 API projects
Pro ($9/month): Unlimited projects, custom domains, team collaboration
Team ($29/month): Everything in Pro + priority support
Most users stay on free. About 5% upgrade. That 5% pays for the infrastructure and puts $500 in my pocket monthly.
The math:
- 2,000 registered users
- 100 paying users × $9 = $900/month
- Infrastructure costs: ~$47/month
- Net: ~$850/month
The $500 comes from the fact that not everyone is on the $9 plan.
What Actually Took Time
Not building the product. Marketing it.
I spent 3 weeks building. I've spent 18 months promoting it.
What worked:
- Developer communities (Hacker News, Dev.to, Reddit r/webdev)
- Content marketing (tutorials on how to write better API docs)
- SEO (ranking for "OpenAPI documentation tool" and related terms)
- Affiliate links (I recommend the tools I use — Systeme.io for my marketing site, Railway for hosting)
What didn't work:
- Cold outreach (ineffective for a developer tool)
- Paid ads (CPC too high for niche B2D software)
- Twitter/X (worked for some, not for me)
The Honest Numbers
| Month | Users | Revenue |
|---|---|---|
| 1 | 200 | $0 |
| 3 | 800 | $180 |
| 6 | 1,200 | $380 |
| 12 | 1,800 | $520 |
| 18 | 2,000 | $500 |
It's plateaued. The market is niche. I'm happy with $500/month for 30 minutes of maintenance weekly.
What I'd Do Differently
1. Charge earlier. I waited 4 months to add paid plans. Leave money on the table from early adopters who wanted to pay.
2. Build an email list from day one. I didn't capture emails until month 6. Missed 6 months of relationship building.
3. Use Systeme.io from the start. I migrated from a custom Node.js marketing site to Systeme.io. Would have saved 2 weeks of dev time. Systeme.io's free plan handles landing pages, email capture, and funnels.
👉 If you're building a SaaS, start with Systeme.io's free plan →
4. Start with content, not product. I got lucky with the HN launch. More reliable: build an audience first, then build what they want.
The Key Insight
You don't need a revolutionary idea. You need:
- A real problem you understand personally
- The technical skill to solve it
- A way to reach the people who have that problem
Most developers have #1 and #2. They skip #3 and wonder why their side project fails.
Content marketing + affiliate programs + organic SEO = repeatable, compounding traffic.
Start writing comparison articles. Start recommending the tools you use. The money follows the value.
Have you built a side project that generates revenue? What's working for you? Comments open — I read every single one.
Top comments (0)