DEV Community

Torin T
Torin T

Posted on

How I run a video-transcription SaaS on Cloudflare's free tier + one $5 VPS

Every "video to text" tool I tried wanted a sign-up, a subscription, or capped me at 30 seconds. So I built Scriptery — paste a link or upload a file, get a timestamped transcript, export TXT/SRT/VTT, no account. The interesting part isn't the product, it's that it runs at near-zero infrastructure cost, and I want to break down exactly how.

The constraint

One rule: the web app stays on Cloudflare's free tier. The only paid infra is a single $5/mo VPS. That constraint shaped every decision below.

The stack

  • One Cloudflare Worker serves everything — the SSR frontend (TanStack Start) and the /api/* backend (Hono) run in the same Worker. No separate server, no container.
  • Workers AI (Whisper) for transcription — @cf/openai/whisper-large-v3-turbo. On the free tier this is genuinely free within the daily neuron allowance.
  • D1 (SQLite at the edge) for users, transcripts, a credits ledger, and orders.
  • KV for rate limiting (anonymous daily quota, double-keyed by IP + cookie, plus a site-wide cap).
  • A $5 VPS running yt-dlp behind a tiny FastAPI service. Workers can't run yt-dlp, and datacenter IPs get bot-checked by YouTube, so extraction lives on the VPS. It returns either captions JSON (skip Whisper) or an audio stream to transcribe.

The pipeline

  1. User pastes a link, and a per-platform extractor picks a strategy.
  2. Most platforms go to the VPS (/extract) via yt-dlp.
  3. If the platform already has captions, we return those and skip Whisper (faster and cheaper).
  4. Otherwise the VPS streams audio back to Workers AI Whisper for timestamped segments.
  5. Client-side formatting into TXT / SRT / VTT, with no server round-trip for exports.

Things that bit me

  • YouTube via datacenter IP is the weakest link — bot checks, PO tokens. Budget for a proxy pool before you scale.
  • TikTok has no clean API, so it's a page-internals parser that breaks whenever they reshuffle their hydration JSON.
  • Facebook only works for Reels, Twitch only for clips — full VODs blow the duration budget.
  • Keeping the free tier free means failed transcriptions must never consume quota or credits — easy to get wrong in the ledger.

Was it worth it?

For a bootstrapped tool, absolutely. The marginal cost of a new user is basically zero until real scale, so the free tier can stay free and the paid tier is pure margin. The $5 VPS is the whole server bill.

Happy to answer questions about the transcription pipeline, the Cloudflare setup, or the yt-dlp cat-and-mouse.

(Try it: scriptery.app — free, no sign-up.)

Top comments (0)