Podcast RSS feed generator for General Conference audio from The Church of Jesus Christ of Latter-day Saints.
Add a feed URL to your podcast app:
English:
https://nanodba.github.io/gc_podcast/audio.xml
Spanish:
https://nanodba.github.io/gc_podcast/audio-es.xml
Portuguese:
https://nanodba.github.io/gc_podcast/audio-pt.xml
Works with Apple Podcasts, Overcast, Pocket Casts, Castro, and any RSS reader.
Note: If you fork this repo, your feed URLs will be at
https://YOUR_USERNAME.github.io/gc_podcast/audio.xml
- Full Sessions: Complete 2-hour session recordings with all talks and music
- Individual Talks: Each speaker's talk separately (10-20 min)
- Per-Episode Artwork: Speaker portraits appear next to each talk in supported podcast clients (
<itunes:image>per item) - Conference-Branded Channel Art: Channel artwork rotates each April/October to match the current conference's hero imagery
- Podcasting 2.0 compliant: Stable
<podcast:guid>derived from the feed URL so clients can track you across URL changes - Three Languages: English, Spanish, Portuguese — each a separate feed with its own audio
- Recent Conferences: The feed auto-updates as new conferences are published; default window is 2026+
- Fork this repository
- Enable GitHub Pages: Settings > Pages > Build and deployment > Source:
GitHub Actions - Your feed will be at
https://YOUR_USERNAME.github.io/gc_podcast/audio.xml
npm install
# Scrape recent conferences (last 2 years)
npm run scrape-all -- --recent
# Or scrape a specific range
npm run scrape-all -- -s 2020 -e 2025
# Or scrape all available (1971+)
npm run scrape-all -- --all# Generate all language feeds
npm run feed -- --all-languages -b https://YOUR_USERNAME.github.io/gc_podcast
# Or single language
npm run feed -- -l eng -b https://YOUR_USERNAME.github.io/gc_podcastgit add output/ docs/
git commit -m "Update conference data"
git pushThe GitHub Actions workflow automatically checks for new conference content:
- Conference window (Apr/Oct 1-13): Checks 3x daily (8 AM, 12 PM, 8 PM MDT)
- Rest of year: Monthly check on the 15th
This schedule aligns with the Church's official release timeline:
- Full session audio: Gospel Library within 24 hours of each session
- Individual talks: Gospel Library by Wednesday after conference weekend
- All languages: Text within 2 weeks (audio varies)
To trigger manually: Actions > "Update Podcast Feed" > Run workflow
npm run dev -- -y 2024 -m 4 # April 2024
npm run dev -- -y 2025 -m 10 -l spa # October 2025, Spanishnpm run scrape-all # Last 5 years
npm run scrape-all -- --recent # Last 2 years
npm run scrape-all -- --all # All (1971+)
npm run scrape-all -- -s 2020 -e 2025 # Specific range
npm run scrape-all -- -l spa # Spanishnpm run feed # English only
npm run feed -- --all-languages # All languages
npm run feed -- -l spa -f ./docs/feed-spa.xml # Custom output
npm run feed -- --no-sessions # Talks only
npm run feed -- --no-talks # Sessions onlygc_podcast/
├── src/
│ ├── index.ts # CLI for single-conference scrape
│ ├── scraper.ts # Conference scraping (API-first w/ HTML fallbacks)
│ ├── scrape-all.ts # Batch scraping across year ranges
│ ├── rss-generator.ts # RSS / Podcasting 2.0 feed generator
│ ├── generate-feed.ts # CLI for feed generation
│ ├── generate-index.ts # CLI that builds docs/index.html from feed data
│ ├── image-extractor.ts # IIIF hash parsing + canonical image URL builder
│ ├── html-parser.ts # HTML parsing utilities
│ ├── languages.ts # Per-language channel config (eng/spa/por)
│ ├── logger.ts # Structured JSON logging
│ ├── migrations.ts # Schema version enforcement + migration registry
│ ├── schemas.ts # zod runtime validation for scraped data
│ ├── types.ts # TypeScript types
│ ├── uuid.ts # UUID v5 (for podcast:guid)
│ └── version.ts # Package version → RSS <generator> tag
├── output/ # Scraped conference JSON (one file per conf × language)
├── docs/ # GitHub Pages (auto-generated, committed)
│ ├── audio.xml # English feed
│ ├── audio-es.xml # Spanish feed
│ ├── audio-pt.xml # Portuguese feed
│ └── index.html # Landing page (generate-index.ts)
├── tests/ # vitest unit + integration tests
├── SPEC.md # Authoritative data-format & stability spec
└── .github/workflows/
├── update-feed.yml # Scheduled scrape + feed regeneration
├── codeql.yml # CodeQL security scanning
└── dependency-review.yml # PR dependency review
See SPEC.md for the authoritative data-format specification, stability guarantees, and change log.
Conference data is stored as JSON. See SPEC.md for the authoritative schema and stability guarantees.
{
"scraped_at": "2026-04-20T12:00:00.000Z",
"version": "1.0",
"conference": {
"year": 2026,
"month": 4,
"name": "April 2026 general conference",
"conference_image_url": "https://www.churchofjesuschrist.org/imgs/<hash>/square/3000,3000/0/default",
"sessions": [
{
"name": "Saturday Morning Session",
"audio": { "url": "...", "duration_ms": 7032458 },
"talks": [
{
"title": "Talk Title",
"image_url": "https://www.churchofjesuschrist.org/imgs/<hash>/full/!1400,1400/0/default.jpg",
"speaker": {
"name": "Elder Name",
"role_tag": "quorum-of-the-twelve",
"calling": "Of the Quorum of the Twelve Apostles",
"role_observed": "current",
"bio_url": "https://www.churchofjesuschrist.org/learn/elder-name?lang=eng",
"image_url": "https://www.churchofjesuschrist.org/imgs/<hash>/full/!1400,1400/0/default.jpg"
},
"audio": { "url": "...", "duration_ms": 795561 }
}
]
}
]
}
}| Role Tag | Description |
|---|---|
first-presidency |
President, First/Second Counselor |
quorum-of-the-twelve |
Members of the Quorum of the Twelve |
null |
All other speakers |
| Value | Meaning |
|---|---|
"current" (default) |
role_tag / calling reflect what the church page shows today. For older talks this may not match the speaker's role at the time they gave the talk. |
"at-time-of-talk" |
Role resolved to the calling active at the conference date (reserved for future enrichment). |
See SPEC.md §12.9 for the full temporal-role discussion.
The version field (currently "1.0") is enforced at runtime. A mismatched version causes both the scraper and the feed generator to refuse the file rather than silently consuming stale data. Add migrations under src/migrations.ts to support future bumps.
npm test # Run the full test suite (vitest)
npm run test:watch # Watch mode
npm run lint # ESLint (src + tests)
npm run format # Prettier write
npm run format:check # Prettier check (CI)Every push runs in CI:
- TypeScript type-check (
tsc --noEmit) - ESLint
- Full vitest suite
- CodeQL static analysis (JavaScript/TypeScript)
- Dependency review (pull requests)
See .github/SECURITY.md for security-reporting posture.
MIT
Unofficial project. This repository hosts code that generates podcast-friendly RSS feeds pointing at audio hosted by The Church of Jesus Christ of Latter-day Saints. Audio and imagery remain the property of their rightful owners; all URLs in the generated feeds hotlink back to churchofjesuschrist.org and/or CDNs.