DEV Community

ZNY
ZNY

Posted on

How I Built a Side Project That Makes $500/Month — Full Stack Breakdown

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
Enter fullscreen mode Exit fullscreen mode

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:

  1. OpenAPI specs are JSON/YAML — Python handles this natively
  2. Pydantic validation is excellent
  3. 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)
Enter fullscreen mode Exit fullscreen mode

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()
);
Enter fullscreen mode Exit fullscreen mode

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:

  1. Developer communities (Hacker News, Dev.to, Reddit r/webdev)
  2. Content marketing (tutorials on how to write better API docs)
  3. SEO (ranking for "OpenAPI documentation tool" and related terms)
  4. Affiliate links (I recommend the tools I use — Systeme.io for my marketing site, Railway for hosting)

What didn't work:

  1. Cold outreach (ineffective for a developer tool)
  2. Paid ads (CPC too high for niche B2D software)
  3. 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:

  1. A real problem you understand personally
  2. The technical skill to solve it
  3. 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)