Hosting one show is a feed, a pile of audio files and a counter. An agent builds that in a day: a valid RSS feed with the iTunes and podcast tags, audio in a bucket, and a redirect that logs each download. The weekend goes to what listeners and sponsors notice: stats with bot filtering that advertisers believe, a server that is up whenever any app fetches an episode, and the odd failures of directories. Dynamic ads, private feeds at scale and video stay out of reach. Castopod covers the same ground self-hosted, with a podcast site and audience features included.
Before you buildTransistor has no free plan. For a first show with few listeners, running Castopod yourself costs less than $19, but you take on the uptime.
Build me a podcast host for my own show to replace Transistor. Requirements: - Node.js 22 + TypeScript: a Fastify server with server-rendered admin pages (Eta). `npm start` serves http://localhost:4850: admin at /admin, feeds at /feed/<show>.xml, audio at /m/<episode-id>.mp3 and a plain page per show at /<show>/. - Storage: better-sqlite3 in ./data/host.db for shows, episodes (title, notes, season, number, pubDate, duration, explicit, guid) and download events. Audio lives in an S3-compatible bucket (`@aws-sdk/client-s3`, bucket and keys in .env) or in ./data/audio/ when none is set. - Upload: an admin form that sends audio to the bucket through a presigned URL, reads duration, size and cover art with `music-metadata`, and supports a scheduled publish time. - Feed: RSS 2.0 built with `xmlbuilder2`, with iTunes tags, the podcast: namespace (guid, season, transcript, chapters) and an enclosure with url, length and type. GUIDs never change, and FEED_BASE_URL in .env lets the feed sit on my own domain so the host can move later. - Downloads and stats: /m/<id>.mp3 logs one row and then answers 302 to the file. Count a download once per salted IP hash plus user agent per 24 hours, skip HEAD requests and known bots, and store no raw IPs. Show downloads per episode per day, the listening apps from user agents, and a CSV export. - Private feeds: one tokenised feed URL per subscriber, with a revoke button. - Single user. No accounts, no telemetry, local-first. - Out of scope: dynamic ad insertion, video, transcription, directory submission, a website builder. - README: submitting the feed to Apple Podcasts and Spotify by hand, setting a 301 redirect when moving hosts, and a warning that every listener's app breaks when this server is down.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Transistor.
Add a feed importer to the podcast host in this folder. Requirements: - A command `npm run import:feed <rss-url> --show <slug>` that reads the existing feed, downloads each enclosure into the bucket, and creates episodes with the original title, notes, pubDate, GUID, season, number, explicit flag and cover art. - Never change a GUID, and print a table of imported, skipped (already present) and failed items. - Show the new feed URL and the exact steps for putting a 301 redirect on the old host. - Run in dry-run mode unless --write is given. - Update the README.
Add transcripts and chapters to the podcast host in this folder. Requirements: - Per episode, upload a .vtt or .srt transcript and a chapters JSON in the podcast namespace format; store them in the bucket and reference them from the feed with `podcast:transcript` and `podcast:chapters`. - Validate files on upload: parse the transcript timestamps and reject chapters that overlap or exceed the duration. - Show the transcript on the episode page with timestamps that link to the audio position. - Update the README with the file formats.
Add a weekly stats email to the podcast host in this folder. Requirements: - Every Monday at 08:00, email me downloads for the last 7 days per episode, the top five listening apps and the change compared with the previous week, from SQLite. - Use nodemailer with SMTP settings from .env and a plain-text version of every message. - A "send now" button in admin and a switch to turn the email off. - Update the README.
A podcast host is infrastructure listeners never think about: if the file doesn't load, the episode doesn't play. People pay for the feed that always works, stats they can show a sponsor, and live support when something breaks, at a price that stays small next to what a show earns or costs to make.
Estimate · A small VPS is about $5; audio storage for a show of a few dozen episodes is cents to a few dollars. Bandwidth is free on some object stores, not all. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Starter | $19 | $15.83 | Unlimited shows and team members, 20K downloads a month, 50 private-podcast subscribers, advanced analytics, API, built-in podcast website and network website, live support. |
| Professional | $49 | $40.83 | 100K downloads a month, 500 private-podcast subscribers, dynamic ads (pre-, mid- and post-roll), dynamic show notes, auto-post to YouTube. |
| Business | $99 | $82.50 | 250K downloads a month, 3K private-podcast subscribers, everything in Professional plus branding removal. |
| Enterprise | $199 | $165.83 | For more than 250K downloads a month or more than 3K private subscribers; custom limits. |
No free plan; every plan starts with a 14-day free trial.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: Download counts that sponsors accept, with bot and duplicate filtering maintained for you, Dynamic ad insertion for pre-, mid- and post-roll spots.
About $19 a month on the Starter plan, $228 a year (checked 2026-10-19).
Download counts that sponsors accept, with bot and duplicate filtering maintained for you; Dynamic ad insertion for pre-, mid- and post-roll spots; Live support from real people when something breaks; Private podcasts for teams or paying listeners at scale, and video podcast hosting; A fast global network that keeps episodes playing when you are asleep. If any of those matter to you, keep paying.
Yes: Castopod (open source), Podlove Publisher (open source).