Triage new videos, generate watch recommendations
Scanned 9/2/2026
Install to Claude Code
npx -y skills add majiayu000/claude-skill-registry --skill video-digest --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Video Digest?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/majiayu000-video-digest)More formats (shields.io, HTML) on the badges page.
---
name: video-digest
context: orchestrate
description: Triage new videos, generate watch recommendations
model: opus
hooks:
Stop:
- type: command
command: >-
test -f "Daily/$(date +%Y)/Daily - $(date +%Y-%m-%d).md" &&
grep -q "## Video Digest" "Daily/$(date +%Y)/Daily - $(date +%Y-%m-%d).md"
statusMessage: "Verifying digest in daily note"
---
# /video-digest
Intelligently triage new videos from subscribed YouTube channels, process selectively based on relevance, and generate a daily digest with watch recommendations.
## Usage
```
/video-digest # Full triage and processing
/video-digest --triage-only # Score videos without processing
/video-digest --report # Show current queue status
/video-digest --watched <video> # Mark video as watched (removes from queue)
```
## Examples
```
/video-digest
/video-digest --triage-only
/video-digest --watched "YouTube - AI Security Patterns"
```
## Model Strategy
| Phase | Model | Rationale |
| ----------------- | ------ | ------------------------ |
| RSS fetch | Haiku | Simple data extraction |
| Title/desc triage | Haiku | Fast relevance scoring |
| Worth Processing | Sonnet | Full transcript analysis |
| Quick Capture | Haiku | Brief summary only |
| Digest generation | Sonnet | Quality recommendations |
## Instructions
### Phase 1: Gather New Videos
**Model:** Haiku (parallel subagents)
1. **Read subscriptions** from `.claude/subscriptions.yaml`
2. **For each channel** (in parallel), fetch RSS feed:
```
https://www.youtube.com/feeds/videos.xml?channel_id={{channel_id}}
```
Use `WebFetch` with prompt: "Extract video entries: title, video_id, published_date, description (first 500 chars)"
3. **Identify new videos**:
- Compare video IDs against `last_video_id`
- Select videos published since last check
- If first check, take only most recent video
4. **Collect candidates** with basic metadata:
- video_id, title, description, duration (if available)
- channel_name, channel_trust_score, always_watch
### Phase 2: Rapid Triage
**Model:** Haiku
For each candidate video, compute triage score:
#### Scoring Algorithm
```
TRParentCorpE_SCORE = (
PROJECT_RELEVANCE * 0.35 + # 0-100
DOMAIN_RELEVANCE * 0.25 + # 0-100
FRESHNESS_BOOST * 0.20 + # 0-100
CHANNEL_TRUST * 0.20 # 0-100 (from trust_score * 5)
)
```
#### Relevance Matching
**Project Relevance** (read `.claude/context/projects.md`):
Match title + description against project keywords:
| Project | Keywords |
| ------------ | -------------------------------------------------------------- |
| Beta | ERPSystem, MRO, Swiss-AS, EWS, modernisation, aviation, maintenance |
| Alpha | SAP, DataPlatform, data products, Kafka, Datasphere, integration |
| AlertHub | AWS Bedrock, AI agents, safety, incident, LLM, Claude |
| Delta | AircraftMfg, Gatelink, EFB, aircraft, AvionicsVendor, avionics |
| Cyber Uplift | security, IAM, compliance, LLD, AWS security, threat |
| DataPlatform | data platform, Snowflake, analytics, data engineering |
**Domain Relevance** (read `.claude/rules/tag-taxonomy.md` `domain/` section):
Match against domain keywords:
- `domain/engineering`: systems, architecture, design, modernisation
- `domain/data`: analytics, data products, streaming, Kafka, databases
- `domain/cloud`: AWS, Azure, infrastructure, serverless, containers
- `domain/security`: IAM, encryption, compliance, threats, vulnerabilities
- `domain/ai`: LLM, agents, machine learning, Claude, GPT, automation
**Freshness Boost**:
- Check if topic keywords appear in notes modified in last 14 days
- Higher score = more recently active topics
- Use Graph search: `node .claude/scripts/graph-query.js --search="<keywords>" --since=$(date -v-14d +%Y-%m-%d) --json`
**Channel Trust**:
- Use `trust_score` from subscriptions.yaml (0-20, default 10)
- Scale to 0-100 by multiplying by 5
#### Boost Keywords
Apply additional boosts from `triage_settings.boost_keywords`:
```yaml
boost_keywords:
- keyword: "architecture"
boost: 10
- keyword: "Claude Code"
boost: 15
```
#### Never Process Keywords
Skip videos containing `triage_settings.never_process_keywords`:
```yaml
never_process_keywords:
- "reaction"
- "drama"
- "podcast"
- "unboxing"
```
#### Duration Filtering
Skip videos outside `minimum_duration` / `maximum_duration` thresholds.
#### Category Assignment
| Category | Score Range | Action |
| ---------------- | ----------- | ---------------------------- |
| Must Watch | 80-100 | Flag for user with reasoning |
| Worth Processing | 50-79 | Full `/youtube` processing |
| Quick Capture | 25-49 | Weblink only, brief summary |
| Skip | 0-24 | Log reason, no files created |
### Phase 3: Selective Processing
**Model:** Sonnet (parallel for Worth Processing tier)
#### Must Watch (80-100)
**Do NOT process automatically.** Instead:
1. **Update video queue** (`.claude/video-queue.yaml`):
```yaml
must_watch:
- video_id: "abc123"
title: "Video Title"
url: "https://youtube.com/watch?v=abc123"
channel: "Channel Name"
score: 92
first_recommended: "2026-02-05T08:00:00Z"
always_watch_channel: false
reasoning:
- "Directly relevant to [[Project - AlertHub]] - discusses AI agent security"
- "Knowledge gap: No vault content on 'AI firewall' patterns"
- "Channel trust: 2.8 nodes/video historical yield"
potential_nodes: 4
```
2. **Include in digest** with full reasoning
#### Worth Processing (50-79)
Launch parallel `/youtube` processing:
1. For each video in this tier, invoke `/youtube <url>`:
- Follow full `/youtube` skill workflow
- Create YouTube node with transcript analysis
- Spawn Concept/Pattern nodes as appropriate
2. **Track results**:
- Count spawned nodes
- Update `processing_stats` in subscriptions.yaml
#### Quick Capture (25-49)
**Model:** Haiku
Create minimal Weblink note:
**Filename:** `Weblink - {{sanitised title}}.md`
```markdown
---
type: Reference
title: "{{title}}"
url: "{{youtube_url}}"
domain: youtube.com
createdAt: "{{ISO timestamp}}"
description: "{{brief summary from description}}"
created: { { DATE } }
modified: { { DATE } }
tags:
- video
- activity/research
relatedTo: []
---
# {{title}}
**Channel:** {{channel name}}
**Duration:** {{duration}}
**Source:** [Watch on YouTube]({{url}})
## Summary
{{2-3 sentence summary based on title and description}}
## Relevance
Quick captured due to moderate relevance (score: {{score}}/100).
_Full processing not warranted based on triage criteria._
```
#### Skip (0-24)
Log to digest only. No files created.
### Phase 4: Queue Management
#### Check Must Watch Expiry
1. Read `.claude/video-queue.yaml`
2. For each video in `must_watch`:
- If `always_watch_channel: true` → Keep in must_watch
- If age > `must_watch_expiry_days` (default 5) → Move to `backlog`
3. Update queue file with moves
#### Backlog Structure
```yaml
backlog:
- video_id: "ghi789"
title: "Older Video"
url: "https://youtube.com/watch?v=ghi789"
channel: "Some Channel"
expired_from_must_watch: "2026-02-05"
original_score: 85
reasoning:
- "Was relevant to [[Project - Beta]]"
```
### Phase 5: Generate Digest
**Model:** Sonnet
Add `## Video Digest` section to today's daily note.
1. **Find daily note**: Check both formats:
- `Daily/{{year}}/{{YYYY-MM-DD}}.md` (actual format used)
- `Daily/{{year}}/Daily - {{YYYY-MM-DD}}.md` (documented format)
2. **Create if missing**: Use `/daily` skill
3. **Insert digest section** (before `## End of Day Review` if present, otherwise at end)
#### Digest Template
```markdown
## Video Digest
_Generated at {{timestamp}}_
### 📊 Summary
| Category | Count | Action |
| ---------------- | ----- | ---------------------------- |
| Must Watch | {{n}} | Review recommendations below |
| Worth Processing | {{n}} | Auto-processed |
| Quick Capture | {{n}} | Weblink created |
| Skipped | {{n}} | Not relevant |
### 🎯 Must Watch
{{For each must-watch video:}}
#### [[YouTube - {{title}}]] _(not yet created)_
**Channel:** {{channel}} | **Duration:** {{duration}} | **Score:** {{score}}/100
**Why watch:**
{{For each reasoning point:}}
- {{reasoning}}
**If skipped:** Will extract ~{{potential_nodes}} concepts including {{top concepts}}
---
### ✅ Auto-Processed
| Video | Channel | Score | Nodes Created |
| ----- | ------- | ----- | ------------- |
{{For each processed video:}}
| [[YouTube - {{title}}]] | {{channel}} | {{score}} | {{nodes_count}} |
### 📎 Quick Captures
{{For each quick capture:}}
- [[Weblink - {{title}}]] - {{brief reason}}
### ⏭️ Skipped
| Video | Channel | Reason |
| ----- | ------- | ------ |
{{For each skipped video:}}
| "{{title}}" | {{channel}} | {{skip_reason}} |
{{If backlog not empty:}}
### ⏳ When You Get Time (Backlog)
Videos that expired from Must Watch after {{expiry_days}} days:
| Video | Channel | Original Score | Days in Queue |
| ----- | ------- | -------------- | ------------- |
{{For each backlog video:}}
| [[YouTube - {{title}}]] | {{channel}} | {{score}} | {{days}} |
```
### Phase 6: Update State
1. **Update subscriptions.yaml**:
- Set `last_checked` to current timestamp
- Set `last_video_id` to most recent video per channel
- Increment `processing_stats` counters
2. **Update video-queue.yaml**:
- Add new must-watch videos
- Move expired videos to backlog
- Remove watched videos (via `--watched` flag)
## Handling --watched Flag
When invoked as `/video-digest --watched <video>`:
1. Parse video identifier (title or video_id)
2. Search `must_watch` and `backlog` in queue
3. Remove matching entry
4. Confirm removal
## Handling --report Flag
When invoked as `/video-digest --report`:
1. Read `.claude/video-queue.yaml`
2. Display summary:
```
Video Queue Status
==================
Must Watch: {{count}}
{{For each:}}
- "{{title}}" ({{channel}}) - Score: {{score}} - {{days_old}} days old
Backlog: {{count}}
{{For each:}}
- "{{title}}" ({{channel}}) - Expired {{days_ago}} days ago
Last Digest: {{timestamp}}
```
## Handling --triage-only Flag
When invoked as `/video-digest --triage-only`:
- Execute Phases 1-2 only
- Output scoring results without processing
- Do not update subscriptions.yaml (except last_checked)
- Useful for testing triage algorithm
## Quality Standards
- **Always** generate digest in daily note
- **Always** provide reasoning for must-watch recommendations
- **Always** update queue state after execution
- **Never** process must-watch automatically (user should decide)
- **Never** create duplicate YouTube nodes for already-processed videos
- **Use** UK English throughout
- **Update** subscriptions.yaml after every run
- **Track** spawned nodes for trust score calibration
## Example Output
For a run with 2 channels, 8 new videos:
```
Video Digest Results
====================
Checked 2 channels, found 8 new videos.
📊 Triage Results:
Must Watch: 1
- "AI Security for Autonomous Agents" (IndyDevDan) - Score: 92
Worth Processing: 2
- "AWS Bedrock Deep Dive" - Score: 68
- "Kafka Streaming Patterns" - Score: 55
Quick Capture: 2
Skipped: 3
✅ Processed 2 videos:
- [[YouTube - AWS Bedrock Deep Dive]] → 2 concepts, 1 pattern
- [[YouTube - Kafka Streaming Patterns]] → 1 concept
📎 Created 2 quick captures:
- [[Weblink - Tech News Weekly]]
- [[Weblink - Developer Productivity Tips]]
📝 Updated today's daily note with digest.
📋 1 video added to must-watch queue.
```
## Error Handling
- **RSS fetch fails**: Log warning, continue to next channel
- **Transcript unavailable**: Process with description-only analysis
- **Daily note missing**: Create using `/daily` skill
- **Queue file missing**: Create with empty arrays
- **Config missing**: Use default thresholds
## Related Skills
- `/rss-check` - Channel subscription management
- `/youtube` - Full video processing
- `/daily` - Daily note creation
- `/schedule` - Scheduled execution setup
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!