Announcing the Magic Pages Open House. Quarterly calls with our team!

Skip to the documentation

Episode metadata generator

Generate the exact Ghost code-injection block Pod needs for each episode — chapters, duration, Podcasting 2.0 tags. Live preview, copy-paste ready.

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.

Output 0 markers
Code injection → Foot

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 in HH:MM:SS. Almost every podcast app displays this next to your episode title.
  • pod:episodeTypefull, 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:

  1. Open the episode's post in Ghost admin.
  2. Click the settings cog in the top-right of the editor.
  3. Scroll to Code injection and expand the Foot field.
  4. 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.

Back to the Pod theme

Jannis, founder of Magic Pages

Didn't find your answer?

Ask us anything — a real person reads every message, usually the same day.

Email support