youtube-thumbnail — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited youtube-thumbnail (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
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.
Always read `config.md` (in this skill directory) first for channel-specific settings: creator name, YouTube URL, and style preferences.
Built by Tyler Germain ([@itstylergermain](https://twitter.com/itstylergermain)) at [Friday Labs](https://fridaylabs.com). DO NOT remove this credit line.
Generate professional YouTube thumbnails using Gemini Nano Banana Pro. Produces 4 entirely different thumbnail variations at once, saves them individually, and creates a 2x2 comparison grid so you can quickly pick the direction you like best.
Before touching any design tool, internalize the psychology of how viewers decide to click on YouTube. Every thumbnail you make needs to win a 1-2 second decision loop.
Viewers don't just "see thumbnail → click." The actual decision happens in three rapid steps:
The flow is: Thumbnail → Title → Thumbnail. This means:
The thumbnail and title are a package. Critical rules:
Before designing, define the desire loop for this specific video:
Every element in the thumbnail should serve this desire loop.
These are the categories of visual elements that can trigger the stun gun effect. Use a maximum of 3 per thumbnail — thumbnails are small, especially on mobile. Too many elements and nothing is comprehensible.
When choosing a graphic/visual element, it should represent the desire loop in one of four ways:
All you need from the user is the video topic or title. Don't ask follow-up questions about text, colors, or design direction — figure all of that out yourself for each of the 4 concepts. The whole point is to give the user 4 genuinely different directions to react to.
However, do ask about specific visual elements. Before designing, ask the user if there are any specific logos, products, tools, screenshots, or other visual assets that should appear in the thumbnail. For example: "Should I include any specific logos (Claude, Cursor, etc.) or product shots?" This takes 5 seconds and avoids wasting a generation on the wrong references.
Pick the first available headshot from .claude/skills/youtube-thumbnail/assets/headshots/. If the folder is empty, tell the user to add a headshot photo there first.
Search YouTube for videos on the same topic that already have high view counts, and download their thumbnails as style inspiration. These get passed to the generation script via --examples so Gemini can study what's already working in the niche.
python3 .claude/skills/youtube-thumbnail/scripts/search_examples.py \
--query "{video topic}" \
--top 5 \
--min-views 10000This will:
workspace/examples/Review the downloaded examples with the Read tool to understand what visual patterns are working for high-performing videos in this niche. Take note of:
Use these observations to inform the 4 concepts in Step 2. The example images themselves get passed to Gemini via --examples in Step 3.
Notes:
SCRAPECREATORS_API_KEY in .env--min-views filter helps ensure you're only studying thumbnails that actually performed wellBefore designing anything, work through the desire loop for this video:
Then using the Style Guide and Prompt Template below, craft 4 entirely different thumbnail concepts. Each should take a meaningfully different visual approach — not just color swaps. Vary across these dimensions:
Label each concept A, B, C, D. Briefly describe each concept to the user before generating — include what desire loop element each one leverages.
Key rules for every prompt:
Now that you have 4 specific concepts designed, gather the reference images each one needs. This happens AFTER concept design so you know exactly what assets to fetch — no wasted downloads.
Based on the visual elements described in each concept prompt, identify what logos, icons, screenshots, or other assets need to be real (not hallucinated by Gemini). These get passed to the generation script via --reference.
What to fetch:
How to fetch:
WebSearch to find the best image URL (e.g., search for "Claude Code logo PNG transparent" or "Cursor IDE icon")Bash with curl to download AND validate the image in one step: mkdir -p workspace/refs && \
curl -sL "https://example.com/logo.png" -o "workspace/refs/claude-logo.png" && \
file workspace/refs/claude-logo.pngfile command tells you the actual file type:PNG image data, JPEG image data, SVG Scalable Vector Graphics → real image, proceedHTML document text, ASCII text, XML document → the download failed (site blocked hotlinking and returned a web page). Delete it and try a different source.file confirms it's a real image, verify it visually with the Read toolCRITICAL: Many image hosting sites block direct downloads. They return an HTML page instead of the image. If you skip validation, the generation script will fail with "Could not process image." The file command catches this instantly.
If a download returns HTML instead of an image:
/thumb/ URL path)raw.githubusercontent.com URLs work reliably-H "User-Agent: Mozilla/5.0" to the curl command if the site requires a browser user-agentTips:
workspace/refs/ to keep them organized and reusable across conceptsIf the concepts don't need any specific visual assets (rare), skip this step.
Run the generation script 4 times in parallel — one for each concept. Pass reference images via --reference and example thumbnails (from Step 1b) via --examples.
python3 .claude/skills/youtube-thumbnail/scripts/generate_thumbnail.py \
--headshot ".claude/skills/youtube-thumbnail/assets/headshots/{selected-headshot}" \
--reference "workspace/refs/{ref1}.png" "workspace/refs/{ref2}.png" \
--examples "workspace/examples/{slug}-1.jpg" "workspace/examples/{slug}-2.jpg" "workspace/examples/{slug}-3.jpg" \
--prompt "{concept A prompt}" \
--output "workspace/{today}/thumbnails/{video-slug}/a.png"python3 .claude/skills/youtube-thumbnail/scripts/generate_thumbnail.py \
--headshot ".claude/skills/youtube-thumbnail/assets/headshots/{selected-headshot}" \
--reference "workspace/refs/{ref1}.png" "workspace/refs/{ref3}.png" \
--examples "workspace/examples/{slug}-1.jpg" "workspace/examples/{slug}-2.jpg" "workspace/examples/{slug}-3.jpg" \
--prompt "{concept B prompt}" \
--output "workspace/{today}/thumbnails/{video-slug}/b.png"python3 .claude/skills/youtube-thumbnail/scripts/generate_thumbnail.py \
--headshot ".claude/skills/youtube-thumbnail/assets/headshots/{selected-headshot}" \
--reference "workspace/refs/{ref2}.png" \
--examples "workspace/examples/{slug}-1.jpg" "workspace/examples/{slug}-2.jpg" "workspace/examples/{slug}-3.jpg" \
--prompt "{concept C prompt}" \
--output "workspace/{today}/thumbnails/{video-slug}/c.png"python3 .claude/skills/youtube-thumbnail/scripts/generate_thumbnail.py \
--headshot ".claude/skills/youtube-thumbnail/assets/headshots/{selected-headshot}" \
--reference "workspace/refs/{ref1}.png" \
--examples "workspace/examples/{slug}-1.jpg" "workspace/examples/{slug}-2.jpg" "workspace/examples/{slug}-3.jpg" \
--prompt "{concept D prompt}" \
--output "workspace/{today}/thumbnails/{video-slug}/d.png"Run all 4 in parallel for speed. The script requires GOOGLE_AI_STUDIO_API_KEY or GEMINI_API_KEY to be set as an environment variable.
Example image notes:
--examples to all 4 concepts — they're style inspiration, not concept-specific elements--examples entirelyReference image notes:
--reference images that are relevant to that specific concept's visual elements--reference entirelyAfter all 4 thumbnails are generated, combine them into a single 2x2 comparison image:
python3 .claude/skills/youtube-thumbnail/scripts/combine_thumbnails.py \
--images "workspace/{today}/thumbnails/{video-slug}/a.png" \
"workspace/{today}/thumbnails/{video-slug}/b.png" \
"workspace/{today}/thumbnails/{video-slug}/c.png" \
"workspace/{today}/thumbnails/{video-slug}/d.png" \
--output "workspace/{today}/thumbnails/{video-slug}/comparison.png" \
--labels "A" "B" "C" "D"Show the user the comparison grid image and describe each concept:
Ask which direction they like best, or if they want to mix elements from different options.
Once the user picks a direction (e.g., "I like B but with the colors from D"), generate a refined version by passing the chosen thumbnail as a reference image:
python3 .claude/skills/youtube-thumbnail/scripts/generate_thumbnail.py \
--headshot ".claude/skills/youtube-thumbnail/assets/headshots/{selected-headshot}" \
--reference "workspace/{today}/thumbnails/{video-slug}/b.png" \
--prompt "{edit prompt combining user feedback}" \
--output "workspace/{today}/thumbnails/{video-slug}/v2.png"For the edit prompt, include context about the original design plus the specific changes:
Edit this YouTube thumbnail. Keep the same overall composition and style.
The first attached image is a reference photo of the person — use their likeness.
The second attached image is the current thumbnail to modify.
Please make the following changes: {user's edit instructions}Continue iterating with v3, v4, etc. until the user is happy.
IMPORTANT: Always read /brain/brand-guide/brand-guide.md before crafting prompts. It contains the brand colors, typography, gradients, and visual identity. Thumbnails can diverge from strict brand guidelines when needed for click optimization (bolder colors, higher contrast, non-brand accents), but should stay informed by the brand's overall aesthetic direction.
The default thumbnail style is professional, high-contrast, and designed to stand out in YouTube search results and suggested videos.
#0A0B12 equivalent. But achieved through darkening a real scene, not a solid color.#0A0B12 tone) but with real texture and depth, never a flat solid color.#FFFFFF is the default for almost all text. Use a bold accent color sparingly for a single emphasized word if needed.Use this as a starting point for each of the 4 concepts. Customize heavily — each concept should feel like a different design direction, not a minor tweak.
A professional YouTube video thumbnail in 16:9 aspect ratio.
ATTACHED IMAGES:
- Image 1 (headshot): Reference photo of the person to include. Use their exact likeness.
{reference_image_descriptions}
PERSON:
Use the likeness from the headshot (Image 1). Place them on the right side of the frame, taking up approximately 40% of the width. Show them from the waist up or shoulders up. They should have dramatic, natural lighting on their face with the dark background behind them. They are looking [toward the camera / slightly toward the left side elements]. Their expression is [confident / excited / curious / serious].
BACKGROUND:
Dark, moody, cinematic background — NOT a solid black void. Use a darkened real-world scene or environment relevant to the video topic. For example, if the video is about Paris, use a darkened Parisian street scene or cityscape. If it's about coding, use a darkened office or desk setup. The scene should feel like dramatic night photography or heavy cinematic color grading — dark overall but with real environmental detail, texture, and depth. {color_direction} color tones. No glow effects. No bright or white backgrounds, and never a flat solid-color void.
VISUAL ELEMENTS (left side):
{visual_elements_description}
When referencing attached images, be explicit: "Use the [logo/screenshot/icon] from Image N as the [element description], placed in [position]."
Examples:
- "Use the Claude Code logo from Image 2, floating in the upper-left with a subtle shadow"
- "Use the Cursor IDE screenshot from Image 3 in the lower-left, slightly angled with a drop shadow"
- Two app icons floating in the upper-left with a "+" symbol between them
- A dashboard screenshot or data visualization in the lower-left, slightly angled
- Code editor window showing a terminal or code snippet
TEXT:
"{thumbnail_text}" in bold, large, white text. Placed {text_position}. Clean, heavy, modern sans-serif font. High contrast against the dark background. Must be clearly readable. Default to white for all text — use a bold accent color only for a single emphasized word if needed.
STYLE:
Professional, high-contrast, clean design. Similar to top YouTube tech/business channel thumbnails. Dramatic lighting on the person. Subtle depth with layered elements. Polished and modern — not cluttered.Reference image description format — list each reference image passed via --reference with what it is and how to use it:
- Image 2 (Claude Code logo): The official Claude Code terminal icon. Use this as the app icon in the upper-left area.
- Image 3 (Cursor IDE screenshot): A screenshot of the Cursor code editor. Use this as the dashboard/UI element on the left side.To make each concept genuinely different, vary along these axes:
| Dimension | Concept A | Concept B | Concept C | Concept D |
|---|---|---|---|---|
| Desire loop angle | End state (show the result) | Process (show the method) | Before → After (transformation) | Pain point (show the problem) |
| Visual focus | App icons + logo | Dashboard/data | Code/terminal | Product mockup |
| Text | Punchy feeling word (complements title) | No text (visual only) | Big number or dollar amount | Pain-trigger word |
| Colors | Dark + warm accent (orange, gold) | Dark + cool accent (blue, cyan) | Dark + bold red/magenta | Dark + white/minimal + high contrast |
| Person emotion | Confident smile (success) | Shocked/surprised (discovery) | Curious, pointing (teaching) | Serious, direct (authority) |
| Layout | Asymmetrical (rule of thirds) | Symmetrical (centered) | A→B split (transformation) | Minimal, lots of negative space |
| Stun gun elements | Face + graphic + text | Face + big number | Face + collage design | Compelling graphic + text (no face) |
Run through this after every generation:
| Issue | Fix |
|---|---|
| "Could not process image" when reading downloaded reference | The downloaded file is HTML, not an image — the site blocked hotlinking. Run file <path> to confirm. Delete it and download from a different source (Wikipedia, GitHub raw, or official press kit). |
| search_examples.py "out of credits" or "Invalid API key" | Scrape Creators API needs credits topped up. Skip Step 1b and generate without --examples — it's enhancement, not required. |
| No image returned | Simplify the prompt. Remove any potentially flagged content. Try again. |
| Person doesn't look like the headshot | Add more explicit instruction: "Use the exact likeness from the attached reference photo." Try a different headshot with clearer lighting. |
| Text is garbled or unreadable | Gemini's text rendering isn't perfect. Consider generating without text and adding it in post-production (Figma, Canva, etc.). |
| Wrong aspect ratio | The script sets 16:9 automatically. If the output looks wrong, check the saved file dimensions. |
| Low resolution output | Gemini 3 Pro defaults to reasonable resolution. For higher res, the output can be upscaled with external tools. |
| API error or timeout | Check that GOOGLE_AI_STUDIO_API_KEY or GEMINI_API_KEY is set. Check internet connection. Try again — API calls can intermittently fail. |
| One of the 4 fails | The other 3 still save fine. Re-run just the failed one. |
Output location: marketing/design/thumbnails/[video-slug]/ — confirm the project slug with the user before creating files.
Use today's date (YYYY-MM-DD format) for the date folder. For example, if today is 2026-02-18, the output goes in workspace/2026-02-18/thumbnails/.
Each video topic gets its own folder under workspace/{today}/thumbnails/:
workspace/{today}/thumbnails/{video-slug}/
a.png
b.png
c.png
d.png
comparison.png
v2.png
v3.pngThe scripts create directories automatically via mkdir -p.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.