Not in the top 1,000 by GitHub stars
deeployCO/youtube-seo-skills
Advanced YouTube SEO skill suite for Claude Code — 8 skills + helper scripts for audit, optimization, keywords, thumbnails, and competitor intelligence.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
youtube-seo/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
779b0f130ad1 → 779b0f130ad1
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 779b0f130ad1
No earlier version was observed for comparison.
youtube-seo-audit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
779b0f130ad1 → 779b0f130ad1
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 779b0f130ad1
No earlier version was observed for comparison.
youtube-seo-channel/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
779b0f130ad1 → 779b0f130ad1
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 779b0f130ad1
No earlier version was observed for comparison.
youtube-seo-competitor/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
779b0f130ad1 → 779b0f130ad1
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 779b0f130ad1
No earlier version was observed for comparison.
youtube-seo-keywords/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
779b0f130ad1 → 779b0f130ad1
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 779b0f130ad1
No earlier version was observed for comparison.
youtube-seo-optimize/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
779b0f130ad1 → 779b0f130ad1
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 779b0f130ad1
No earlier version was observed for comparison.
youtube-seo-thumbnail/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
779b0f130ad1 → 779b0f130ad1
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 779b0f130ad1
No earlier version was observed for comparison.
youtube-seo-video/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
779b0f130ad1 → 779b0f130ad1
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 779b0f130ad1
No earlier version was observed for comparison.
Heat
1.7- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- youtube-seo
youtube-seo - youtube-seo-audit
youtube-seo-audit - youtube-seo-channel
youtube-seo-channel - youtube-seo-competitor
youtube-seo-competitor - youtube-seo-keywords
youtube-seo-keywords - youtube-seo-optimize
youtube-seo-optimize - youtube-seo-thumbnail
youtube-seo-thumbnail - youtube-seo-video
youtube-seo-video
How it works
youtube-seo
When your agent uses it
Advanced YouTube SEO analysis and optimization for channels and videos. Routes to specialized sub-skills for audits, single-video deep dives, metadata optimization, channel branding, keyword research, thumbnails, and competitor intel. Models YouTube's modern recommender (session watch time / Reinforce / persona matching) not just keyword match. Use when user says "YouTube SEO", "optimize my video", "rank my YouTube video", "YouTube channel audit", "YouTube keywords", or provides a YouTube URL.
What it loads into context
Frontmatter
172 tokensAlways available to the agent
SKILL.md
3,669 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Routing Table
- Advanced Ranking Model
- Data Sources
- Niche Benchmarks (APV, CTR, like ratio)
- Output Conventions (all sub-skills must follow)
- Error Handling
Scripts executed separately
../scripts/analyze_thumbnail.py../scripts/fetch_channel.py../scripts/fetch_video.py
Files
../scripts/analyze_thumbnail.pyruns6,129 bytes../scripts/fetch_channel.pyruns10,211 bytes../scripts/fetch_video.pyruns8,331 bytesSKILL.mdcore14,452 bytesSKILL.mdcore14,452 bytesSKILL.mdcore14,452 bytes
Read SKILL.md
# YouTube SEO Orchestrator (Advanced)
Master skill for YouTube SEO work. Detect intent, delegate to the right
sub-skill, and provide the shared advanced ranking model that every
sub-skill references. If intent is ambiguous, ask once before proceeding.
## Routing Table
| User intent / input | Sub-skill |
|---------------------|-----------|
| "audit my channel", channel URL alone, "full YouTube check" | `youtube-seo-audit` |
| Single video URL, "analyze this video", "why isn't this ranking" | `youtube-seo-video` |
| "optimize title/description/tags", "rewrite metadata", "improve CTR copy" | `youtube-seo-optimize` |
| "channel branding", "about page", "banner", "playlists", "channel trailer" | `youtube-seo-channel` |View the complete source on GitHubyoutube-seo-audit
When your agent uses it
Advanced full YouTube channel audit with parallel sub-skill delegation. Analyzes topical authority, channel-level retention patterns, traffic- source mix, upload velocity consistency, playlist session chains, and sub-skill breakdowns. Generates health score and prioritized action plan. Use when user says "YouTube audit", "audit my channel", "full YouTube check", or provides a channel URL.
What it loads into context
Frontmatter
141 tokensAlways available to the agent
SKILL.md
2,114 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Process
- Scoring Weights
- Report Structure
- Priority Definitions
- Data Sources Policy
- Error Handling
Files
SKILL.mdcore9,051 bytesSKILL.mdcore9,051 bytes
Read SKILL.md
# Full YouTube Channel Audit (Advanced)
## Process
1. **Resolve channel**: accept `@handle`, `/channel/UC...`, `/c/name`, or
a video URL. Normalize to channel ID via API or WebFetch.
2. **Ask for Studio exports** before starting any retention or CTR analysis:
- Analytics → Advanced Mode → Last 28/90 days CSV for:
- Content (video-level stats)
- Traffic source
- Audience → geography + top subtitles
- Key moments (retention curves for top 10 videos)
Without these, score only metadata and structure; label retention
metrics as "unknown".View the complete source on GitHubyoutube-seo-channel
When your agent uses it
Advanced channel-level YouTube SEO: identity, about, channel keywords, topical authority, playlist session chains, bingeable series structure, channel trailer, community tab strategy, translated metadata, and premiere/upload cadence planning. Use when user says "channel branding", "YouTube about page", "playlists", "channel trailer", or "optimize my channel".
What it loads into context
Frontmatter
124 tokensAlways available to the agent
SKILL.md
2,057 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What to Analyze
- Output
- Error Handling
Files
SKILL.mdcore8,457 bytes
Read SKILL.md
# Channel Setup, Authority & Session Strategy (Advanced)
Channels don't rank — topics and videos rank. But channels accumulate
**topical authority** (the algorithm's classification of what the
channel is known for), **session contribution** (how much watch time
the channel drives to YouTube overall), and **Browse feed friendliness**
(cadence + freshness). All three are set at the channel level.
## What to Analyze
### 1. Identity
- **Handle** (`@name`): ≤30 chars, memorable, brand-aligned, no
underscores/numbers if avoidableView the complete source on GitHubyoutube-seo-competitor
When your agent uses it
Advanced YouTube competitor intelligence. Detects direct competitors, extracts winning title/thumbnail/hook patterns from transcripts, infers retention strategies from pacing, correlates posting cadence with performance, and identifies format-market-fit gaps. Use when user says "YouTube competitor analysis", "what are [channel] doing", "competing videos", or "find my competitors on YouTube".
What it loads into context
Frontmatter
141 tokensAlways available to the agent
SKILL.md
2,361 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Process
- Output
- Delegation
- Error Handling
Scripts executed separately
../scripts/fetch_channel.py
Files
../scripts/fetch_channel.pyruns10,211 bytesSKILL.mdcore9,703 bytesSKILL.mdcore9,703 bytes
Read SKILL.md
# YouTube Competitor Intelligence (Advanced)
Competitor analysis on YouTube is about **pattern extraction**, not
imitation. Find what works, understand why, and apply the mechanism
(not the surface form) to the user's channel.
## Process
### 1. Identify competitors
If the user provides a competitor list → use it and add 1-2 mid-tier
comparables. Otherwise derive competitors using **only first-party
sources** (no third-party analytics tools — they rate-limit or error):
View the complete source on GitHubyoutube-seo-keywords
When your agent uses it
Advanced YouTube keyword and topic research with search-intent classification, Knowledge Graph entity coverage, seasonality curves, refined difficulty scoring, and topic-cluster planning for topical authority. Use when user says "YouTube keywords", "what should I make a video about", "keyword research", or "YouTube topic ideas".
What it loads into context
Frontmatter
124 tokensAlways available to the agent
SKILL.md
2,316 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Process
- Refined Opportunity Formula
- Data Sources (priority order — first-party only)
- Output
- Integration
- Error Handling
Files
SKILL.mdcore9,245 bytes
Read SKILL.md
# YouTube Keyword & Topic Research (Advanced)
## Process
1. **Capture seed**: keyword, channel URL, or niche description. If only
a channel URL is provided, extract 5-10 seed topics from:
- The channel's top 25 videos by views (title + description entities)
- The channel's topic IDs from `channels.list?part=topicDetails`
2. **Expand** the seed set to 100-300 candidate keywords from
**first-party sources only** (third-party tools like VidIQ,
TubeBuddy, Ahrefs, and SocialBlade rate-limit and generate errors —
avoid them):
- YouTube suggest API (`https://suggestqueries.google.com/complete/
search?client=firefox&ds=yt&q={seed}`) — no key, returns JSON,View the complete source on GitHubyoutube-seo-optimize
When your agent uses it
Advanced YouTube metadata optimizer. Generates Browse-primary and Search-primary title variants, entity-rich descriptions, tags, chapters with Key Moments schema, 15-second hook script, translated metadata for top markets, pinned comment, and end-screen plan. Use when user says "optimize my video", "rewrite my title", "write YouTube description", "generate tags", or provides raw video info asking for metadata.
What it loads into context
Frontmatter
139 tokensAlways available to the agent
SKILL.md
2,474 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Required Inputs (ask in one batch if missing)
- Optimization Strategy by Surface
- Outputs (deliver all nine blocks)
- Rationale Block (always include)
- Keyword Discovery Fallback
- Shorts Template (when <60s vertical)
- Error Handling
Files
SKILL.mdcore9,756 bytes
Read SKILL.md
# YouTube Metadata Optimizer (Advanced)
Produce paste-ready metadata that optimizes for **the specific surface**
the user cares about, not a generic keyword-stuffing pass. Browse and
Search require different strategies; generate both when the goal is
mixed discovery.
## Required Inputs (ask in one batch if missing)
1. Video URL **or** raw topic + video outline/script
2. **Target surface**: Browse (Home feed) / Search / Suggested / Shorts /
mixed — this changes the title and thumbnail strategy
3. **Primary target keyword** (or ask for suggestions via
`youtube-seo-keywords`)View the complete source on GitHubyoutube-seo-thumbnail
When your agent uses it
Advanced thumbnail CTR analysis using computer vision, face/emotion detection, CLIP-embedding SERP similarity, Gestalt composition rules, and YouTube native Test & Compare planning. Use when user says "thumbnail review", "improve CTR", "thumbnail design", or provides a thumbnail image/URL.
What it loads into context
Frontmatter
117 tokensAlways available to the agent
SKILL.md
1,851 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Data Collection
- Analysis Dimensions
- Output
- Error Handling
Scripts executed separately
../scripts/analyze_thumbnail.py
Files
../scripts/analyze_thumbnail.pyruns6,129 bytesSKILL.mdcore7,408 bytesSKILL.mdcore7,408 bytes
Read SKILL.md
# Thumbnail Analysis (Advanced)
Diagnose CTR potential quantitatively when possible, qualitatively when
not. Thumbnail is the single biggest pre-click lever after title.
## Data Collection
1. **Source thumbnail**: download the maxres (`maxresdefault.jpg`) from
`https://i.ytimg.com/vi/{VIDEO_ID}/maxresdefault.jpg`, fall back to
`hqdefault.jpg` if missing
2. **SERP grid**: fetch the top 12 YouTube results for the primary
keyword, download each thumbnail, build a 4x3 contact sheet
3. **Computer-vision pass** via `scripts/analyze_thumbnail.py`:
- OpenCV face detection (count, bbox, size %)View the complete source on GitHubyoutube-seo-video
When your agent uses it
Advanced single-video SEO analysis covering retention curve diagnosis, intro hook strength, APV vs niche benchmark, entity/semantic coverage, title/description/tags, chapters with Key Moments schema, thumbnail, captions, audio loudness, end-screens, and engagement signals. Use when user says "analyze this video", "why isn't my video ranking", or provides a single video URL.
What it loads into context
Frontmatter
134 tokensAlways available to the agent
SKILL.md
2,585 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Data Collection (in order)
- Analysis Dimensions
- Output
- Error Handling
Scripts executed separately
../scripts/analyze_thumbnail.py../scripts/fetch_video.py
Files
../scripts/analyze_thumbnail.pyruns6,129 bytes../scripts/fetch_video.pyruns8,331 bytesSKILL.mdcore10,251 bytes
Read SKILL.md
# Single Video Deep Analysis (Advanced)
Diagnose **why** a video underperforms and produce a paste-ready fix kit.
Retention and CTR are the primary levers; metadata is secondary. Always
ask for the Studio CSV export if the user wants retention diagnosis —
never guess Tier 1 numbers.
## Data Collection (in order)
1. **WebFetch** the watch URL → title, description (partial), view/like,
duration, upload date, channel, visible chapters
2. **yt-dlp** (`scripts/fetch_video.py` or direct call) → full JSON
metadata, tags, full description, chapters, thumbnails, captions
3. **YouTube Data API** (if key) → `videos.list?part=snippet,statistics,View the complete source on GitHubSkills included
- youtube-seo
- youtube-seo-audit
- youtube-seo-channel
- youtube-seo-competitor
- youtube-seo-keywords
- youtube-seo-optimize
- youtube-seo-thumbnail
- youtube-seo-video
Repository facts
- License
- MIT
- Created
- Apr 9, 2026
- Last pushed
- Apr 9, 2026
- Forks
- 3
- Open issues
- 0
- Project activity
- Slowing
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 6, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 5 notes
youtube-seo/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedyoutube-seo/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedyoutube-seo-audit/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedyoutube-seo-competitor/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedyoutube-seo-thumbnail/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- 8 broad permissionsin 8 files: youtube-seo-audit/SKILL.md:1 youtube-seo-channel/SKILL.md:1 youtube-seo-competitor/SKILL.md:1 and 5 more
- No dangerous shell commands
- 87 network referencesin 5 files: scripts/fetch_video.py:43 scripts/fetch_channel.py:24 youtube-seo-keywords/SKILL.md:28 and 2 more
- No hidden or obfuscated text
- No instruction overrides
- 7 executable scriptsin 3 files: scripts/analyze_thumbnail.py:1 scripts/fetch_channel.py:1 scripts/fetch_video.py:1
- 62 references to secretsin 4 files: scripts/fetch_channel.py:4 scripts/fetch_video.py:4 youtube-seo-keywords/SKILL.md:120 and 1 more
- No requests to vote in Hot
Show all 164 signals by file
scripts/analyze_thumbnail.py
scripts/fetch_channel.py
- Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 4
[Credential-related source omitted] - Access to secretsline 4
[Credential-related source omitted] - Network accessline 24
API_BASE = "https://www.googleapis.com/youtube/v3" - Network accessline 24
API_BASE = "https://www.googleapis.com/youtube/v3" - Access to secretsline 27
[Credential-related source omitted] - Access to secretsline 27
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Network accessline 55
[Credential-related source omitted] - Network accessline 55
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Network accessline 56
try: with urllib.request.urlopen(url, timeout=20) as r: items = json.loads(r.read()).get("items", []) - Network accessline 56
try: with urllib.request.urlopen(url, timeout=20) as r: items = json.loads(r.read()).get("items", []) - Network accessline 57
with urllib.request.urlopen(url, timeout=20) as r: - Network accessline 57
with urllib.request.urlopen(url, timeout=20) as r: - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted] - Network accessline 67
parts = "snippet,statistics,topicDetails,brandingSettings,status,contentDetails" url = f"{API_BASE}/channels?part={parts}&id={channel_id}&key={api_key}" with urllib.request.urlopen(url, timeout=30) as r: - Network accessline 67
parts = "snippet,statistics,topicDetails,brandingSettings,status,contentDetails" url = f"{API_BASE}/channels?part={parts}&id={channel_id}&key={api_key}" with urllib.request.urlopen(url, timeout=30) as r: - Network accessline 68
[Credential-related source omitted] - Network accessline 68
[Credential-related source omitted] - Access to secretsline 68
[Credential-related source omitted] - Access to secretsline 68
[Credential-related source omitted] - Network accessline 69
with urllib.request.urlopen(url, timeout=30) as r: - Network accessline 69
with urllib.request.urlopen(url, timeout=30) as r: - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Network accessline 106
[Credential-related source omitted] - Network accessline 106
[Credential-related source omitted] - Network accessline 107
url += f"&pageToken={token}" with urllib.request.urlopen(url, timeout=30) as r: data = json.loads(r.read()) - Network accessline 107
url += f"&pageToken={token}" with urllib.request.urlopen(url, timeout=30) as r: data = json.loads(r.read()) - Network accessline 108
with urllib.request.urlopen(url, timeout=30) as r: - Network accessline 108
with urllib.request.urlopen(url, timeout=30) as r: - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Network accessline 133
[Credential-related source omitted] - Network accessline 133
[Credential-related source omitted] - Access to secretsline 133
[Credential-related source omitted] - Access to secretsline 133
[Credential-related source omitted] - Network accessline 134
) with urllib.request.urlopen(url, timeout=30) as r: data = json.loads(r.read()) - Network accessline 134
) with urllib.request.urlopen(url, timeout=30) as r: data = json.loads(r.read()) - Network accessline 135
with urllib.request.urlopen(url, timeout=30) as r: - Network accessline 135
with urllib.request.urlopen(url, timeout=30) as r: - Access to secretsline 154
[Credential-related source omitted] - Access to secretsline 154
[Credential-related source omitted] - Network accessline 157
[Credential-related source omitted] - Network accessline 157
[Credential-related source omitted] - Access to secretsline 157
[Credential-related source omitted] - Access to secretsline 157
[Credential-related source omitted] - Network accessline 158
) with urllib.request.urlopen(url, timeout=30) as r: return [ - Network accessline 158
) with urllib.request.urlopen(url, timeout=30) as r: return [ - Network accessline 159
with urllib.request.urlopen(url, timeout=30) as r: - Network accessline 159
with urllib.request.urlopen(url, timeout=30) as r: - Access to secretsline 223
[Credential-related source omitted] - Access to secretsline 223
[Credential-related source omitted] - Access to secretsline 224
[Credential-related source omitted] - Access to secretsline 224
[Credential-related source omitted] - Access to secretsline 228
[Credential-related source omitted] - Access to secretsline 228
[Credential-related source omitted] - Access to secretsline 235
[Credential-related source omitted] - Access to secretsline 235
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 243
[Credential-related source omitted] - Access to secretsline 243
[Credential-related source omitted] - Access to secretsline 245
[Credential-related source omitted] - Access to secretsline 245
[Credential-related source omitted] - Access to secretsline 249
[Credential-related source omitted] - Access to secretsline 249
[Credential-related source omitted] - Access to secretsline 250
[Credential-related source omitted] - Access to secretsline 250
[Credential-related source omitted]
scripts/fetch_video.py
- Executable scriptline 1
#!/usr/bin/env python3 - Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 4
[Credential-related source omitted] - Access to secretsline 4
[Credential-related source omitted] - Access to secretsline 42
[Credential-related source omitted] - Access to secretsline 42
[Credential-related source omitted] - Network accessline 43
parts = "snippet,statistics,contentDetails,topicDetails,status,player,liveStreamingDetails" url = ( "https://www.googleapis.com/youtube/v3/videos" - Network accessline 43
parts = "snippet,statistics,contentDetails,topicDetails,status,player,liveStreamingDetails" url = ( "https://www.googleapis.com/youtube/v3/videos" - Network accessline 44
url = ( "https://www.googleapis.com/youtube/v3/videos" f"?part={parts}&id={video_id}&key={api_key}" - Network accessline 44
url = ( "https://www.googleapis.com/youtube/v3/videos" f"?part={parts}&id={video_id}&key={api_key}" - Network accessline 45
"https://www.googleapis.com/youtube/v3/videos" - Network accessline 45
"https://www.googleapis.com/youtube/v3/videos" - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Network accessline 47
) try: with urllib.request.urlopen(url, timeout=30) as resp: - Network accessline 47
) try: with urllib.request.urlopen(url, timeout=30) as resp: - Network accessline 48
try: with urllib.request.urlopen(url, timeout=30) as resp: data = json.loads(resp.read()) - Network accessline 48
try: with urllib.request.urlopen(url, timeout=30) as resp: data = json.loads(resp.read()) - Network accessline 49
with urllib.request.urlopen(url, timeout=30) as resp: - Network accessline 49
with urllib.request.urlopen(url, timeout=30) as resp: - Network accessline 98
attempts = [ ["yt-dlp", "-j", "--no-warnings", "--skip-download", f"https://www.youtube.com/watch?v={video_id}"], - Network accessline 98
attempts = [ ["yt-dlp", "-j", "--no-warnings", "--skip-download", f"https://www.youtube.com/watch?v={video_id}"], - Network accessline 99
["yt-dlp", "-j", "--no-warnings", "--skip-download", f"https://www.youtube.com/watch?v={video_id}"], ["yt-dlp", "-j", "--no-warnings", "--skip-download", - Network accessline 99
["yt-dlp", "-j", "--no-warnings", "--skip-download", f"https://www.youtube.com/watch?v={video_id}"], ["yt-dlp", "-j", "--no-warnings", "--skip-download", - Network accessline 100
f"https://www.youtube.com/watch?v={video_id}"], ["yt-dlp", "-j", "--no-warnings", "--skip-download", "--extractor-args", "youtube:player_client=android", - Network accessline 100
f"https://www.youtube.com/watch?v={video_id}"], ["yt-dlp", "-j", "--no-warnings", "--skip-download", "--extractor-args", "youtube:player_client=android", - Network accessline 101
["yt-dlp", "-j", "--no-warnings", "--skip-download", "--extractor-args", "youtube:player_client=android", f"https://www.youtube.com/watch?v={video_id}"], - Network accessline 101
["yt-dlp", "-j", "--no-warnings", "--skip-download", "--extractor-args", "youtube:player_client=android", f"https://www.youtube.com/watch?v={video_id}"], - Network accessline 102
"--extractor-args", "youtube:player_client=android", f"https://www.youtube.com/watch?v={video_id}"], ["yt-dlp", "-j", "--no-warnings", "--skip-download", - Network accessline 102
"--extractor-args", "youtube:player_client=android", f"https://www.youtube.com/watch?v={video_id}"], ["yt-dlp", "-j", "--no-warnings", "--skip-download", - Network accessline 103
f"https://www.youtube.com/watch?v={video_id}"], ["yt-dlp", "-j", "--no-warnings", "--skip-download", "--extractor-args", "youtube:player_client=ios", - Network accessline 103
f"https://www.youtube.com/watch?v={video_id}"], ["yt-dlp", "-j", "--no-warnings", "--skip-download", "--extractor-args", "youtube:player_client=ios", - Network accessline 104
["yt-dlp", "-j", "--no-warnings", "--skip-download", "--extractor-args", "youtube:player_client=ios", f"https://www.youtube.com/watch?v={video_id}"], - Network accessline 104
["yt-dlp", "-j", "--no-warnings", "--skip-download", "--extractor-args", "youtube:player_client=ios", f"https://www.youtube.com/watch?v={video_id}"], - Network accessline 105
"--extractor-args", "youtube:player_client=ios", f"https://www.youtube.com/watch?v={video_id}"], ] - Network accessline 105
"--extractor-args", "youtube:player_client=ios", f"https://www.youtube.com/watch?v={video_id}"], ] - Network accessline 106
f"https://www.youtube.com/watch?v={video_id}"], - Network accessline 106
f"https://www.youtube.com/watch?v={video_id}"], - Network accessline 167
"-o", f"/tmp/yt_{video_id}.%(ext)s", f"https://www.youtube.com/watch?v={video_id}", - Network accessline 167
"-o", f"/tmp/yt_{video_id}.%(ext)s", f"https://www.youtube.com/watch?v={video_id}", - Network accessline 168
f"/tmp/yt_{video_id}.%(ext)s", f"https://www.youtube.com/watch?v={video_id}", ], - Network accessline 168
f"/tmp/yt_{video_id}.%(ext)s", f"https://www.youtube.com/watch?v={video_id}", ], - Network accessline 169
f"https://www.youtube.com/watch?v={video_id}", - Network accessline 169
f"https://www.youtube.com/watch?v={video_id}", - Network accessline 187
def download_thumbnail(video_id: str, out_path: str) -> bool: for name in ("maxresdefault", "sddefault", "hqdefault"): url = f"https://i.ytimg.com/vi/{video_id}/{name}.jpg" - Network accessline 187
def download_thumbnail(video_id: str, out_path: str) -> bool: for name in ("maxresdefault", "sddefault", "hqdefault"): url = f"https://i.ytimg.com/vi/{video_id}/{name}.jpg" - Network accessline 188
for name in ("maxresdefault", "sddefault", "hqdefault"): url = f"https://i.ytimg.com/vi/{video_id}/{name}.jpg" try: - Network accessline 188
for name in ("maxresdefault", "sddefault", "hqdefault"): url = f"https://i.ytimg.com/vi/{video_id}/{name}.jpg" try: - Network accessline 189
url = f"https://i.ytimg.com/vi/{video_id}/{name}.jpg" try: with urllib.request.urlopen(url, timeout=20) as r: - Network accessline 189
url = f"https://i.ytimg.com/vi/{video_id}/{name}.jpg" try: with urllib.request.urlopen(url, timeout=20) as r: - Network accessline 190
try: with urllib.request.urlopen(url, timeout=20) as r: Path(out_path).write_bytes(r.read()) - Network accessline 190
try: with urllib.request.urlopen(url, timeout=20) as r: Path(out_path).write_bytes(r.read()) - Network accessline 191
with urllib.request.urlopen(url, timeout=20) as r: - Network accessline 191
with urllib.request.urlopen(url, timeout=20) as r: - Access to secretsline 207
[Credential-related source omitted] - Access to secretsline 207
[Credential-related source omitted] - Access to secretsline 208
[Credential-related source omitted] - Access to secretsline 208
[Credential-related source omitted]
youtube-seo-audit/SKILL.md
- Broad permissionsline 1
Bash
youtube-seo-channel/SKILL.md
- Broad permissionsline 1
Bash
youtube-seo-competitor/SKILL.md
- Broad permissionsline 1
Bash
youtube-seo-keywords/SKILL.md
- Broad permissionsline 1
Bash - Network accessline 28
TubeBuddy, Ahrefs, and SocialBlade rate-limit and generate errors — avoid them): - YouTube suggest API (`https://suggestqueries.google.com/complete/ - Network accessline 29
avoid them): - YouTube suggest API (`https://suggestqueries.google.com/complete/ search?client=firefox&ds=yt&q={seed}`) — no key, returns JSON, - Network accessline 30
- YouTube suggest API (`https://suggestqueries.google.com/complete/ - Network accessline 116
1. **YouTube suggest API** (no key, no rate limits in practice): `https://suggestqueries.google.com/complete/search?client=firefox&ds=yt&q={seed}` - Network accessline 117
`https://suggestqueries.google.com/complete/search?client=firefox&ds=yt&q={seed}` - Access to secretsline 120
[Credential-related source omitted]
youtube-seo-optimize/SKILL.md
youtube-seo-thumbnail/SKILL.md
- Broad permissionsline 1
Bash - Network accessline 25
1. **Source thumbnail**: download the maxres (`maxresdefault.jpg`) from `https://i.ytimg.com/vi/{VIDEO_ID}/maxresdefault.jpg`, fall back to - Network accessline 26
`https://i.ytimg.com/vi/{VIDEO_ID}/maxresdefault.jpg`, fall back to `hqdefault.jpg` if missing 2. **SERP grid**: fetch the top 12 YouTube results for the primary
youtube-seo-video/SKILL.md
- Broad permissionsline 1
Bash
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 6 facts
- Contacts www.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/fetch_channel.py:24High confidence
- Contacts www.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/fetch_video.py:45High confidence
- Allows Bash without restrictions, though it has no scripts or shell blocksyoutube-seo-audit/SKILL.md:12High confidence
- Allows Bash without restrictions, though it has no scripts or shell blocksyoutube-seo-channel/SKILL.md:12High confidence
- Allows Bash without restrictions, though it has no scripts or shell blocksyoutube-seo-keywords/SKILL.md:11High confidence
- Allows Bash without restrictions, though it has no scripts or shell blocksyoutube-seo-optimize/SKILL.md:12High confidence
Signal confidence: 164 facts
- Executable script in code of a file that runsscripts/analyze_thumbnail.py:1High confidence
- Executable script in code of a file that runsscripts/analyze_thumbnail.py:1High confidence
- Executable script in code of a file that runsscripts/analyze_thumbnail.py:1High confidence
- Executable script in code of a file that runsscripts/fetch_channel.py:1High confidence
- Executable script in code of a file that runsscripts/fetch_channel.py:1High confidence
- Access to secrets in prose of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:4Low confidence
- Access to secrets in prose of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:4Low confidence
- Network access in code of a file that runsscripts/fetch_channel.py:24High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:24High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:27Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:27Low confidence
- Access to secrets in code of a file that runsscripts/fetch_channel.py:38High confidence
- Access to secrets in code of a file that runsscripts/fetch_channel.py:38High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:39Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:39Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:40Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:40Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:41Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:41Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:54Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:54Low confidence
- Network access in code of a file that runsscripts/fetch_channel.py:55High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:55High confidence
- Access to secrets in code of a file that runsscripts/fetch_channel.py:55High confidence
- Access to secrets in code of a file that runsscripts/fetch_channel.py:55High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:56High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:56High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:57High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:57High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:66Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:66Low confidence
- Network access in code of a file that runsscripts/fetch_channel.py:67High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:67High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:68High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:68High confidence
- Access to secrets in code of a file that runsscripts/fetch_channel.py:68High confidence
- Access to secrets in code of a file that runsscripts/fetch_channel.py:68High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:69High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:69High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:98Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:98Low confidence
- Access to secrets in code of a file that runsscripts/fetch_channel.py:104High confidence
- Access to secrets in code of a file that runsscripts/fetch_channel.py:104High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:106High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:106High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:107High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:107High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:108High confidence
- Network access in code of a file that runsscripts/fetch_channel.py:108High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuescripts/fetch_channel.py:127Low confidence
and 114 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Frontmatter field argument-hint in youtube-seo-audit/SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md youtube-seo/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md youtube-seo/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md youtube-seo/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md youtube-seo/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md youtube-seo/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.