main
anastasia Publish 1.0.2 5025609 2d ago

Parent skill: video-editing-skillpack

Adom YouTube thumbnails

Titles live in adom-youtube-titles, descriptions in adom-youtube-descriptions. This skill owns the picture. Everything below was measured from the 4 published thumbnails (iMIVb8FOXnI Fusion 360, k-_wNFG1R3o Hydrogen, vKUMzy261zs KiCad / Claude Code, wFHON9yi8Yc radio), 1280 x 720, and from adom-wiki brand show adom --json.

make_thumbnail.py spec.json -o out.jpg --check     # compose + safe-zone report + out-xcheck.png
make_thumbnail.py -o out.jpg --bg frame.png --cutout person.png \
    --headline "AI PCBs in|Altium." --orbital left --check   # quick mode
make_thumbnail.py --check-only someone-elses.jpg   # overlay the zones on any thumbnail
make_thumbnail.py --arrow-assets DIR               # re-render the standard arrow PNGs

Needs Pillow and numpy (pip install --target <dir> numpy and set PYTHONPATH if the system Python lacks it). Fonts and logo load from assets/, so run it from anywhere.

1. Style spec (measured)

Element Spec at 1280 x 720
Canvas 1280 x 720, JPG (quality 92, auto-lowered) or PNG, under 2 MB
Background #0d1117 base lifting to #0c0e1a at the top, plain. Never a grid or any line pattern: the first published thumbnails had a faint 40 px grid and Anastasia ruled it out for every thumbnail (2026-10-21), so the script no longer draws one
Glow teal #00b8b1 radial from beyond the bottom-left corner (centre -60, 800; radius 700; about 55 % at the core, measured #0c525e at 10, 700); purple #8c6bf7 radial from beyond the bottom-right (1340, 820; radius 640; about 50 %, measured #342868 at 1270, 710)
Headline font Familjen Grotesk Bold (700). Confirmed by the single-story "a" in "radio", "town". Not Satoshi, not Inter
Headline size cap height 73 to 100 px (KiCad 73, Fusion 78, radio 85, Hydrogen 100), i.e. 112 to 150 px font size (Familjen cap = 0.65 em). Default 120 px. A long 3-line claim drops to 84 to 90 px
Headline position left-aligned at x = 46 to 59 (Hydrogen 83); default x = 52
Line pitch 0.96 x font size (Fusion 115 px at 120 px). 2 or 3 lines
Line colours all lines white #ffffff except the LAST line, which carries the gradient and ends with a period
Gradient horizontal across the last line's ink: #00b8b1 0 %, #2fd0c3 40 %, #5fb0e6 70 %, #8c6bf7 100 % (assets/gradient.json)
Kicker (optional) Familjen Grotesk Bold, about 40 to 46 px caps, tracked +14 %, accent #00e6dc, 34 px above the headline ("ELECTRONICS PROTOTYPING")
Sub line (optional) Familjen Grotesk Bold 40 to 46 px, white with teal keywords ("Meet Hydrogen")
Visual right 45 to 50 % of the frame: tilted app screenshot (perspective, 1 px #30363d border, rounded, teal edge glow), a 3D board render popping out in front, presenter cutout between them
Cutouts soft black drop shadow, blur 18 px, 55 %, offset 0, 10
Extras at most 1 or 2: house arrow, prompt bubble, teal starburst (#00e6dc, 22 points, navy text, rotated about 12 deg), teal glow outline

Small text (bubbles, labels) is Satoshi Bold; body copy is Satoshi Medium. Familjen Grotesk is for the headline, kicker and sub line only.

2. Safe zones (hard rule)

When an Adom YouTube link is posted on X, X lays a title pill over the bottom-left of the card (on the radio thumbnail it covered "for a radio."). YouTube puts the duration badge bottom-right.

 0                                  768                   1088      1280
 0 +--------------------------------------------------------------+
   | [orb]                                                  [orb]  |  orbital slots
   |    24 px edge margin for text and faces                       |  30,28 / 1192,28, 58 px
   |                                                               |
   |   HEADLINE / faces / product: anywhere above y = 562          |
   |   on the left, anywhere outside the orange box on the right   |
562|- - - - - - - - - - - - - - - - - +                            |
   |  X TITLE PILL ZONE                |                            |
   |  x 0..768, y 562..720             |              +-----------+ 634
   |  (left 60 %, bottom 22 %)         |              | YT 12:34  |
720+-----------------------------------+--------------+-----------+
                                                     x 1088..1280, y 634..720
Zone px at 1280 x 720 Fraction
X title pill x 0 to 768, y 562 to 720 left 60 %, bottom 22 %
YouTube duration badge x 1088 to 1280, y 634 to 720 right 15 %, bottom 12 %
Edge margin 24 px on every side for text and faces

Nothing important in either zone: no headline, no face, no key product (board, logo, bubble). Background, glow, bodies below the chin, desks and laptops may run through them. --check reports every checked element (headline, bubble, badge, text, orbital and any layer marked "important": true) that crosses a zone, and writes <out>-xcheck.png: the thumbnail with the zones drawn (red X zone, orange YouTube zone, teal orbital slots, yellow boxes for checked elements) plus a 320 x 180 preview and a mock X card underneath.

Practical consequence: the headline block ends above y = 562. A 3-line headline at 86 px that starts at y = 196 ends at about 430. The radio thumbnail's headline (y 420 to 638) breaks this rule; do not copy that placement.

3. Logo rule

  • The Adom orbital mark only (no wordmark, no "+ partner" pill), as a white cutout: assets/adom-orbital-white-512.png or -1024.png (white fill, transparent background, rasterised from assets/adom-icon.svg, the brand page's assets/adom-icon.svg).
  • 58 x 58 px, 30 px from the side, 28 px from the top (measured on 3 of the 4 thumbnails). Soft shadow 8 px, 35 %.
  • Top-left when the headline sits on the left (the default, like every existing thumbnail). Top-right when the headline or the main subject sits on the right, or when the top-left corner is busy. Pick the less busy corner. Never both, never a bottom corner.
  • Partner logos (Altium, KiCad, Claude) may appear as content, never in the orbital's corner. Recolour a black partner wordmark to white for the dark background, keep its mark colours.

4. Arrows (house style)

Every arrow matches the ones in vKUMzy261zs (swoosh under "PCBs.") and wFHON9yi8Yc (hook down to the car screen). The full arrow spec and ready-made PNGs are in the adom-arrows skill.

Property Value (1280 x 720)
Colour accent #00e6dc (measured #06e3d9 / #05e0d5 after JPEG)
Stroke one smooth quadratic curve, uniform 11 px (0.86 % of the width), round caps
Head solid filled triangle, base 44 px (4.0 x stroke), length 40 px (3.6 x stroke), corners softened by 0.15 x stroke, aligned to the curve's end tangent, the stroke ends inside the head
Glow same colour, gaussian sigma 8 px, about 60 % opacity at the stroke edge, fading out by about 24 px
Curve control point offset 0.25 to 0.35 of the chord (bend); a hook uses an explicit control point at (end x, start y) so it leaves sideways and lands vertically
Length 250 to 360 px; points from the claim to the thing (headline to board, prompt to result)
Count one per thumbnail

{"type": "arrow", "from": [x, y], "to": [x, y], "bend": 0.28} (positive bulges to the right of the direction of travel, so a left-to-right arrow sags), or "control": [x, y], and "scale" (1.0 = 11 px). PNGs: assets/arrow-swoosh-right.png, arrow-hook-down.png, arrow-curve-left.png, arrow-straight-right.png.

5. Prompt bubbles

Any prompt shown in a thumbnail uses the "Make me an AM/FM radio." bubble style (wFHON9yi8Yc).

Property Value (1280 x 720)
Shape rounded rectangle, radius 20 px, no tail
Fill #0b0e13 at 94 % (measured constant over a varied background)
Border 2 px, #e6edf3 at 35 %
Text Satoshi Bold 37 px (cap height about 26 px), white, curly quotes “…”, the period inside the closing quote
Padding 46 px left and right; height = 37 px + 2 x 31 px (about 99 px)
Shadow black, blur 16 px, 55 %, offset 0, 6
Tilt 3 deg counter-clockwise (right end higher), as measured
Width follows the text; keep the prompt to one line, scale 0.8 to 1.0 for long prompts

{"type": "bubble", "text": "Design a 12 V to 5 V buck converter in Altium.", "center": [x, y], "scale": 0.82}. The script adds the curly quotes and the final period if missing.

6. Composition recipes (the three archetypes)

A. Presenter + board (Fusion 360 "1st EVER", KiCad "AI Engineered PCBs.") Brand background. Headline left (x 52). Right half: app screenshot tilted slightly (quad about [740, 92] [1292, 58] [1292, 430] [740, 418]), presenter cutout(s) chest-up over it with a 60 px bottom fade, the 3D board in front, bottom edge above y 615 and left edge right of x 768. One extra: arrow from the headline to the board, or the starburst.

B. POV / vlog (radio) Full-bleed photo from the video ("type": "photo", blur 0 for a real POV shot, 12 to 16 for a lab backdrop behind cutouts), navy darken 35 to 55 % and a scrim on the headline side. People large on the side opposite the headline, faces above y 562. Prompt bubble near the top, clear of faces and the orbital. The headline moves UP compared with the radio original.

C. App screenshot (Hydrogen "New app in town.") Brand background. Headline left, optional kicker and sub line. A big screenshot in perspective running off the right edge with the teal edge glow, the bottom-right corner above y 620 or treated as background. Optional partner logo or the board over the screenshot. No presenter.

Sources: grab 4K frames read-only with adom-bridge --target <mac> premiere_preview_frame '{"time":<s>,"width":3840}' (the PNG is .image.base64; stream the JSON into /home/..., not /tmp). Avoid frames with lower-third name titles. Cut people out with rembg (isnet-general-use, run on a half-size crop: the 4K crop is killed on a 4 GB box); a 3D board rendered on a flat background cuts out by thresholding against the background colour plus a flood fill.

7. Copy rules

  • One idea. Either 2 to 4 words per line over 2 or 3 lines ("AI PCBs in / Fusion 360.", "New app / in town."), or a 3-line factual claim ("Less than 2 hours / from prompt to / finished board."). Break lines at phrase boundaries; the last line is the payoff.
  • Ends with a period on the gradient line. No exclamation marks, no question bait, no emoji, no all-caps headline (the kicker is the only caps).
  • Adds to the title, does not repeat it. Title "AI Designs a PCB in Altium" + headline "Less than 2 hours from prompt to finished board." is the model: the title says what, the thumbnail says how fast. Claims must be checkable (the video shows 1 h 48 min).
  • Numbers as digits ("2 hours", "12 V"). Brand voice: plain, precise, no hype.
  • A prompt bubble quotes the real prompt, shortened only by cutting, never reworded.

8. Spec file

{
  "background": {"type": "brand"} | {"type": "photo", "path": "f.jpg", "blur": 16, "darken": 0.5, "scrim": "left|right"},
  "orbital": "left" | "right",
  "layers": [
    {"type": "screen", "path": "shot.jpg", "quad": [[x,y],[x,y],[x,y],[x,y]], "dim": 0.1, "glow": true, "crop": [l,t,r,b]},
    {"type": "image", "path": "cutout.png", "box": [x, y, width], "fade_bottom": 60, "shadow": true,
     "important": true, "important_box": [l, t, r, b], "name": "board"},
    {"type": "headline", "lines": ["...", "..."], "x": 52, "y": 220, "size": 120, "max_width": 640,
     "align": "left|right", "leading": 0.96, "kicker": "Part 3", "sub": [["Meet ", "white"], ["Hydrogen", "teal"]]},
    {"type": "arrow", "from": [x,y], "to": [x,y], "bend": 0.28},
    {"type": "bubble", "text": "...", "center": [x,y], "scale": 1.0, "rotate": 3},
    {"type": "badge", "lines": ["1st", "EVER"], "center": [x,y], "r": 130},
    {"type": "text", "text": "...", "at": [x,y], "size": 40, "font": "display|body|bodybold", "color": "#ffffff"}
  ]
}

Layers draw in order; the orbital is drawn last. y of a headline is the top of the first line's capitals. max_width shrinks the size until every line fits. Relative paths resolve next to the spec. Worked examples: examples/altium-A.json, -B.json, -C.json (their source images are in /home/adom/work/thumbs/altium/specs/).

9. Checklist before publishing

  • 1280 x 720, under 2 MB, JPG or PNG.
  • Plain navy background with the two glows: no grid, no line pattern.
  • --check prints safe zones: clear; look at the -xcheck.png yourself: nothing important in the red (X) or orange (YouTube) box, nothing within 24 px of an edge.
  • Headline in Familjen Grotesk Bold, white lines plus one gradient last line ending in a period.
  • Readable in the 320 x 180 preview (cap height at least about 55 px at full size).
  • White orbital only, 58 px at 30 / 28, top-left (or top-right when the headline is right).
  • At most 2 extras; any arrow and bubble rendered by the script (house style).
  • Faces clean: no lower-third titles, no background people, no hard cut edges at the chest unless something covers them.
  • Copy adds to the title, checkable claim, no exclamation marks, no emoji.
  • Partner logo legible on dark (white wordmark), never in the orbital's corner.

Files

  • make_thumbnail.py: composer, arrow and bubble renderers, safe-zone checker.
  • assets/adom-orbital-white-512.png, assets/adom-orbital-white-1024.png, assets/adom-icon.svg.
  • assets/gradient.json: headline gradient stops and the measurements behind them.
  • assets/arrow-*.png: standard arrows (transparent, glow included).
  • assets/fonts/: Familjen Grotesk (SIL OFL, FamiljenGrotesk-OFL.txt) and Satoshi (Fontshare free licence, shipped by the adom/brand page), converted to TTF for Pillow.
  • examples/: the specs of the three Altium example thumbnails.