# How to Vibe Code Your Own Captivate.fm (and Stop Paying for It)

> Unlimited podcast hosting and growth platform

- Site: https://captivate.fm
- Category: SaaS / Audio & Media Hosting
- Verdict: **Solid side project** (62/100 vibecodeable)
- Estimated effort: 3-4 weeks of focused development

## Verdict

You can build a functional personal podcast host and RSS generator, but managing massive audio file bandwidth and accurate IAB analytics will test your infrastructure limits.

Building a personal clone of Captivate's core loop—uploading audio, generating valid RSS feeds, and tracking basic download stats—is entirely feasible for a solo developer with AI assistance. However, replicating the exact IAB-certified bot filtering engine, dynamic ad insertion (AMIE), and absorbing high audio egress bandwidth without commercial CDN backing turns this into a serious systems engineering exercise. For personal use, storing MP3s in an S3 bucket with Cloudflare caching works nicely, but do not expect to run a commercial ad network out of the box.

### What you can't replicate

- Direct programmatic integration with the DAX and global audio advertising marketplace
- Institutional media network relationships (Global group backing)
- Guaranteed zero-downtime audio delivery for millions of concurrent listener requests

## What it does

A feature-rich podcast hosting, analytics, distribution, and monetization platform with built-in dynamic ad insertion, private podcasting, and creator tools.

### Core features

- Multi-show account management and episode uploader
- Automated RSS/XML podcast feed generation (Podcasting 2.0 compliant)
- Audio file cloud hosting with high-bandwidth CDN delivery
- IAB-certified analytics engine (filtering bots and pre-fetches)
- Dynamic ad insertion (AMIE engine) and campaign timing
- Embeddable podcast web player and customizable podcast websites
- Private podcasting with secure access tokens
- Membership, tipping, and monetization management

## The business

### Pricing

- Personal: £17/mo — Covers up to 30,000 downloads per month with unlimited shows and storage.
- Professional: £41/mo — Covers up to 150,000 downloads per month.
- Business: £87/mo — Covers up to 300,000 downloads per month for growing networks.

Founded 2019.
Team size: 7-10.

## The hard parts

- Audio CDN Bandwidth Costs: Storing and serving massive MP3 files globally scales storage and egress expenses rapidly as downloads grow.
- IAB-Certified Analytics Filtering: Server logs alone fail; you must implement rigorous user-agent filtering, bot detection, and pre-fetch stripping according to IAB Tech Lab standards.
- Dynamic Audio Splicing (AMIE): Splicing targeted ad files into audio streams on the fly or during request time requires robust media processing infrastructure.
- RSS Feed Ecosystem Consistency: Maintaining strict XML formatting that aggregates seamlessly across Apple Podcasts, Spotify, and Amazon without breaking indexers.

## How to vibe code Captivate.fm

### Prerequisites

- Node.js (free): Runtime environment for the Next.js full-stack web application.
- GitHub (free): Source code repository and deployment hook source.
- Cloudflare Account (free tier / $5/mo): Object storage (R2) for hosting MP3 audio files with zero egress fees.

### Recommended AI tools

- Claude Code: Best-in-class agentic coding tool for scaffolding complex multi-file Next.js apps, database schemas, and RSS parsers.
- Cursor: Ideal AI-native code editor for refining the dashboard UI, audio player components, and analytics charts.

### Stack

- Frontend: Next.js with Tailwind CSS and shadcn/ui
- Backend: Next.js Server Actions and API Routes
- Database: Turso (libSQL/SQLite at the edge for relational metadata)
- Auth: better-auth
- Payments: Stripe
- Other: Cloudflare R2 for MP3 audio storage, Resend for transactional email notifications, PostHog for product analytics

### Hosting

- Vercel (Hosting the Next.js dashboard, API routes, and public RSS endpoints): $0-20/mo
- Cloudflare (R2 object storage for podcast audio files with zero egress fees): $0-5/mo

### Build guide

1. **Project Scaffolding & Database Schema** — Initialize the Next.js 16 project with Tailwind CSS, shadcn/ui, better-auth, and Turso database connection. Define database tables for users, podcasts, episodes, and download analytics.

