agentleFS
abduznikabduznik/abduznik-skills/skills/skit-thumbnail/SKILL.md

skit-thumbnail

Skill2 starsChanged 2 months agoMITView on GitHub

Generate YouTube thumbnails for skit videos. Extracts a frame (random or specific timestamp), crops it into a rounded-rect polaroid with drop shadow, SKIT label bar above, title+subtitle on the right, channel logo below. Everything auto-fits within margins.

The file

We split this skill into the rules it gives an agent

3 rules. About 0 are common, 2 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    After the user picks a thumbnail, upload the video to the channel:

    line 59
  2. Very specific:

    Check video duration: ffprobe -v error -show_entries format=duration -of csv=p=0 clip.mp4

    line 84
  3. Distinctive:

    If none works, iterate with 3 more timestamps

    line 93

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Skit Thumbnail Generator

Location

Script: /path/to/scripts/skit_thumbnail.py

Usage

cd "/path/to/project"
python scripts/skit_thumbnail.py path/to/clip.mp4 --title "Title Text" --subtitle "Subtitle Text"

Arguments

ArgDescription
videoPath to the skit video clip (positional, required)
--titleTitle text in red (auto-sized to fit column)
--subtitleSubtitle text in white, same font size as title
--frame-timeTimestamp in seconds for frame extraction (default: random). Use 0 for the very first frame.
--outputCustom output path (default: auto-named in skit_thumbnails/)

Design

  • Left stack: Red SKIT bar (rounded pill, left-aligned text) → 4px gap → Photo (rounded-rect, white border, drop shadow)
  • Right column: Title (red) + Subtitle (white) at same font size (determined by longer string) → accent line → channel logo (scaled to fill)
  • Background: Dark slate with diagonal stripe accents, red top/bottom bars
  • Margins: 50px left, 25px all other sides, 28px gap between frame and text

Pitfalls (learned the hard way)

  • ❌ Don't use full-bleed blurred frame as background — user rejected it, prefers clean dark slate with diagonal stripes
  • ❌ Don't put SKIT label inside the photo — it goes ABOVE in a separate red bar (pill shape, left-aligned text)
  • ❌ Don't add a second SKIT badge in the right zone — one is enough (the bar above the photo)
  • ❌ Don't under-size text to leave empty space — title + subtitle should be the same large font, auto-determined by the longer string
  • ❌ Don't use tiny corner logos — logo must be large (200-440px) and centered in remaining space
  • ❌ Don't redesign from scratch — user prefers iterative refinement of the existing polaroid layout
  • ❌ Don't guess the title/subtitle — ask the user what text they want, or if they already told you, use exactly what they said (subtitle is often just "Overwatch" for Overwatch skits)
  • ❌ Don't extract from a random frame without asking — always ask the user which frame they want, then use --frame-time to pin it (0 = first frame, or a specific second)
  • ✅ SKIT bar text at 45px (1.5x of initial try), left-aligned with 15px padding
  • ✅ Title & subtitle share ONE font size via calc_font_size (binary search on longer string)
  • ✅ Everything auto-fits within margins: 50px left, 25px elsewhere

YouTube upload after thumbnail

After the user picks a thumbnail, upload the video to the channel:

cd "/path/to/scripts-upload/scripts"
python yt_upload.py "path/to/video.mp4" \
  --title "SkitName In Overwatch | My Channel" \
  --thumbnail "path/to/thumb.png" \
  --private --schedule "YYYY-MM-DDT14:00:00Z"

Title convention (channel skits): "[Skit Name] In Overwatch | My Channel" — always this format for skit videos. The subtitle (e.g. "Overwatch") goes in the thumbnail only, not the YouTube title.

Schedule: User's timezone is IDT (UTC+3). 5pm IDT = 14:00 UTC. Ask the user what time to publish.

Workflow patterns

Quick single thumbnail:

python scripts/skit_thumbnail.py clip.mp4 --title "Title" --subtitle "Subtitle"

Picks a random mid-clip frame. Re-run if user doesn't like the result.

Batch comparison (user-picky workflow): Generate 3 thumbnails at different timestamps, show them inline, let the user pick.

  1. Check video duration: ffprobe -v error -show_entries format=duration -of csv=p=0 clip.mp4
  2. Pick 3 spread-out timestamps (e.g. early/mid/late thirds minus margins)
  3. Generate each:
    python scripts/skit_thumbnail.py clip.mp4 --title "T" --subtitle "S" --frame-time 3 --output "skit_thumbnails/clip_t1.png"
    python scripts/skit_thumbnail.py clip.mp4 --title "T" --subtitle "S" --frame-time 12 --output "skit_thumbnails/clip_t2.png"
    python scripts/skit_thumbnail.py clip.mp4 --title "T" --subtitle "S" --frame-time 22 --output "skit_thumbnails/clip_t3.png"
  4. Present all 3 inline via MEDIA: paths
  5. If none works, iterate with 3 more timestamps
  6. Once picked, that PNG is the final thumbnail for the upload step

Script maintenance notes

  • --frame-time was added retrospectively (original script only had random extraction). If you patch the script, the function to modify is extract_frame(video_path, timestamp=None) — it replaces the old extract_random_frame(). Argparse entry in main() needs both the new flag in the parser and passing it through to make_skit_thumbnail().

Output

1280×720 PNG, saved to skit_thumbnails/<clipname>_skit_thumb.png.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.