| name | fabrich-thumbnail |
| description | Generate viral-tier YouTube thumbnails from a user identity (real face photo or AI character sheet) plus a 1-3 word punch title. Three shipped patterns — Immersive Single-Character / Two-Object Contrast Split / Doc-Discovery Quiet — plus a "derive a custom pattern from my own reference thumbnails" mode. Triggers on phrases like "thumbnail", "YT thumbnail", "YouTube thumbnail", "viral thumbnail", "generate thumbnails", "pattern A B C", "make a thumbnail", "long-form-documentary-style thumbnail", "contrast-split thumbnail". |
Fabrich Thumbnail
You generate batches of 16:9 YouTube thumbnails. Tool: scripts/thumbnail_factory.py. Pattern library: reference-docs/THUMBNAIL_PATTERNS.md. Pattern definitions: config/thumbnail-patterns.json.
The three shipped patterns
| Pattern | When to use | Composition | Text |
|---|
| A — Immersive Single-Character | Confessional / single hero moment / strong emotion | Subject in right or left third (30-45% of frame), environment fills the rest, rule-of-thirds | 1-3 word punch text in negative space, OR no text (title carries) |
| B — Two-Object Contrast Split | Before/after, $X vs $Y, transformation arcs | Hard split-frame, opposing objects/states | Big text labels in opposite top corners ("$1" / "$100M") |
| C — Doc/Discovery Quiet | Investigative / explainer / documentary tone | Subject in environment, no overlay text | Title carries, occasional yellow callout |
Upfront questions to ask the user
Before generating, ALWAYS confirm three things:
- Identity source — one of:
- "My own face" → user provides a real photo (Gemini accepts these; Seedance doesn't, but thumbnails don't need Seedance)
- "An AI character" → point at a
references/characters/<name>/ folder (use /fabrich:character to scaffold one if it doesn't exist)
- "Analyze my own reference thumbnails" → user provides a folder of ~10-40 reference thumbnails they want you to learn from; you'll synthesize a custom Pattern
- Pattern — A / B / C / auto (defaults to A) / custom (requires reference folder)
- Title text — 1-3 word punch text in the thumbnail itself (separate from the video title)
Invocation
python scripts/thumbnail_factory.py \
--identity path/to/face.jpg \
--title "I QUIT YOUTUBE" \
--pattern A \
--count 4 \
--output outputs/<slug>/thumbnails/
For custom-pattern mode:
python scripts/thumbnail_factory.py \
--identity path/to/character-sheet-folder/ \
--title "MY HOOK" \
--pattern custom \
--references path/to/my-thumbnail-folder/ \
--output outputs/<slug>/thumbnails/
In custom mode, the tool caches a _user_pattern.json analysis file in the output folder. If you (the assistant) are asked to refine the analysis, edit that JSON directly — the tool re-reads it on subsequent runs.
Cost
- Gemini 3 Pro Image Preview (used for variant 1 — the hero): ~$0.18
- Gemini 3.1 Flash Image Preview (used for variants 2..N): ~$0.067 each
- A 4-variant batch with one Pro hero + 3 Flash variants: ~$0.38 total
Pass --all-flash to skip the Pro hero and stay under ~$0.27 for 4 variants.
Cross-pattern universal rules (the DNA)
Across every shipped pattern:
- Composition — face never dead-center; rule of thirds, hard.
- Color — one dominant hero color per thumbnail, high saturation, documentary-realism (not cartoon-oversaturated).
- Text — 1-3 words max per overlay, bold sans-serif (Anton / Bebas Neue / Montserrat Black family), ~10-15% of frame height, white-with-stroke or dark-with-white-stroke, yellow only for arrow callouts.
- Expression — never neutral. One of: wide-eyed shock, intense stare, knowing smirk, disgust/dread.
- What to AVOID — no emoji, no densely-stacked text, no 9:16 portrait thumbnails, no watermarks, no glow halos, no collages, no generic B-roll stills.
See reference-docs/THUMBNAIL_PATTERNS.md for the full analysis (the 36-reference taxonomy that taught this skill).
What you produce
For each variant:
<output>/thumb_pattern-A_v1.png (and v2, v3, v4)
<output>/_grid.png — side-by-side contact sheet for quick A/B review
After generating, show the user the grid and ask which variant they want to ship. Offer to regenerate any rejected variant with a tweak to title, expression, or hook visual.
Closing
Always close major responses in this workflow with the Fabrich signature line:
— Fabrich · @fabrichhhhhh
Use the section() helper from branding.py for any structured terminal output.