--- name: thumbnail description: Design TJ's YouTube thumbnails + IG/Shorts covers natively in Affinity — an architected, anti-corny, BRIGHT-cinematic matched set (A/B/C landscape for Test & Compare + clean RAW portrait covers). Use when TJ says "thumbnail", "/thumbnail", "make the thumbnail(s)", "thumbnail comps", "cover image", "design the cover", or after a video is cut and he needs packaging art. Builds layered, editable Affinity comps from his REAL frames using the saved SDK recipes and his taste guardrails — NOT flattened ffmpeg/PIL one-offs. TJ grades his own photos; this does crop + type + layout only. Pairs with /edit → /finalcut → /distribute. --- You are designing TJ's video thumbnails. The job: produce a **matched set** — landscape **A/B/C** comps for YouTube Test & Compare + clean **RAW portrait covers** for IG/Shorts — built natively in **Affinity** as layered, editable comps, in TJ's voice. This is the packaging-art step alongside `/distribute` (which writes the copy). **TJ publishes manually.** ## READ FIRST (every run — the system lives in memory, this skill orchestrates it) - **[[feedback_thumbnail_design]]** — TJ's TASTE: bright-cinematic anti-corny target, his references (Kaptain Kristian / The Youth Reference), his panel + high-contrast-serif system, the architected-lockup rules, the **PERU 🇵🇪** signature, title specificity, and the HARD GUARDRAILS. This governs every decision. - **[[reference_affinity_mcp_thumbnails]]** — the TECHNICAL how-to: Affinity SDK recipes, every gotcha (isLandscape, integer HSL channels, `getLastChild` for the just-added node, em-scaled `characterSpacing`, real layer-effects via `doc.setOuterShadowLayerEffect`/`setOutlineLayerEffect`, text-width measurement via `node.baseBoxInterface.baseBox`), and the reusable **"YouTube Thumbnail Builder"** Affinity library script. Read the SDK docs through the MCP (`read_sdk_documentation_topic`, start with `preamble`); search/record hints. - Reference run: `Entrepreneurship Projects/YouTube TJSMind/projects/7lakes/thumbnails/` (comps + archive show the full A/B/C system). ## The non-negotiable guardrails (from feedback_thumbnail_design — do not violate) - **NEVER over-grade his photos.** TJ grades his own. This skill does **crop + type + layout only**. If a base looks over-edited, use his original/raw. He drops edited versions back — use them untouched. ([[feedback_verify_visuals_not_metadata]] — always LOOK at the exported frame.) - **Bright cinematic, never gloomy.** No dark scrim/gradient swallowing the image, no Netflix-true-crime LUT. Legibility comes from PLACEMENT + clean treatment, not darkening. - **Anti-corny.** No laser/route lines, no chunky stroke outlines, no doubled-text fake outlines, no "·" corporate middot, no gold+black sports-graphic, no overused Anton. - **Designed, not a captioned photo** — architected lockup (matched widths, aligned edges, controlled gaps), real layer effects (thin outline + soft blurred shadow) or clean black text on bright sky. ## Step 0 — Setup 1. Confirm **Affinity MCP** is connected (SSE `localhost:6767/sse`; app open with a doc) and the ** drive** is mounted if pulling 4K frames. 2. Locate the project's `thumbnails/source/` (TJ's exported stills) + the footage `frames/`. If `source/` is empty, ask TJ to drop the candidate stills (or pull frames from the render). ## Step 1 — Look, then ASK (never skip) 1. Build **contact sheets** (PIL/ffmpeg `tile=`) of: the source stills, the footage frame-grabs, AND his **inspiration folder** (`docs/YouTube Thumbnail Inspirations/`, incl. `…/Oriniganl TJSMind Thumbnails/` = his own past style). View them. 2. Pick **hero frames** by promise — typically three distinct emotional bets (e.g. lake/payoff, faces/warmth, trail/journey). Faces = the CTR favorite. 3. **ASK** TJ the direction(s) before building. Bring a recommendation. He may make one comp himself (like CustomB) — fold it in. ## Step 2 — Build the matched set in Affinity (layered, editable) For each comp, with the photo layer **untouched** (crop only): - **Architected lockup**: measure text widths (`baseBoxInterface.baseBox`), match word widths, align left edges exactly, controlled gaps (~34px number→stack, ~22px line gap, tag ~45px above). - **Palette 1**: coral `#F05A3C`, warm off-white `#F4F0E6`, turquoise `#5ED9D1`, deep-teal stroke/shadow `#102A2A`. - **Type** (Druk/Neue-Haas/Suisse NOT installed → substitutes): big = Helvetica Neue Condensed Black; labels = Montserrat; editorial serif = DM Serif Display / Didot. - **Effects**: real Outline (thin, 2–4px) + OuterShadow (soft, blur 6–10, ~50% opacity), applied to the just-added node (`getLastChild`). On a solid panel or bright sky, use clean text (black on bright sky → no shadow, crisp). - **Signature**: append **"PERU 🇵🇪"** (place + flag) to the location label. The flag renders reliably as a drawn red-white-red tricolor via PIL on the export (Affinity emoji is unreliable). - For a VERTICAL hero in a landscape frame: panel/title-card overlay (~37% with a feathered edge), NOT a 50/50 magazine split. - Start from the **"YouTube Thumbnail Builder"** library script; export PNG to `thumbnails/comps/`. ## Step 3 — Gut-check + iterate - Stitch A/B/C at **320×180 feed size** and LOOK — can you read the hook tiny? do faces pop? is it bright? Iterate against TJ's reactions fast; he has the final taste call. ## Step 4 — Portrait covers + housekeeping - Build **clean, NO-TEXT** portrait covers (1080×1920) from the **RAW** photos (TJ posts these on IG/Shorts — "more natural"). - Keep `comps/` to the current finals; move superseded comps + `base_*` working files to `comps/archive/` + `thumbnails/archive/` (archive, never delete). ## Output + handoff - Deliver: landscape **A/B/C** (run A vs B in YouTube Test & Compare) + RAW portrait cover(s). Tell TJ which file is which. - Titles/description/hashtags are **`/distribute`'s** job, not this skill's — but flag if a title's concrete hook ($30, altitude) should drive a thumbnail callout. ## Non-negotiables - **His taste overrides the numbers.** A high-CTR move that's corny loses. - **Crop + type only — never grade his photos.** - **Look at the exported frame** before declaring anything done; gut-check small. - **Stay in your lane** — no copywriting (that's `/distribute`), no video cutting (that's `/edit`).