Skip to content

Podcast (Bundled Extension) Since 3.6.0

totalcms/podcast — bundled with Total CMS, Standard edition and above. Ships the podcast (show) and podcast-episode schemas, serves a feed the directories accept without any page or template, and adds podcast_feed() for sites that want the feed on a page of their own. The RSS itself — the iTunes and Podcast Index tags — is part of core (cms.feed.rss() with a podcast block); the extension is the two schemas and the mapping from records to that block.

  1. Go to Admin → Extensions, find Podcast, click Enable (or run tcms extension:enable totalcms/podcast).
  2. Create an episodes collection from podcast-episode, then a Single Object Collection from podcast named podcast, and pick the episodes collection on the show record.
  3. Fill in the show and add episodes. The Podcasts page walks through every field.
AddressServes
/api/ext/totalcms/podcast/feedthe show in the collection named podcast
/api/ext/totalcms/podcast/feed/{show}the show in collection {show} — a site can host several

Both answer application/rss+xml with five minutes of caching, and 404 with a message when the show has no record or names no episodes collection. The address the feed is served at is its own self link and the seed of the show’s Podcast Index GUID; there is no field to fill in. Submit it to Apple Podcasts, Spotify and the open directories.

{{ podcast_feed() }}
{{ podcast_feed('second-show', {language: 'en-US', copyright: '© Joe'}) }}

The first argument is the show collection, default podcast; the episodes collection comes from the show record. The page’s own URL becomes the feed’s address. Options are link, language, copyright, now, and self to name a different address. Render it as the whole content of a page whose route ends in .xml and the router serves it with the right type.

The extension ships an agent skill. While it is enabled, tcms skill:install puts it at .claude/skills/totalcms-podcast/, so Claude Code and other coding agents working in the project know the two collections, the feed addresses, podcast_feed() and the mistakes above without being told. Enabling in the admin installs it at once; disabling removes it.

Before 3.6 the two schemas were reserved schemas in core and the call was cms.feed.podcast(show, episodes). Neither shipped in a release. The extension form keeps podcasting out of every install that does not need it, and doubles as the reference for shipping a whole content type as an extension.