clodcast

A Claude Code skill that turns a list of saved articles (or RSS items) into a fully-produced Spotify episode in one pass:
- Pulls full content for each item
- Writes a segmented script using a deterministic template (intro + per-item + outro)
- Renders TTS via Qwen3-TTS with a locked house voice (
ref_audio cloning, no run-to-run drift)
- Concatenates with auto-padded silences to satisfy Spotify's chapter rules
- Builds a date-stamped cover, timeline, and HTML description
- Uploads via the
save-to-spotify CLI and polls until the episode is READY
- Updates a per-user dedup log so the same URLs are not re-covered
Ships an executable render.py and a self-contained claude -p prompt so the whole thing can run unattended on a schedule.
Live example
This skill ships a real show every morning: Cortech — Daily Digest.
Every episode on that page was produced end-to-end by daily-podcast on an unattended
schedule — same house voice, same template, same save-to-spotify upload path described
below. It's the fastest way to hear what the renderer actually sounds like.
(That page and feed are generated by cortech.online
from the Cloudflare R2 bucket each run publishes to — see
Optional: publish to a web feed below.)
Install
/plugin marketplace add schmug/clodcast
/plugin install daily-podcast@clodcast
Releases
Versions follow semver and are tagged vX.Y.Z. See the
Releases page for tagged
versions and the CHANGELOG for what changed in each. Both are
maintained automatically by release-please
from conventional commits: every push to main updates a standing "release PR" with
the next version and changelog; merging that PR cuts the tag and GitHub Release.
Dependencies
save-to-spotify CLI on PATH, authenticated
curl -fsSL https://saveto.spotify.com/install.sh | bash
save-to-spotify auth login
- Apple Silicon Mac (Qwen3-TTS via MLX uses Metal). Swap the renderer if you want a different TTS provider.
- Python 3.10+ — runtime deps are declared in
pyproject.toml (mlx-audio, soundfile, mutagen, Pillow, numpy, feedparser)
pip install -r requirements.txt (or pip install -e . for an editable checkout)
ffmpeg and ffprobe
- ~4 GB free disk for the first model download (Qwen3-TTS Base 1.7B-8bit)
Setup
One-time config:
mkdir -p ~/.config/daily-podcast
cat > ~/.config/daily-podcast/config.json << 'EOF'
{
"show_id": "spotify:show:<your-show-id>",
"show_name": "Your Show Name",
"host_name": "Your Name",
"opml_files": ["/path/to/your-feeds.opml"],
"lookback_hours": 24,
"target_item_count": 10
}
EOF
Get a show_id by running save-to-spotify --json shows (creates a default show if you don't have one) and copying the URI.
Optional: publish to a web feed (Cloudflare R2)
Beyond Spotify, each finished episode can also be published to a Cloudflare R2 bucket,
which cortech.online turns into a /podcast/
page and an iTunes RSS feed at /podcast/rss.xml. This is additive — if it's not
configured, runs behave exactly as before.
Add the bucket + public URL to config.json:
"r2_bucket": "clodcast",
"r2_public_base_url": "https://audio.cortech.online" // your R2 public domain
Provide credentials via env (never in config.json or git) — or a 0600
~/.config/daily-podcast/secrets.json with the same keys:
export R2_ACCESS_KEY_ID=... # R2 API token
export R2_SECRET_ACCESS_KEY=...
export R2_ACCOUNT_ID=... # Cloudflare account ID
# optional:
export PAGES_DEPLOY_HOOK_URL=... # POSTed after publish so the site rebuilds in ~30s