kevinbadi/open-edits/split-animated-talking-head

Claude Code and agent skill by kevinbadi/open-edits

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Turn a user-supplied talking-head clip (webcam, phone selfie, or recorded speaker) plus an optional script or source URL into a split-format vertical short — custom-generated animations in the top ~50%, the provided talking-head cropped into a taller rounded band across the bottom, kinetic captions synced to the clip's own voice, real product logos/screenshots whenever a named tool is spoken, real portraits of the notable figures behind any spoken niche (Claude/Anthropic, SpaceX, OpenAI, marketing, business, sales…), Giphy reaction GIFs on punchlines, a hyper-edit layer (keyword punch-ins, hyperframe inserts, whip cuts, shake) No HeyGen. Use when the user provides a talking-head video, webcam recording, selfie clip, or asks for the split animated format using their footage instead of a Megan/Danny/Kevin avatar.

Install

npx vskill@latest install kevinbadi/open-edits/split-animated-talking-head

SKILL.md

Split Animated Short — user talking head (taller live band)

HARD RULE (Kevin 2026-09-03): Final video is 1080×1920. Never 720×1280. Never scale the user's talking-head down to 704×640. Their clip is already 1080p. Instagram/TikTok/YouTube Shorts display at 1080×1920; a 720p master gets upscaled and looks like mud. If ffprobe on renders/final.mp4 is not 1080x1920, delete it and start over. Do not publish 720p.

Same flagship format as split-animated-short, except the bottom band is the clip the user hands you, not a HeyGen talking-photo. The clip's audio is the master timeline. Animations are authored per script — zero pixels from any reference reel except its words, if one is given.

Live talking-head footage needs more band height than the HeyGen 45% lock so hats/hair aren't clipped (Kevin 2026-09-01). Default band is 1056×960 at y=936 on the 1080×1920 canvas (caption baseline rests ON the accent line at y=BAND_Y-5, letters fully above the head; Kevin 2026-09-18/19). Round all four corners of the band mask — never BAND_H+60 (that square-cuts the bottom flush to the canvas). ~24px of canvas stays under the card.

PACK LOCK (Kevin 2026-09-03, opensource-100 recut): animations sit just above the captions, not up against the top of the frame. A top-hugging pack leaves a vacant band in the middle of the screen. Locked numbers:

AH = 770 # animation layer height
LAYER_Y = 90 # composite at (0, 90) → layer covers canvas y=90..860
PACK_DY = 210 # add to every place()/conveyor/orbit/ticker/ghost cy
CAP_Y = 867 # top of the caption zone (pack reference); the word itself is
# baseline on the accent line at BAND_Y-5, anchor="ls" (Kevin 2026-09-19)
BAND_Y = 936 # talking-head band (Kevin 2026-09-15: 960 was too low / clipped the bottom)

Layer ends ~7px above the captions. Pack numbers from clone-projects/opensource-100-animated/render.py (historical, not bundled). Never LAYER_Y=42 + AH=840 with heroes at cy≈180–280 — that was the vacant-middle bug. Never design at 853 and downscale, and never render the whole video at 720.

BEST EDIT YET (Kevin 2026-09-26): examples/social-agents/render.py is now the top reference (it outranks gitnexus). What made it: the user's b-roll used three ways (banner crop as the reveal on the product name; a live terminal card that starts zoomed on the command, then pulls back and scrolls with the output; single-line "LIVE FROM THE REPO" crops, left part of the line only so the text stays readable). Spoken feature lists become a ticking checklist card with one bespoke visual per item (real reel covers/thumbnails from brand-content + Downloads, mock inbox / caption / hashtag / SEO-climb cards). GIFs whose burned-in text matches the spoken line word for word. Stamps only on each section's dramatic beat. Reuse its Broll / crop_img / strip_card / broll_view(zoom=) helpers whenever b-roll is supplied.

STATUS QUO (Kevin 2026-09-19, "SOOOOO GOOOOD that should be the new status quo"): examples/gitnexus/render.py is the current gold reference. Everything below still applies; what made it land: Luckiest Guy captions resting on the accent line with a tight glow, the user's own screen recording as the b-roll hook (mystery "?" over it) and as per-word crop cuts later, a meme beat matched to the spoken line (Hangover calculation meme on "understand any piece of code") followed by a custom motion piece on the next word (spinning wireframe globe_card on "planet"), terminals that type the spoken action, a legend card lighting up per component, stamps on the punch words, a kinetic headline + lower third + counter. Match that energy on every cut.

