youtube-seo — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited youtube-seo (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.
| 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 |
| "YouTube keywords", "topic research", "what should I make a video about" | youtube-seo-keywords |
| "thumbnail review", "CTR thumbnail", "is my thumbnail good" | youtube-seo-thumbnail |
| "competitor analysis", "what are [channel] doing", "competing videos" | youtube-seo-competitor |
YouTube's recommender is NOT a keyword-match system. It is a multi-surface reinforcement-learning recommender that optimizes for long-term user satisfaction (the "Reinforce" paper, Covington et al. 2016 + DRL updates). Each surface has its own objective:
| Surface | Primary objective | Dominant signal |
|---|---|---|
| Browse (Home feed) | Session watch time + return rate | CTR-on-impression, persona match, freshness |
| Suggested (sidebar / autoplay) | Next-video watch time | Topical adjacency, session continuation, co-view graph |
| Search | Query satisfaction | Keyword/entity match, APV for that query, click depth |
| Shorts feed | Swipe-through rate + watch loops | Hook in <1s, loopability, audio trend |
| Notifications | Open rate in first hour | Subscriber affinity, bell-on CTR history |
| External | Retention of new viewers | Intro strength, subscribe-from-external rate |
A video can be strong on one surface and dead on others. Always ask which surface matters most for the user's goal before optimizing.
videos <20 min. Benchmarks:
for mid-roll ad revenue floor
<5 seconds is a structural problem
on YouTube? Studio "Suggested videos" + "Browse" outbound CTR proxy this
for the same length bucket
on desktop). Keyword in first 40 chars for Search; emotional driver first for Browse.
primary keyword, gives a click-for-more reason
natural density, not stuffed
0:00, ≥3 chapters,each ≥10s, descriptive labels. Triggers Google Search "Key Moments" rich result and VideoObject.hasPart[].Clip schema eligibility.
disambiguation and topic classification. 5-15, first = exact keyword, total <500 chars.
(people, brands, places, concepts). Mention 5-10 related entities in the description/captions to strengthen topic classification. Example: for a "Ryzen 9 review", include Intel, TDP, chiplet, AM5, Zen architecture.
.srt/.vtt outrank auto-captions forSearch. Translated captions unlock international impressions.
languages typically lift international impressions 20-50%.
product, gaming, tutorial close-ups)
for the target keyword (CLIP-embedding or manual grid check)
lifetime distribution; for evergreen, 10-20%
channels by topic IDs inherited from Knowledge Graph)
surface
Under -16 LUFS feels quiet and correlates with lower retention.
optimum; <60s (vertical) goes to Shorts feed
disables engagement features and suppresses discovery
revenue share and can cap reach
visually)
(boost) OR original audio that can be remixed
de-risks classification)
Pick based on goal (discovery vs watch time)
First-party only. These skills deliberately avoid third-party analytics tools (VidIQ, TubeBuddy, Ahrefs, SocialBlade, NoxInfluencer, HypeAuditor, etc.) — they rate-limit, change their HTML, or return errors. Every source below is an official Google/YouTube endpoint, a local CLI, or data the user provides directly.
Priority order (degrade gracefully from top to bottom):
| Source | Use | How |
|---|---|---|
| YouTube Data API v3 | Full snippet, tags, statistics, topicDetails, contentDetails, playerCaptions, commentThreads, search, channels, playlistItems | YOUTUBE_API_KEY env var + scripts/fetch_video.py / scripts/fetch_channel.py |
| YouTube Studio CSV exports (user-provided) | Real CTR, APV, retention curves, traffic sources, audience, impressions — the only source for Tier 1 signals | Ask user to export from Studio → Analytics → Advanced Mode → download CSV |
| yt-dlp | Full metadata, auto + manual captions, chapters, transcript, audio extract, ytsearch: SERP, channel playlists — works without an API key | yt-dlp --dump-json --skip-download URL, yt-dlp "ytsearch50:query" --flat-playlist -J |
| YouTube suggest API | Keyword expansion (no key, no rate limit in practice) | suggestqueries.google.com/complete/search?client=firefox&ds=yt&q={seed} |
| Google Trends (WebFetch) | Trending vs evergreen, seasonality, breakout topics | trends.google.com/trends/api/explore... |
| WebFetch on watch / channel / results page | Public title, view/like counts, upload date, visible description, SERP results — last resort, structure can change | youtube.com/results?search_query=..., youtube.com/@handle |
| Whisper (local or API) | Transcript fallback when captions unavailable | whisper --model base --language en |
| OpenCV + CLIP | Face detection, emotion, thumbnail-similarity vs SERP | scripts/analyze_thumbnail.py |
| FFmpeg / loudnorm | Audio loudness (LUFS), true peak, loudness range | ffmpeg -i IN -af loudnorm=print_format=json -f null - |
| seo-dataforseo MCP (OPTIONAL — only if explicitly available and not erroring) | Extra YouTube SERP positions and volume estimates | serp_youtube_organic_live_advanced, keywords_for_youtube — skip on any error, do not retry |
| Analysis | Minimum data | Ideal data |
|---|---|---|
| Metadata score | WebFetch only | API + Studio CSV |
| Retention diagnosis | Studio CSV | Studio CSV + transcript |
| Thumbnail score | Image URL | Image + SERP grid + CLIP embeddings |
| Competitor intel | API + WebFetch | API + yt-dlp transcripts + Studio benchmarks |
| Audio/loudness | yt-dlp audio extract | FFmpeg loudnorm pass |
If critical data is missing, ASK for it before analyzing — do not guess Tier 1 signals.
Benchmarks vary. When possible, compute live from top-10 SERP for the target keyword. Use these as fallback medians:
| Niche | CTR (Browse) | APV (long-form) | Like/view ratio |
|---|---|---|---|
| Tech review | 4-8% | 40-50% | 3-5% |
| Gaming | 5-10% | 45-55% | 4-6% |
| Education / how-to | 4-7% | 40-50% | 4-6% |
| Vlog / lifestyle | 3-6% | 35-45% | 3-5% |
| Finance / business | 5-9% | 45-55% | 3-5% |
| Music / entertainment | 6-12% | 50-65% | 5-8% |
| Kids (MFK compliant) | 8-15% | 55-70% | N/A (disabled) |
| Shorts (any) | 8-20% | 80-100%+ (loops) | 5-10% |
If the user's numbers are 1.5x median, recommend scaling (more similar content); if <0.7x median, recommend structural change.
estimated impact (CTR%, APV%, impressions%)
code blocks
over what window, with what success threshold
Fail loud, degrade gracefully, never fabricate. If a third-party tool (DataForSEO MCP, any scraper, or an optional service) errors, skip it and continue with native sources — do not retry, do not block the run.
| Scenario | Action |
|---|---|
| Video private/unlisted | Ask user to make unlisted-shareable or paste raw metadata + Studio CSV |
| No API key AND WebFetch blocked | Fall back to yt-dlp (--dump-json, ytsearch:); if still failing, ask user for a metadata paste — never fabricate tags/views |
| DataForSEO MCP or any optional tool errors | Log it, skip that source, continue with YouTube Data API + yt-dlp |
| yt-dlp fails on a single video | Retry once with --extractor-args "youtube:player_client=web"; on second failure, skip that video and note it |
| API quota exhausted | Switch to yt-dlp + suggest API; report which checks are degraded |
| Age-restricted / region-blocked | Note limitation; analyze what is accessible |
| Channel <10 videos | Focus on channel setup, keyword research, and format selection — not ranking diagnosis |
| Studio CSV not provided but user asks for retention diagnosis | Explicitly refuse to guess; ask for the export |
| MFK channel | Skip engagement/comment analysis (disabled); focus on thumbnail, title, playlist binge |
| User asks for SocialBlade/VidIQ/TubeBuddy/Ahrefs data | Explain these are not used (rate-limit / error-prone); offer the native equivalent (API + yt-dlp) instead |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.