skills/daily-digest/SKILL.md
Run a daily content digest pipeline that fetches Podcast RSS feeds and YouTube channels, transcribes audio, generates AI summaries in Traditional Chinese, and optionally sends notifications via Telegram. Use this skill whenever the user wants to: set up or run a daily digest, summarize podcasts or YouTube videos, create a content briefing, aggregate RSS/YouTube content, or build an automated summary system. Also triggers for: "daily digest", "每日摘要", "podcast 摘要", "YouTube 整理", "跑摘要", "內容彙整", "幫我整理今天的 podcast", "summarize my subscriptions", or any request to periodically collect and summarize media content. Even if the user just says "digest" or "摘要", check if this skill applies.
npx skillsauth add abe1272001/daily-digest-skill daily-digestInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are an autonomous content digest operator. Your job is to save the user time by turning hours of podcast/YouTube content into a concise, actionable briefing they can read in minutes.
Pipeline: fetch → transcribe → summarize → cross-analyze → output (→ notify).
All runtime data lives in a fixed home directory so it works from any CWD:
DD_HOME="$HOME/.daily-digest"
VENV_PY="$DD_HOME/venv/bin/python"
DD_CONFIG="$DD_HOME/config"
DD_WORKSPACE="$DD_HOME/workspace"
SCRIPTS="${CLAUDE_SKILL_DIR}/scripts"
Every script invocation: $VENV_PY $SCRIPTS/script_name.py ...
setup)Before executing pipeline, status, cleanup, or add — ensure directory structure exists and venv is valid:
mkdir -p "$DD_HOME/config" "$DD_HOME/workspace/fetched" "$DD_HOME/workspace/summaries" "$DD_HOME/workspace/transcripts"
test -f "$DD_HOME/venv/bin/python" && echo "OK" || echo "MISSING"
If MISSING, tell the user and run setup automatically:
python3 "${CLAUDE_SKILL_DIR}/scripts/setup.py" --install --venv-dir "$DD_HOME/venv"
This prevents the pipeline from silently failing when dependencies aren't installed.
Read $DD_CONFIG/settings.yaml for the language field. Default: en.
Present all status, progress, and results directly in your response as markdown. Claude Code collapses Bash tool output, so users miss Rich panels rendered by scripts. Instead, format information yourself using markdown headers, tables, bold text, and lists — these are always visible in the conversation.
Use scripts only for data gathering (fetch, transcribe, config loading, etc.), then format and present the results in your own response text.
Parse $ARGUMENTS:
| Command | Action |
|---------|--------|
| (empty) / help | Show help (see template below) |
| run | Execute the full pipeline |
| setup | Run first-time setup |
| add <url> | Add a new source |
| status | Show status |
| cleanup | Clean up old workspace files |
Do NOT execute pipeline when showing help.
When showing help, output this directly (adapt language per settings):
## 📰 Daily Digest v0.5.0
| Command | Description |
|---------|-------------|
| `/daily-digest setup` | First-time setup (sources + notifications) |
| `/daily-digest run` | Run the full digest pipeline |
| `/daily-digest add <url>` | Add a Podcast or YouTube source |
| `/daily-digest status` | View sources and run status |
| `/daily-digest cleanup` | Clean up old workspace files |
| `/daily-digest help` | Show this help |
You are already an LLM running inside the user's session. Summarize and analyze
content directly — no need to shell out to claude -p. This is faster, uses fewer
tokens, and produces better results because you have the full pipeline context.
Use AskUserQuestion for all user interaction. Display progress in your response.
Output: **[1/4] ✓ Check dependencies**
Create home directory, venv, and install deps (uses system Python since venv doesn't exist yet):
mkdir -p "$DD_HOME/config" "$DD_HOME/workspace/fetched" "$DD_HOME/workspace/summaries" "$DD_HOME/workspace/transcripts"
python3 "${CLAUDE_SKILL_DIR}/scripts/setup.py" --install --venv-dir "$DD_HOME/venv"
After this, all subsequent commands use $VENV_PY.
Output: **[2/4] ● Configure sources**
AskUserQuestion: "What Podcast RSS feeds or YouTube channels do you want to track?"
For each source, look up the real name so the user sees proper channel names:
$VENV_PY $SCRIPTS/fetch_podcast.py --url "RSS_URL" --get-feed-title --output-dir /tmp/dd-test
$VENV_PY $SCRIPTS/fetch_youtube.py --channel "@handle" --get-channel-name --output-dir /tmp/dd-test
Create $DD_CONFIG/sources.yaml:
sources:
- name: "Actual Channel Name"
type: podcast
url: "https://..."
limit: 5
Output: **[3/4] ● Configure notifications**
AskUserQuestion with radio options:
Would you like to set up notifications?
○ Telegram Bot — recommended, works great on mobile & desktop
○ Skip for now — digests saved as local Markdown only
If Telegram: ask for Bot Token and Chat ID, save to $DD_CONFIG/telegram.yaml.
If Skip: do NOT create telegram.yaml.
Output: **[4/4] ● Validate setup**
Test each source with a 1-item fetch:
$VENV_PY $SCRIPTS/fetch_podcast.py --url "URL" --limit 1 --output-dir /tmp/dd-test
$VENV_PY $SCRIPTS/fetch_youtube.py --channel "HANDLE" --limit 1 --output-dir /tmp/dd-test
If Telegram configured:
$VENV_PY $SCRIPTS/notify_telegram.py --config "$DD_CONFIG/telegram.yaml" --test
Create $DD_CONFIG/settings.yaml:
language: en
Show completion summary in your response:
## ✅ Setup Complete
**Sources:**
- 🎙 [podcast] Gooaye 股癌
- 📺 [youtube] M觀點
**Notifications:** Telegram ✓
**Next step:** `/daily-digest run`
$VENV_PY $SCRIPTS/config_loader.py --sources "$DD_CONFIG/sources.yaml" --state "$DD_CONFIG/state.json"
Parse the JSON output, check if $DD_CONFIG/telegram.yaml exists, then display in your response:
## 📊 Daily Digest Status
| # | Type | Name | URL |
|---|------|------|-----|
| 1 | podcast | 股癌 | https://... |
**Notifications:** Telegram ✓
**Last run:** 2026-03-08
**Processed:** 42 items
Show progress in your response text as you complete each step. Use a checklist format that you update by outputting the current state:
**Pipeline Progress:**
- ✅ Load config — 3 sources
- ✅ Fetch content — 12 items
- ⏳ Deduplicate...
- ○ Transcribe
- ○ Summarize
- ○ Cross-analyze
- ○ Write output
- ○ Notify
- ○ Update state
- ○ Cleanup
$VENV_PY $SCRIPTS/config_loader.py \
--sources "$DD_CONFIG/sources.yaml" \
--state "$DD_CONFIG/state.json"
If state.json doesn't exist (first run), use --since-days 2 for YouTube to
avoid an overwhelming backlog of old videos.
Podcast:
$VENV_PY $SCRIPTS/fetch_podcast.py \
--url "RSS_URL" --limit 5 --source-name "Name" \
--download-audio --output-dir "$DD_WORKSPACE/fetched/"
YouTube (auto-skips member-only content):
$VENV_PY $SCRIPTS/fetch_youtube.py \
--channel "HANDLE" --limit 5 --source-name "Name" \
--filter-livestream --transcript both \
--since-days 2 \
--output-dir "$DD_WORKSPACE/fetched/"
Compare fetched item IDs against processed_ids from Step 1. The state file
tracks every processed item, so duplicates are automatically filtered out
regardless of how often a channel publishes.
Only for items that have audio but no transcript (e.g., podcasts without subtitles):
$VENV_PY $SCRIPTS/transcribe.py --audio "path/to/audio.wav" --model tiny --language zh
Read transcripts and produce summaries directly in your response. Write in the language specified in settings.yaml.
Each item gets:
Keep each summary 300-800 characters. Be faithful to the source — save your opinions for the cross-analysis.
This is where you add real analytical value. Generate 6 dimensions:
Save both formats — Markdown for the user, JSON for programmatic access:
# Markdown → $DD_WORKSPACE/summaries/YYYY-MM-DD.md
# JSON → $DD_WORKSPACE/summaries/YYYY-MM-DD.json
For the JSON schema, read ${CLAUDE_SKILL_DIR}/references/pipeline.md.
Save transcripts to $DD_WORKSPACE/transcripts/.
Only if $DD_CONFIG/telegram.yaml exists:
$VENV_PY $SCRIPTS/notify_telegram.py \
--config "$DD_CONFIG/telegram.yaml" \
--file "$DD_WORKSPACE/summaries/YYYY-MM-DD.md"
$VENV_PY $SCRIPTS/update_state.py \
--state "$DD_CONFIG/state.json" \
--processed-ids "id1,id2,id3"
Keep workspace size manageable by removing old audio files after each run:
$VENV_PY $SCRIPTS/cleanup.py --workspace "$DD_WORKSPACE/"
Display the digest preview and completion summary in your response:
## 📰 Daily Digest — 2026-03-08
### 🎙 股癌 — EP.420 標題
📅 2026-03-08
**Key Summary:** • point 1 • point 2
**Key Numbers:** 📊 stat 1
---
## 🔗 Cross-Source Analysis
### Common Themes
...
### Actionable Takeaways
- 🔍 [Research] ...
- 🚀 [Try] ...
---
✅ **Pipeline Complete**
- **Date:** 2026-03-08
- **New items:** 5 (2 podcast + 3 youtube)
- **Digest:** `~/.daily-digest/workspace/summaries/2026-03-08.md`
- **Notification:** ✓ Telegram sent
Manually trigger workspace cleanup. Useful with /loop for automated scheduling:
$VENV_PY $SCRIPTS/cleanup.py --workspace "$DD_WORKSPACE/" [--dry-run] [--verbose]
Display results in your response:
## 🧹 Workspace Cleanup
- **Deleted:** 12 files
- **Freed:** 245.3 MB
- **Kept:** 38 files
💡 Automate with: `/loop 1d /daily-digest cleanup`
Retention policy: audio kept 1 week, transcripts 1 month, summaries indefinitely.
Full retention details in references/pipeline.md.
AskUserQuestion to confirm source details. Get the real name:
$VENV_PY $SCRIPTS/fetch_podcast.py --url "URL" --get-feed-title --output-dir /tmp/dd-test
$VENV_PY $SCRIPTS/fetch_youtube.py --channel "HANDLE" --get-channel-name --output-dir /tmp/dd-test
Edit $DD_CONFIG/sources.yaml, validate with a 1-item fetch, then display:
## ✅ Source Added
- **Name:** Some Podcast 好節目
- **Type:** podcast
- **URL:** https://feeds.soundon.fm/...
- **Validation:** ✓ Fetched 1 test item
Read ${CLAUDE_SKILL_DIR}/references/scheduling.md for launchd/cron setup.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.
development
Run, watch, debug, and extend OpenClaw QA testing with qa-lab and qa-channel. Use when Codex needs to execute the repo-backed QA suite, inspect live QA artifacts, debug failing scenarios, add new QA scenarios, or explain the OpenClaw QA workflow. Prefer the live OpenAI lane with regular openai/gpt-5.4 in fast mode; do not use gpt-5.4-pro or gpt-5.4-mini unless the user explicitly overrides that policy.
development
End-to-end Parallels smoke, upgrade, and rerun workflow for OpenClaw across macOS, Windows, and Linux guests. Use when Codex needs to run, rerun, debug, or interpret VM-based install, onboarding, gateway smoke tests, latest-release-to-main upgrade checks, fresh snapshot retests, or optional Discord roundtrip verification under Parallels.