A simple, beautiful podcast player for your personal podcast collection. Built as a static site that runs entirely on GitHub Pages—no server needed, no monthly fees.
- 📱 Mobile-first design - Clean, responsive interface optimized for phones
- 🎧 Automatic updates - Fetches your podcast feeds daily and updates the playlist
- 💾 Remembers your spot - Pick up right where you left off, even after closing your browser
- ⚡ Fast & lightweight - Static site with optimized images (WebP format)
- 🌓 Light/dark mode - Automatically matches your system theme preference
- 🔒 Privacy-focused - All playback data stays in your browser, nothing tracked
Want your own podcast player? Here's how to set it up (no coding required):
- Click the green "Use this template" button at the top of this page
- Name your repository (e.g.,
my-podcasts) - Make it public (required for free GitHub Pages)
- Go to gist.github.com and create a new Gist
- Add your podcast RSS feed URLs, one per line:
https://feeds.example.com/podcast1.xml https://feeds.example.com/podcast2.xml - Save the Gist (can be public or secret)
- Copy the Gist ID from the URL (e.g.,
https://gist.github.com/YOUR-USERNAME/GIST-ID) and form the raw URL like this:Using this format (without a commit hash) ensures the workflow always fetches the latest version of your feed list.https://gist.githubusercontent.com/YOUR-USERNAME/GIST-ID/raw/feeds.txt
- In your repository, go to Settings → Pages
- Under "Source", select GitHub Actions
- In your repository, go to Settings → Secrets and variables → Actions → Variables tab
- Click "New repository variable"
- Name:
FEED_GIST_URL - Value: Paste your raw Gist URL from step 2
- Click "Add variable"
- Go to the Actions tab in your repository
- Click on "Build and Deploy" in the left sidebar
- Click "Run workflow" → "Run workflow"
- Wait 1-2 minutes for it to complete
- Your player will be live at
https://YOUR-USERNAME.github.io/YOUR-REPO-NAME/
🎉 That's it! Your player will now update automatically every day at 5 PM ET.
The player fetches new episodes daily at 5:00 PM ET (22:00 UTC). To change this:
- Edit
.github/workflows/build.yml - Find the line with
cron: '0 22 * * *'(line 5) - Update the cron schedule (crontab.guru is helpful)
- Commit and push your changes
Just edit your Gist and add/remove feed URLs. The next scheduled build (or manual run) will pick up the changes.
You can trigger a build anytime:
- Go to Actions tab → Build and Deploy
- Click "Run workflow"
Want to customize the code? Here's how to run it locally:
- Deno (latest)
git clone <your-repo-url>
cd typod
deno installdeno task devOpens at http://localhost:5173. Uses sample data from public/data/episodes.json.
deno task test# Create a .env file with your Gist URL
echo "FEED_GIST_URL=<your-gist-url>" > .env
deno task fetch-feeds
deno task devdeno task buildOutput goes to dist/. Preview with deno task preview, or serve with deno task serve.
- Build time: GitHub Actions fetches RSS feeds, resizes artwork to WebP, merges episodes into a single sorted JSON file
- Runtime: Vanilla TypeScript reads the static JSON, renders the episode list, plays audio via HTML5
<audio>, saves state to localStorage - Stack: Deno, Vite, TypeScript, Vitest, Sharp (image processing)
- Styling: Mobile-first CSS with warm color palette, Source Serif 4 headings
MIT - feel free to use this for your own podcast player!