|
| 1 | +--- |
| 2 | +title: "Introduction to Wavecast RSS Feeds" |
| 3 | +program: "Wavecast Demo" |
| 4 | +episode: "S1E1" |
| 5 | +date: 2026-06-01 |
| 6 | +tags: [Wavecast, Hugo, Podcasting, RSS] |
| 7 | +podcast: |
| 8 | + src: "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3" |
| 9 | + poster: "https://picsum.photos/seed/wavecast-rss/400/400" |
| 10 | + chapters: "00:00:00-Intro,00:00:30-How It Works,00:01:20-Episode Front Matter,00:02:10-Channel Config,00:02:45-Validating the Feed" |
| 11 | + type: "audio/mpeg" |
| 12 | + duration: "00:03:45" |
| 13 | + season: 1 |
| 14 | + episode: 1 |
| 15 | + explicit: false |
| 16 | + author: "Wavecast Radio" |
| 17 | + guid: "wavecast-demo-s1e1" |
| 18 | + episodeType: "full" |
| 19 | + subtitle: "Learn how Wavecast generates iTunes-compatible podcast RSS feeds from Hugo content." |
| 20 | +show_notes: |
| 21 | + - "[W3C Feed Validator](https://validator.w3.org/feed/): validate your RSS feed before submitting to directories" |
| 22 | + - "[Apple Podcasts Connect](https://podcastsconnect.apple.com/): submit your podcast to Apple Podcasts" |
| 23 | + - "[Hugo RSS Templates](https://gohugo.io/templates/rss/): Hugo's official RSS template documentation" |
| 24 | +attribution: |
| 25 | + text: "Wavecast RSS Demo" |
| 26 | + url: "https://github.com/adurrr/wavecast" |
| 27 | +--- |
| 28 | + |
| 29 | +This episode demonstrates how Wavecast automatically generates |
| 30 | +iTunes-compatible podcast RSS feeds when you configure |
| 31 | +`[params.podcast]` in your Hugo site config. |
| 32 | + |
| 33 | +## How It Works |
| 34 | + |
| 35 | +Wavecast ships `layouts/_default/rss.xml`, a single template that handles both |
| 36 | +standard blogs and podcast feeds. At build time, the template checks your |
| 37 | +`[params.podcast]` config: |
| 38 | + |
| 39 | +<div class="info-card" style="margin:1.5rem 0"> |
| 40 | + |
| 41 | +**Detection rules:** |
| 42 | + |
| 43 | +| Condition | Behaviour | |
| 44 | +|------------------------------------------|------------------------------------------------------| |
| 45 | +| `[params.podcast]` has `author`, `image`, or `description` | Renders a **full iTunes podcast RSS** feed (with `itunes:` namespace, categories, owner, artwork) | |
| 46 | +| `[params.podcast]` is missing or empty | Renders a **plain RSS 2.0** feed suitable for blogs | |
| 47 | +| Page has `podcast.src` in its front matter | Included as an `<item>` with an `<enclosure>` element | |
| 48 | +| Page has no `podcast.src` | Skipped entirely (not a podcast episode) | |
| 49 | + |
| 50 | +</div> |
| 51 | + |
| 52 | +There is no toggle or flag to set. If your site config defines podcast metadata, |
| 53 | +you get a podcast feed. If it does not, you get a blog feed. Both work from the |
| 54 | +same single template. |
| 55 | + |
| 56 | +Episodes with a local audio file (e.g. `src: "audio/episode.mp3"`) get their |
| 57 | +`<enclosure>` file size auto-resolved via Hugo resources. Remote URLs default to |
| 58 | +`length="0"`, which is valid RSS and accepted by all major podcast directories. |
| 59 | + |
| 60 | +## Episode Front Matter |
| 61 | + |
| 62 | +All iTunes-specific fields live under the `podcast:` key in your episode's |
| 63 | +YAML front matter: |
| 64 | + |
| 65 | +```yaml |
| 66 | +podcast: |
| 67 | + src: "https://example.com/audio/ep42.mp3" # required |
| 68 | + type: "audio/mpeg" # MIME type |
| 69 | + duration: "00:45:00" # HH:MM:SS or seconds |
| 70 | + season: 2 # season number |
| 71 | + episode: 42 # episode number |
| 72 | + explicit: false # "true" or "false" |
| 73 | + author: "Guest Host" # overrides site-level |
| 74 | + guid: "unique-ep-42" # falls back to permalink |
| 75 | + episodeType: "full" # full|trailer|bonus |
| 76 | + subtitle: "A short episode teaser" # max 255 chars |
| 77 | + summary: "Full episode description" # max 4000 chars |
| 78 | +``` |
| 79 | +
|
| 80 | +Standard Hugo fields (`title`, `date`, `tags`, `summary`) are pulled from |
| 81 | +the regular front matter automatically. |
| 82 | + |
| 83 | +## Channel Configuration |
| 84 | + |
| 85 | +Site-level podcast metadata goes in your `hugo.toml`: |
| 86 | + |
| 87 | +```toml |
| 88 | +[params.podcast] |
| 89 | + author = "Your Name" |
| 90 | + image = "/podcast-cover.jpg" # min 1400x1400px recommended |
| 91 | + description = "A weekly show about open-source." |
| 92 | + explicit = false |
| 93 | + type = "episodic" # "episodic" or "serial" |
| 94 | + owner_name = "Your Name" |
| 95 | + owner_email = "you@example.com" |
| 96 | +
|
| 97 | + [[params.podcast.categories]] |
| 98 | + category = "Technology" |
| 99 | +``` |
| 100 | + |
| 101 | +## Validating the Feed |
| 102 | + |
| 103 | +Once your site is live, validate your feed: |
| 104 | + |
| 105 | +1. Visit [validator.w3.org/feed](https://validator.w3.org/feed/) |
| 106 | +2. Enter your site's feed URL (usually `/index.xml`) |
| 107 | +3. Fix any warnings before submitting to directories |
| 108 | + |
| 109 | +The feed is ready for **Apple Podcasts**, **Spotify**, **Google Podcasts**, |
| 110 | +and any RSS-compatible podcast app. |
| 111 | + |
| 112 | +<div class="nav-buttons" style="margin-top:1.5rem"> |
| 113 | + <a href="/wavecast/index.xml" class="nav-button nav-button-primary" target="_blank" rel="noopener"> |
| 114 | + <svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" style="vertical-align:middle"><path d="M6.18 15.64a2.18 2.18 0 0 1 2.18 2.18C8.36 19 7.38 20 6.18 20C5 20 4 19 4 17.82a2.18 2.18 0 0 1 2.18-2.18M4 4.44A15.56 15.56 0 0 1 19.56 20h-2.83A12.73 12.73 0 0 0 4 7.27V4.44m0 5.66a9.9 9.9 0 0 1 9.9 9.9h-2.83A7.07 7.07 0 0 0 4 12.93V10.1Z"/></svg> |
| 115 | + View RSS Feed |
| 116 | + </a> |
| 117 | + <a href="https://validator.w3.org/feed/" target="_blank" rel="noopener" class="nav-button">Validate Feed</a> |
| 118 | +</div> |
0 commit comments