---
name: short_form_video
description: Produce platform-ready vertical short-form video (TikTok, Instagram Reels, YouTube Shorts). Triggers on requests to make, edit, reframe, caption, or publish a short vertical video — hooks, 9:16 conversion, burned-in captions, encoding specs, posting cadence.
---

# Short-Form Video

## Purpose

Turn raw footage or an idea into a finished vertical short (TikTok / Reels / YouTube Shorts): hook-driven script structure, 9:16 reframe with ffmpeg, burned-in captions, platform-correct encoding, and a posting plan. All recipes are tested against ffmpeg 8.x; platform specs verified 2026-09.

## Workflow

1. **Script the hook first.** Before touching footage, write the opening line. It must land in the first 1–3 seconds: a question, a surprising claim, or a mid-action visual. 5–8 spoken words, never a cold intro. See `references/hook-and-retention.md` for hook patterns and the retention-beat template.
2. **Structure for retention.** Map the runtime into beats: hook (0–3s) → bridge (3–7s) → core content (7–45s, a visual change every 1.5–3s) → payoff + loop-back or comment-fork question (last 3s). No b-roll in the first 3 seconds; no static frame held past ~4s.
3. **Reframe to 9:16.** Center crop for single-subject footage; blurred-background fill when the full frame matters; never stretch. Output 1080×1920. See `references/ffmpeg-recipes.md`.
4. **Burn in captions.** Always-on captions (most short-form is watched without sound). Use the `assets/captions.ass` template — copy it, add Dialogue lines, burn with the `subtitles` filter. Keep ≤7 words per line, inside the middle 70% vertically.
5. **Encode for delivery.** `-c:v libx264 -preset fast -crf 21-23 -pix_fmt yuv420p -c:a aac -b:a 128k -movflags +faststart`, 30 fps. Keep under each platform's size/duration cap (see `references/platform-specs.md`).
6. **Post with a plan.** Title ≤ the hook in ≤ 8 words, description with `#Shorts` for YouTube, 2,200-char caption budget on Reels, consistent cadence (3–5x/week) over sporadic bursts.

## Output Contract

Deliver, at minimum:

- **Hook line** (the exact first 3 seconds, quoted) + beat map (timestamped segments).
- **Final video file**: 1080×1920, H.264 + AAC, `yuv420p`, `faststart` set, captions burned in and visible on a spot-checked frame, duration within the target platform's limit.
- **Verification**: `ffprobe` dimensions/codec for the final file, plus one extracted frame (at a captioned timestamp) confirming captions rendered correctly — do this before handing off or posting anything.
- **Posting note**: target platform(s), caption text, and why the hook fits that platform's audience (one line each).

## Operating Rules

1. **Never invent platform specs.** If a limit (duration, file size, aspect) is not in `references/platform-specs.md`, look it up or omit it — never guess numbers.
2. **Check rendered captions visually.** A passing encode is not enough; extract a frame and look at it. libass font scaling silently produces giant text when the script resolution is wrong — the shipped ASS template already sets `PlayResX/Y` correctly, so prefer it over `force_style`.
3. **Keep faces and key subjects out of UI overlap.** Respect the safe zones: top ~250px and bottom ~350px of the 1080×1920 frame belong to platform UI; text stays inside the centered middle band.
4. **Music caution on Shorts > 60s:** a claimed track on a YouTube Short over one minute gets blocked globally (Content ID). Stay under 60s when using third-party music, or use original audio.
5. **Don't ship filler.** If the source footage can't survive a 9:16 reframe (subject dead-center cropped out, text unreadable), say so and propose a re-shoot plan rather than delivering a broken crop.
6. **Loop endings beat hard endings.** Where the content allows, make the last frame/flow connect back to the opening so replays feel natural — watch-through rate is the primary ranking signal.
