Every episode you publish with Pod carries a small block of HTML comments in Ghost admin → your episode post → Post settings → Code injection → Foot. Pod's RSS template parses those comments on render, so this is where episode number, duration, chapter timestamps, transcripts and every Podcasting 2.0 tag come from.
The tool below builds that block for you. Fill in the fields, hit Copy, paste. That's it — no memorising the marker syntax.
Fill in the fields on the left. The block of pod:* markers on the right updates as you type. When it looks right, hit Copy and paste the block into Ghost admin → your episode post → Post settings → Code injection → Foot.
The basics
Audio file
The fetch works when your audio host allows CORS. If it fails, right-click the MP3 → Get info (macOS) or Properties (Windows) and copy the byte count manually.
Chapters
Timestamped chapter markers. Rendered by Apple Podcasts, Overcast, and Pocket Casts as an inline chapter list. Also emitted as the Podcasting 2.0 <podcast:chapters> in-feed format.
Optional. These are rendered by Podverse, Fountain, CurioCaster and the Podcast Index website — most listeners won't see them today, but they're what makes a modern feed feel modern.
One transcript file per format / language. VTT and SRT both work.
Hosts, guests, credits. Role defaults to host.
Paste this into your episode's Post settings → Code injection → Foot. Pod's RSS template reads every marker on render.
What each marker does
The basics
pod:episode— episode number. Emitted as both<itunes:episode>and<podcast:episode>.pod:season— season number. Ships as<itunes:season>+<podcast:season>.pod:duration— episode length inHH:MM:SS. Almost every podcast app displays this next to your episode title.pod:episodeType— full, trailer, or bonus. Apple Podcasts uses this to group trailers separately.pod:explicit— per-episode override of the show-level explicit flag. Leave blank to inherit from your Pod theme settings.
Audio file
pod:audio— the URL of the MP3. Skip this and Pod uses the first<audio>element in your post body — normally the audio card you inserted in Ghost's editor, which is what you want.pod:audioLength— file size in bytes. Strict RSS validators warn when this is missing, and download-progress bars in podcast apps use it to show accurate percentages. The generator's Fetch from URL button reads it automatically over the network when your host allows CORS.
Chapters
pod:chapter=HH:MM:SS|Title — repeatable. Each marker becomes one chapter. Pod emits them as Podlove Simple Chapters (PSC), which Apple Podcasts, Overcast, Pocket Casts and Spotify all understand. They also drive the client-side chapter list on the episode page — click a chapter, the audio player jumps.
Podcasting 2.0 tags
Podcasting 2.0 is a set of RSS extensions that modern apps — Podverse, Fountain, CurioCaster, the Podcast Index — use for transcripts, cross-platform identity, per-episode credits, and micro-payments. None of them are required, but populating what you can matters more the further you move from Apple Podcasts.
pod:chapters— URL to a chapters JSON file (Podlove Simple Chapters format). Publisher-hosted; useful if your chapters have images or links attached.pod:transcript=URL|MIME|LANG— repeatable. VTT and SRT both work. Language defaults to en if unset.pod:person=Name|Role|Href|Img— repeatable. Role defaults to host. Use it for guests, co-hosts, editors, credits.pod:socialinteract— a URL to a Mastodon post (or Bluesky, or any activitypub root) where discussion about the episode lives. Fediverse-native apps thread replies underneath.
Where to paste the output
Once you've hit Copy:
- Open the episode's post in Ghost admin.
- Click the settings cog in the top-right of the editor.
- Scroll to Code injection and expand the Foot field.
- Paste the block. Save.
The next request to your /podcast/rss/ feed picks up the new markers. Each of them shows up as either a top-level RSS tag on that episode's <item> or hydrates a client-side surface on the episode page (chapter list, duration badge, cover-tile fallback text).
Your data stays in the browser
The generator persists your last-used values to your browser's localStorage so you don't lose work on refresh, but nothing is sent to a server. No accounts, no tracking, no rate limits. You can also open the browser's dev tools, run localStorage.removeItem('pod-generator-state-v1'), and start fresh.