by zarazhangrui
Turn any content into a personalized AI podcast. NotebookLM-style, except you control the script, voices, and hosts. Listen in Apple Podcasts, Spotify, or any podcast app.
# Add to your Claude Code skills
git clone https://github.com/zarazhangrui/personalized-podcastThroughout this file:
SKILL_DIR = the directory where this SKILL.md file lives (the skill's install location)DATA_DIR = ~/.personalized-podcast (where user data, config, and episodes are stored)Resolve these to absolute paths before running any commands.
When the user invokes this skill, start by introducing it:
"This skill turns any content into a podcast episode with two AI hosts who discuss it in a natural, conversational style. Think NotebookLM, but you control everything: the script prompt, the hosts' voices, the show format.
You can use it to:
- Listen to anything on the go. Paste an article, point to a file, drop a URL. Instead of reading, you get two people breaking it down while you walk, commute, or cook.
- Understand yourself from the outside. Feed it personal content like meeting transcripts, your resume, or journal entries, and have the hosts share their impressions of you. It's genuinely illuminating.
- Create your own show. Set up an RSS feed and new episodes show up in the podcast app you already use (Apple Podcasts, Spotify, Overcast, Snipd). No new app to download.
Let's get started. What content do you want to turn into a podcast?"
If the user already provided content with their /podcast command, skip the question and go straight to setup check.
If DATA_DIR/config.yaml does not exist, run through this setup BEFORE generating. Do each step yourself - don't ask the user to run commands.
mkdir -p DATA_DIR/{scripts_output,episodes,logs}
python3 -m venv DATA_DIR/venv
DATA_DIR/venv/bin/pip install httpx pydub pyyaml python-dotenv jinja2 audioop-lts
Check ffmpeg is installed:
NotebookLM-style AI podcasts, except you control everything.
The script. The prompt. The hosts' roles. Their voices. The content they discuss. All of it.
A coding agent skill that turns any content into a two-host podcast episode. Paste in text, point it at files, drop a URL. Two AI hosts read your content and have a natural conversation about it. You get an MP3 that plays immediately. Set up an RSS feed and listen in the apps you already use: Apple Podcasts, Spotify, Overcast, Snipd, Pocket Casts. No new app to download.
Turn anything into a podcast you can listen to on the go. Newsletters, long reads, tweets, research papers, meeting notes. Instead of reading on a screen, you listen to two people break it down while you walk, commute, or cook. Set up the RSS feed once and new episodes show up right where you already listen to podcasts.
Know yourself from the outside. This is the unexpected use case. Feed it personal content: your resume, meeting transcripts, journal entries, even your browser history. Then ask the hosts to comment on their impressions of you. What patterns do they see in how you think, communicate, make decisions? It is genuinely illuminating to hear two voices discuss you as if you're not in the room.
gh repo clone zarazhangrui/personalized-podcast-skill ~/.claude/skills/personalized-podcast
/podcast <paste content, point to files, or describe a topic>
That's it. On first run, Claude sets up the Python environment, installs dependencies, and asks you for a free Fish Audio API key. Default voices are pre-configured. Your first episode generates immediately.
No comments yet. Be the first to share your thoughts!
ffmpeg -version
If not found, install it: brew install ffmpeg (macOS) or sudo apt install ffmpeg (Linux).
cp SKILL_DIR/config/config.example.yaml DATA_DIR/config.yaml
The config comes with two pre-picked voices that work out of the box. No voice selection needed for first use.
Tell the user:
"To turn your script into audio, this skill uses Fish Audio for text-to-speech. They have a free tier with 2 million+ voices. You just need an API key:
- Go to https://fish.audio and create a free account
- Go to https://fish.audio/app/api-keys/ and create an API key"
Then create the .env file and open it:
echo "FISH_API_KEY=your_key_here" > DATA_DIR/.env
open DATA_DIR/.env
Tell them: "Paste your Fish Audio API key in this file, replacing 'your_key_here'. Save and close."
IMPORTANT: Never ask the user to paste API keys in the chat. Always use the .env file.
Tell the user:
"You're all set! The default show has two hosts - Alex (curious, energetic) and Sam (analytical, witty) - with voices pre-configured. Let's generate your first episode."
Then proceed to generate the episode. Do NOT set up RSS or GitHub Pages during first-time setup. That's optional and comes later.
Read all the content the user provided. If they pointed to files, read them with the Read tool. If they pasted a URL, fetch it. Combine everything into your understanding of the source material.
Read the prompt file at SKILL_DIR/PROMPT.md for the hosts, style, structure, and output format. Follow those instructions to write the script.
If the user included custom instructions in their /podcast message (e.g., "make it a debate" or "hosts should eavesdrop on my conversation"), incorporate those. The user's inline instructions override PROMPT.md for that episode.
Save the script as a JSON array using the Write tool to: DATA_DIR/scripts_output/YYYY-MM-DD.json (use today's date). If a file for today already exists, append a number (e.g., 2026-04-05-2.json).
Tell the user: "Script written. Now generating audio - this takes about a minute depending on episode length."
Run the speak script:
DATA_DIR/venv/bin/python SKILL_DIR/scripts/speak.py --script <path_to_script.json>
This outputs the path to the generated MP3 file.
IMMEDIATELY open the audio file for the user:
open <path_to_mp3>
On Linux use xdg-open instead of open.
After the audio plays, tell the user:
"Your episode is ready! A few things you can do from here:
Try different show formats. The default is two hosts chatting, but you can do anything. Just describe it when you run
/podcast:
- "/podcast make it a debate about this article"
- "/podcast hosts should eavesdrop on my conversation and share their impressions of me"
- "/podcast interview format, one host asks questions and the other is the expert"
- "/podcast solo narrator, walk me through this research paper"
- "/podcast news roundup, read each tweet aloud then discuss"
Or edit
PROMPT.mdto permanently change your show's format.Pick your own voices. The default voices are solid, but Fish Audio has 2 million+ to choose from. Browse https://fish.audio/discovery, find two you like, and update the voice IDs in
DATA_DIR/config.yaml.Listen in your podcast app. Want new episodes delivered to Apple Podcasts, Spotify, Overcast, or Snipd automatically? Just ask me to set up an RSS feed for you - takes about a minute."
Only show these tips the FIRST time, or if the user asks about customization.
When the user wants to set up an RSS feed, explain why it's useful:
"This creates a personal podcast feed that works in any podcast app. Once it's set up, every time you generate a new episode, it gets published to the feed and shows up where you already listen to podcasts. No new app needed."
Then walk them through these steps:
Ask for their GitHub username, then:
gh repo create USERNAME/podcast-feed --public --description "Personal podcast feed"
cd /tmp && mkdir podcast-feed && cd podcast-feed && git init
echo '[]' > episodes.json
Generate an initial empty feed.xml using the template, then push and enable GitHub Pages:
gh api repos/USERNAME/podcast-feed/pages -X POST --input - << 'EOF'
{"source":{"branch":"main","path":"/"},"build_type":"legacy"}
EOF
Update DATA_DIR/config.yaml with:
publish:
github_repo: "USERNAME/podcast-feed"
base_url: "https://USERNAME.github.io/podcast-feed"
Tell the user their feed URL and give them the steps for their preferred app:
| App | How to subscribe | | ----------------------- | ------------------------------------------------------ | | Apple Podcasts (Mac) | Menu bar: File > Add a Show by URL | | Apple Podcasts (iPhone) | Library > Edit (top right) > Add a Show by URL | | Overcast | "+" (top right) > Add URL | | Pocket Casts | Discover tab > paste URL in search bar > Subscribe | | Castro | Search tab > paste URL in search bar > Add Podcast | | Snipd | Home > Podcasts > three-dot menu (top right) > Add RSS | | Spotify | See Spotify instructions below |
Feed URL: https://USERNAME.github.io/podcast-feed/feed.xml
Spotify setup (one-time, takes 24-48 hours for approval):
IMPORTANT: Before proceeding, warn the user: "Heads up - submitting to Spotify makes your podcast public. Anyone on Spotify can find and listen to it. The other apps above are private - only people you share the RSS URL with can find your show. Want to proceed with Spotify?"
If they want to proceed:
owner_email is set in config.yaml. If not, ask for their email and add it.After the RSS feed is set up, future episodes can be published with:
DATA_DIR/venv/bin/python SKILL_DIR/scripts/publish.py --mp3 <path_to_mp3> --title "<title>" --description "<description>"
brew install ffmpeg (macOS) or sudo apt install ffmpeg (Linux)gh auth loginConsume content as audio
/podcast read ~/Downloads/newsletter.txt
/podcast https://some-article-url.com
/podcast Here's a thread about AI agents I want to hear discussed...
Self-reflection
/podcast read ~/Documents/my-resume.pdf and have the hosts analyze my career trajectory
/podcast read ~/transcripts/meeting.txt and have the hosts eavesdrop and share their impressions of me
Custom formats
/podcast read ~/notes.md, make it a debate between an optimist and a skeptic
/podcast read these 3 files, hosts should focus on what's surprising or counterintuitive
You can change the prompt, the hosts' personalities, the episode length, the tone. It is all in your config file.
/podcast <your content>
|
v
Claude reads the content and writes a two-host conversation script
|
v
Fish Audio generates speech for each line (different voice per host)
|
v
Audio gets stitched together with natural pacing
|
v
MP3 opens and plays on your computer
The default show has two hosts:
They sound like two friends talking over coffee. Not news anchors. Not a lecture.
Customize the script prompt. This is the big one. PROMPT.md controls how the hosts behave, the show structure, and the writing style. Edit it to create your own show format. Some ideas:
Pick your own voices. Browse fish.audio/discovery. Find voices you like. Copy their reference IDs into your config. You can make your hosts sound however you want.
Change the show's personality. Edit show_name and tone in ~/.personalized-podcast/config.yaml. Make it serious, funny, academic, casual, confrontational. Up to you.
Set up an RSS feed. Want episodes delivered to your podcast app automatically? Just ask Claude: "Set up an RSS feed for my podcast." It creates a GitHub Pages feed you can subscribe to in Apple Podcasts, Overcast, Pocket Casts, Snipd, Spotify, or any podcast app that supports RSS.
brew install ffmpeg on macOS)Built by Zara Zhang. Your AI coding agent already understands context, writes well, and follows instructions. Why not have it write you a podcast script, generate the audio, and deliver it to your ears?
The entire pipeline runs locally through your coding agent. No separate backend. No hosted service. No subscription. Just a skill that turns your coding agent into a podcast producer.
~/.claude/skills/personalized-podcast/ # The skill (this repo)
SKILL.md # Instructions for the coding agent
scripts/
speak.py # Fish Audio TTS + audio stitching
publish.py # Push episodes to GitHub Pages (optional)
bootstrap.py # One-time repo setup (optional)
utils.py # Config, logging, .env loading
templates/
feed_template.xml # RSS feed template (optional)
config/
config.example.yaml # Default config with pre-picked voices
~/.personalized-podcast/ # Your data (created automatically)
config.yaml # Your config
.env # Your Fish Audio API key
scripts_output/ # Generated scripts (JSON)
episodes/ # Generated MP3 files
Script generation: Your coding agent writes the script directly. No separate LLM API call needed.
Text-to-speech: Fish Audio with 2M+ voices and a free tier.
Audio processing: pydub + ffmpeg for stitching segments with natural pauses and fade effects.
Feed hosting (optional): GitHub Pages, auto-deploys on every push.