LOOK LOCK (Kevin 2026-09-10, china-robots density + github-research-agent wash): gold-standard density / titles / GIFs: china-robots (render.py no longer on disk; use social-agents / gitnexus as code refs). Slot brightness lock: clone-projects/github-research-agent-animated/render.py (historical, not bundled) (Kevin 2026-09-10: "background is too dark" on the near-black CHAR wash). Copy china-robots energy, but use the lifted graphite textured_bg — lift patches, stronger accent glow, slot_vignette(..., a=22). Do not ship Megan paper/sage/coral, and do not use near-black CHAR=(14,15,18) as the slot wash. Locked colors (override after exec of animation_assets_and_beats.py). Type lock (Kevin 2026-09-15 + 2026-09-19): overlay / component text is Oswald Bold (templates/fonts/Oswald-Bold.ttf, loaded via templates/fonts.py as AR). Title cards, chips, huge_word, counters, name plates, ghosts. Kinetic captions are Luckiest Guy (templates/fonts/LuckiestGuy-Regular.ttf, CAP in fonts.py): CapCut-style chunky comic caps, white fill (KEY_COL fill on keywords), 7px black stroke, no drop shadow (Kevin 2026-09-19 "DOG" screenshot). Copy both ttfs. Never Arial in the slot. Terminals / code rain / tickers stay Menlo (ML) — Menlo.ttc must be opened with index=0 or glyphs double-print. Oswald is the condensed display face (the big AND over a UI). Copy fonts.py + fonts/Oswald-Bold.ttf into every workdir.

INK=(10,11,14) SILVER=(198,204,214) STEEL=(92,98,108)
GRAPHITE=(36,38,46) CHAR=(48,50,58)
NEON=(57,255,132) ORANGE=(255,122,24) RED=(255,48,64)
CORAL=ORANGE PAPER=GRAPHITE
AR=Oswald Bold CAP=Luckiest Guy (captions only) ML=Menlo (terminals only)

Captions: silver body, KEY_COL neon/orange/red on keywords, black shadow, Oswald Bold ~66px (same face as the title cards). Chips: graphite + accent bar, Oswald. Cards: graphite, Oswald. Slot accent bars like china-robots (orange/neon/red per section). Hero titles are ~960px wide. User B-roll in the slot should fill ~1000×500, not a small inset.

TOPIC LOGO CONVEYOR (Kevin 2026-09-10 — staple). The horizontal scroll of brand icons tied to the video (voice-agents: OpenAI / Cursor / Docker / Cloudflare / … under the faces) is required on every cut. Not optional decoration. See 5d below.

INTRO BILLBOARD (Kevin 2026-09-14): the hook / cold-open must read from across the room. Giant numbers, giant figure circles, giant logos — not a contact sheet of 150–220px heads under a title. See 5b size lock. 150px rounds are banned anywhere.

Do not call HeyGen. Do not use this skill when the user wants Megan, Danny, or Kevin generated. That is split-animated-short.

Reference compositor + asset library: this skill's templates/. Per video, create projects/<slug>-animated/ (slug from the clip filename or topic) and adapt.

Env (only if publishing / staging a feed item): INSFORGE_* in .env.local (repo or project root). Band prep is local: ffmpeg, OpenCV, Whisper.

Required input

The user must provide a talking-head clip. Accept:

  • an absolute/relative file path (~/Desktop/hook.mov, source/talking.mp4)
  • a file they dropped into the chat / workspace
  • a URL that is their talking-head (download with yt-dlp / curl immediately)

Refuse to start until the clip exists on disk. If they also drop a reference reel URL (the thing to recreate visually), that is optional and only supplies the script — never its pixels.

Vertical 9:16 is ideal. Horizontal/webcam is fine; prep will cover-crop.

Pipeline

  1. Workdir. mkdir -p projects/<slug>-animated/{source,audio,renders,frames}

and cd there. Copy this skill's templates/ in (including apple_counter.py, light_fx.py, fonts.py, and fonts/Oswald-Bold.ttf).

  1. Prep the talking head (do this first — it is the timeline):
bash
python3 "${CLAUDE_SKILL_DIR}/scripts/prep_talking_head.py" \
--clip "/ABS/PATH/TO/CLIP" \
--workdir . \
--whisper