```
Initialize a new Next.js 16 project using TypeScript, App Router, and Tailwind CSS. Set up better-auth with email/password authentication. Configure Turso (libSQL) as the database with Drizzle ORM. Create the database schema with tables for users, podcasts (id, title, description, coverImage, author, customDomain), episodes (id, podcastId, title, description, audioUrl, duration, fileSize, publishDate, guid), and download_logs (id, episodeId, ipAddress, userAgent, timestamp, country). Create a clean dashboard layout shell with sidebar navigation for Shows, Episodes, Analytics, and Settings.
```

2. **Podcast Show & Episode Management** — Build the interface and backend actions for creating podcasts, uploading audio files directly to Cloudflare R2 via presigned URLs, and saving episode metadata.

```
Implement podcast show creation and episode management inside the Next.js app. Build a form to create a new podcast show (title, artwork, category, language). Implement an episode creation workflow where users upload audio files (.mp3) via presigned URLs directly to Cloudflare R2 storage. Extract audio duration and file size on upload completion, and persist episode records to the Turso database linked to the selected podcast show. Provide an episode list view with edit, delete, and publish scheduling options.
```

3. **RSS & Podcast 2.0 Feed Generator** — Create dynamic XML routes that generate valid podcast RSS feeds conforming to Apple Podcasts, Spotify, and Podcasting 2.0 specifications.

```
Build a dynamic API route in Next.js at `/feed/[podcastId]` that outputs a valid XML RSS feed for any given podcast. The XML must include standard iTunes tags (`itunes:author`, `itunes:summary`, `itunes:image`, `itunes:explicit`, `itunes:category`), proper enclosure tags pointing to the Cloudflare R2 audio URLs with accurate `length` and `type="audio/mpeg"` attributes, and Podcasting 2.0 namespace support. Ensure correct XML escaping and proper caching headers so podcast aggregators can poll updates reliably.
```

4. **Audio Enclosure Redirect & Analytics Engine** — Build a tracking redirect endpoint that logs download requests, filters basic bots/scrapers, and redirects the listener to the R2 audio file.

```
Create a tracking redirect endpoint at `/listen/[episodeId]` that logs every download request before redirecting the user-agent with a 302/307 status to the underlying Cloudflare R2 MP3 URL. In the logging logic, extract the User-Agent, IP address, and timestamp. Implement a basic bot-filtering filter to exclude known scrapers, curl requests, and duplicate rapid requests from the same IP within a rolling window to approximate IAB-compliant counting. Save clean download events to the `download_logs` table.
```

5. **Analytics Dashboard & Charts** — Develop an analytics dashboard displaying total downloads over time, top episodes, geographic distribution, and device breakdown using interactive charts.

```
Build an analytics dashboard page in the Next.js app that queries the `download_logs` table. Display summary metric cards (Total Downloads, Unique Listeners, Active Shows). Implement interactive time-series charts (using Recharts or Tailwind-friendly chart components) showing downloads over selectable date ranges (7 days, 30 days, all time). Add breakdown tables for Top Episodes, User Devices (Apple Podcasts, Spotify, Web), and Geographic locations parsed from request headers or IP metadata.
```

6. **Embeddable Web Player & Polish** — Create a responsive, embeddable HTML5 audio player widget that creators can drop onto external websites, along with final UI polish.

```
Build a lightweight, responsive embeddable audio player page at `/embed/[episodeId]` designed to be inserted via an iframe on external websites. The player should feature play/pause controls, a scrubbable progress bar, time elapsed/remaining displays, and podcast artwork. Ensure the player triggers an endpoint log when playback starts so web player streams are captured accurately in the analytics engine. Polish the main SaaS dashboard with clean loading states, empty states, and error handling.
```

### Cost vs paying

**Starting costs (one-time):**

- Custom Domain (optional): $12/year
- AI Coding Credits: $20
- Total: ~$32 one-time

**Ongoing costs (monthly):**

- Vercel Hobby / Cloudflare: $5/mo
- Total: ~$5/mo

- Paying for the SaaS instead: £17 - £87/mo (~$22 - $115/mo)
- Build time: 35-50 hours
- AI tool credits: $20 (one month of Claude Pro / Cursor)
- Break-even: Less than 1 month

## Sources

- [Captivate.fm Official Website & Features](https://captivate.fm)
- [PitchBook Profile - Captivate Audio](https://pitchbook.com/profiles/company/15392-45)
- [Podnews Weekly Review - Interview with Mark Asquith on Global Acquisition](https://podnews.net)