zPodRSS first. Bandwidth off the bill.

How zPod Is Built

Infrastructure for the curious. Product pages stay in buyer words. This page names vendors.

Switch to zPod

Host-by-host migration checklists: inventory, create the show, Settings → Advanced → Import From RSS, verify GUIDs, 301 the old host, update directories, soak 3–4+ weeks, then decommission. Do not delete the old show early.

Open Switch Checklists

API

Scoped Bearer tokens for scripts and agents. Create draft episodes, upload audio with a presigned PUT, attach artwork, chapters, and transcripts, set a soundbite, then publish or schedule with an explicit publish scope. Official MCP is a client-run package over the same API. HTTPS webhooks are signed with HMAC-SHA256. Canonical feeds are https://rss.podfora.com/{slug}-{id}.

API Docs OpenAPI

Durable Feeds

Your public RSS URL uses a vanity name plus a permanent 6-character id ({slug}-{id}). The public show page uses the same token at /s/{slug}-{id}. Pretty show URLs without the id are a later paid add-on. Enclosure URLs stay put. Directories keep the same feed identity. Episode files keep the same enclosure address. Storage names never appear in public URLs.

Episode GUID

Every episode has a GUID, short for globally unique identifier. It is a permanent id that the RSS feed carries with the episode. Podcast apps use it to tell episodes apart, so an episode stays the same episode for listeners even when its title, notes, artwork, or audio change.

A GUID never changes. A new GUID would make apps treat the episode as brand new, so subscribers would see it again and download it twice. zPod mints a GUID when you create an episode, and Import From RSS keeps the GUID your old host used. You can type your own only when you create an episode; after that the studio shows it read-only.

Directory Categories

Show topics follow the Apple Podcasts category list. Studio Settings has three Directory Category pickers (primary required; secondary and tertiary optional). Each slot is a category dropdown plus a filtered subcategory. The public feed writes up to three nested itunes:category blocks in that order. Apple Podcasts uses the first two; the third is for other directories. Podcasting 2.0 has no podcast:category tag here.

Category Subfeeds

Show Categories in Studio mint a public RSS facet at https://rss.podfora.com/{slug}-{id}/c/{categorySlug} (alias /feeds/{slug}-{id}/c/{categorySlug}.xml). Same show metadata and podcast:guid as the parent feed; items are published playable episodes in that category. Distinct atom:self. Episode GUIDs and /e/{id} enclosure URLs do not change. Listener convenience — paste the subfeed into an app. Do not submit category URLs to Apple or Spotify. Tags are out of scope. Personal Feeds (/feeds/p/…) are unchanged.

The Worker

One Cloudflare Worker (zpod) serves the studio, public sites, RSS, and media Range/HEAD. Production origin is https://zpod.cc. Canonical public feeds are https://rss.podfora.com/{slug}-{id}. When a vanity path is set, that URL is the only 200. rss.zpod.cc is a backup host and 301s to the matching rss.podfora.com URL.

Audio Files

Audio masters live in Cloudflare R2. New shows get a dedicated per-show bucket. Public enclosure URLs (/e/{episodeId}) never move and never expose storage names. Browser download names are a Content-Disposition preference on the show (generated, original, or a per-episode custom name) and do not rename stored objects. A shared legacy bucket remains only for older rows.

Video

Cloudflare Stream is the future video layer (HLS, live, Apple HLS), billed by stored and delivered minutes. Video is a separate product family. Video plans include audio hosting for your shows. Coming soon. Originals still land in object storage first.

Accounts

Postgres on DigitalOcean, reached through Cloudflare Hyperdrive. Studio sign-in is password, email link, or passkey, with optional authenticator-app codes. Owners and admins invite people from People with a single-use email link that expires after seven days; members and pending invites count against the plan's seats.

Measurement

Each audio request is written to Workers Analytics Engine and to a short-lived download ledger in Postgres. A per-minute job folds the ledger into daily totals and deletes the folded rows; the daily totals are what the studio reports. Unique listeners increment on the first GET identity (IP hash + user-agent hash) per episode per UTC day. Studio charts label those UTC days in the show's IANA timezone; changing timezone does not rewrite stored day keys.

Transactional Email

Outbound mail uses Cloudflare Email Sending. The send domain is mail.zpod.cc. Platform mail comes from noreply@mail.zpod.cc (or another address on that host). Apex zpod.cc stays for real mailboxes. Studio auth mail covers email-link sign-in, password reset, and email change. Passkeys and authenticator-app codes are not emailed.

IAB counting methodology · Terms · Privacy