Writes source/talking_head.mp4 (native resolution, never downscaled), audio/narration.wav + .m4a, renders/talking_band45.mp4 (1056×960 @ 30fps, rounded later in compose), source/meta.json (DUR, crop), and audio/words.json.

Inspect band frames at 3 to 4 timestamps (the recorder re-frames the head mid-clip). Crop rule for live heads: keep the full hat / hairline in frame with a sliver of space above (backward caps sit higher than Haar's face box). Default --head-pad is 0.35. If the crown is clipped, lower --crop-top (and raise --crop-h to match the 1056:960 band aspect), but never below the clip's own black region: prep scans the whole clip for the first lit row and clamps the crop under it (content_top), and refuses a band with black top rows (verify_band_top). A black strip above the head is a failed prep, not a look. Do not letterbox the band. Do not scale the band below 1056×960.

  1. Get the script (words to animate).
  • Default: the talking-head transcript (audio/words.json) is the script.
  • Extra script given → use it, but time beats to the clip's Whisper

stamps, not to the written script's imagined pacing.

  • Extra URL given (IG/YT/TikTok to recreate) → scrape caption / Whisper

that source for copy only. IG: Apify apify~instagram-scraper (directUrls + resultsType: "details"), download videoUrl immediately. YouTube/TikTok: yt-dlp. Then persona-swap / product-name-fix against the caption. The talking-head clip still owns picture + audio.

  1. Guard on-screen text. Em/en dashes are banned from UGC overlays (AI

tell). Censor spoken profanity on-screen Nick-thumbnail style (sh*t); leave the clip's audio uncensored. If the talking head is not Kevin and the optional source script names Kevin/Kev/Nick/Saraev, strip or swap those names in overlay copy.

  1. SOURCE REAL BRAND ART (do this before choreography). Walk the transcript

for every named product, tool, model, or company (Claude, Google, GitHub, GitNexus, OmniRoute, GPT, Gemini, Llama, …). For each one, fetch a real mark into assets/logos/<slug>.png and a social/product card into assets/shots/<slug>.png when it exists:

bash
python3 "${CLAUDE_SKILL_DIR}/scripts/fetch_brand_asset.py" \
--name claude
python3 "${CLAUDE_SKILL_DIR}/scripts/fetch_brand_asset.py" \
--name gitnexus --github abhigyanpatwari/GitNexus

Priority: Claude family is locked (Kevin 2026-09-03). Do not fetch a favicon for Claude, Claude Code, Opus, Sonnet, Haiku, Fable, or Anthropic. Copy the bundled marks and dance them:

bash
python3 "${CLAUDE_SKILL_DIR}/scripts/fetch_brand_asset.py" --name claude
# writes assets/logos/claude.png (sphinx) plus claude-invader.png + claude-sphinx.png
  • Invader (templates/claude_marks.py → place_claude_invader): block

Space-Invader. Idle dance + walk cycle. Look: pass look_at=(x,y) in layer pixels and the pupils slide toward that point (blinks on their own). Grab: grab="right"|"left"|"both", grab_at=(x,y), grab_t=0..1 (0 rest, ~0.55 reached, 1 holding/lifted). Pass hold= an RGBA (use skill_chip("SKILL.md")) to stick a card to the hand once grab_t > 0.55. Morph with morph=0..1 (starburst scatter).

  • Sphinx (place_claude_sphinx): official Anthropic starburst badge.

Use as the spinning mark for Opus / Sonnet / Haiku / Anthropic, and as a secondary badge next to the invader. Call place_claude(layer, cx, cy, lt, word="claude", look_at=..., grab="right", grab_at=..., grab_t=...). Copy templates/claude_marks.py and assets/claude-*.png into the project.

For every other named product: official SVG/PNG (Wikimedia / simple-icons / site favicon) → GitHub avatar + OpenGraph card → Google s2 favicon. Convert SVG with qlmanage -t on macOS. A named product must appear as a logo, icon, screenshot, or orbiting mark — never as a text-only pill if a mark can be fetched. Punch near-white backgrounds to alpha; keep dark full-bleed logos as round badges.

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 95 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
6
7-day trend score
15

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/kevinbadi/open-edits/split-animated-talking-head/badge)](https://verified-skill.com/skills/kevinbadi/open-edits/split-animated-talking-head)

Something wrong with this skill or its page? Tell us.