easton-reel
Decoded from the "this is a message to all finance bros" (Easton) reel format.
Produces the signature look: one word at a time, huge red Times-Bold, red
glow, punch-scaled to the beat of speech, over a dim crushed-black warm grade.
Genre anatomy (what makes it read as "Easton / finance-bro")
- War-room shot — dim room, key-light face only, authority props behind
(US map, Steve Jobs poster, monitors). Subject does the alpha finger-pinch.
- Red-serif kinetic caption — ONE word per beat, Times/Trajan bold caps,
red fill + red outer glow, punched (scale 78→100%) on the stressed syllable,
upper-third. Hook + name-drop in this style.
- B-roll cutaways — Rolex wrist, eye macro, prop gag (cup-noodles
"I'm gambling"). Money-aesthetic vs broke-reality contrast = the joke.
- Clean white-cyc outro — full body, yellow CapCut sans subs, CTA "tune in".
- Format = hook → name-brand → story/joke → CTA. Trending audio low under VO.
The script does #2 and #3 (grade) automatically from a raw clip. #1/#4/#5 are
shooting/scripting choices — see "Shoot checklist" below.
Pipeline (one command)
python easton_reel.py INPUT.mp4 [-o OUT.mp4] [options]
Steps: faster-whisper word timestamps → build .ass (one-word red-serif punch)
→ ffmpeg cover-crop 9:16 → grade → burn subs → encode.
Options
--text "..." manual caption mode — skips transcription, distributes the
words one-per-beat evenly across the clip. Use for SILENT b-roll / timelapse
(no audio to transcribe). | inserts a pause beat. Audio track auto-dropped
when the source has none.
--model tiny|base|small|medium whisper size. Default small (good CPU
accuracy). Use tiny/base for speed, medium for noisy audio.
--size N caption font px (default 110).
--style red Easton red-serif glow (default). --style yellow =
CapCut yellow-sans (use for b-roll / second pass).
--upper force caption into top third (auto-on for red style).
--marginv N vertical offset from top when --upper (default 430).
--no-grade skip the cinematic colour grade (keep source look).
--keep keep the generated .ass (hand-tweak then re-burn).
Examples
# default Easton red punch caption + grade
python easton_reel.py "raw_talkinghead.mp4" --upper
# faster draft
python easton_reel.py raw.mp4 --model base
# b-roll line in yellow CapCut style, no grade
python easton_reel.py broll.mp4 --style yellow --no-grade
House rules / gotchas (hard-won on this machine)
- NVENC is broken here — GPU driver exposes nvenc API 12.2 but ffmpeg 8
needs 13.0 →
h264_nvenc fails. Script auto-falls back to libx264 -crf 20.
Don't "fix" the nvenc path; the fallback is the working path until the GPU
driver is updated. (Matches the SkynetLabs video deploy gotcha: NVENC-broken
→ libx264.)
- Events
Format: line MUST list Name — the V4+ Events column order is
Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text.
Omit Name and every Dialogue row (which carries the empty Name field
E,,0,0,0,,) mis-parses — libass leaks a phantom leading comma into the
text (,YOU). Symptom: clean .ass text but a red comma renders before
every word. Fix = add Name to the Format line. Don't strip the comma in
code — fix the header.
- Force
-pix_fmt yuv420p — the filter chain (eq/curves/subtitles)
promotes output to yuv444p (profile High 4:4:4), which Windows Media Player /
Photos refuse with 0x80004005 "unsupported encoding settings". Both encode
paths pin -pix_fmt yuv420p → profile High, universally playable. Don't ship
without it.
- Strip punctuation — whisper emits
,BROS.; build_ass strips leading/
trailing .,!?;:"()[]—- so words render clean (BROS). Apostrophes kept
(I'M, EASTON'S).
- ASS colour is &HAABBGGRR (alpha,blue,green,red) — red fill =
&H000000FF&.
Don't swap for RRGGBB.
- Windows path escaping — the
subtitles= filter needs the drive colon
escaped (C\:/...); handled in code. Don't pass a raw Windows path.
- Fonts used: Times New Roman (red) / Arial (yellow) — both ship with
Windows. Swap to Cinzel/Trajan/Playfair in
STYLES for a more "luxury" serif.
- Output is always 1080x1920 cover-crop (no letterbox). Feed vertical or
near-vertical source; very wide source loses the sides.
Tuning the look (edit STYLES / build_ass in easton_reel.py)
- Bigger glow → raise
blur (red style, default 9) and border (4).
- Slower/snappier punch → change
\t(0,90,...) ms and the \fscx78 start scale.
- Hold each word longer/shorter → words hold from their start to the next
word's start (always one on screen). For gap-punches instead, end at
b.
- Two-track look (red hook + yellow b-roll): run twice — pass 1
--style red
on the hook clip, pass 2 --style yellow --no-grade on the b-roll clip,
then concat.
Shoot checklist (to feed this skill the right raw clip)
- Phone vertical 1080×1920, 30fps. Lock exposure on face.
- Key light on face only; kill background light → crushed-black look the grade
leans into.
- Authority backdrop (map / poster / monitors). Sit centred, mid-frame.
- Script: punchy hook in first ~1.5s, drop your NAME early (brand), payoff/joke,
CTA "follow + tune in". Keep it <40s.
- Shoot b-roll separately (watch, eyes, prop gag) for cutaways.
Verified
Tested 2026-06-09: (1) 6s speech trim — faster-whisper word timestamps OK.
(2) Full run on a silent DJI laptop timelapse (2688×1512 landscape, no audio)
via --text manual mode → cover-cropped 9:16, graded, red-serif glow punch
words snapped to beats, audio auto-dropped, nvenc→libx264 fallback. Output
clean after fixing the missing-Name-column comma bug. Functional, shipped a
real reel (easton_laptop.mp4).
1---2name: easton-reel3description: Turn a raw vertical talking-head clip into an "Easton" finance-bro / hustle style reel — kinetic ONE-WORD red-serif punch captions snapped to speech (big Times-bold, red glow, scale-in punch), cinematic crushed-black warm grade, 9:16 1080x1920, single ffmpeg pass with NVENC→libx264 fallback. Word timestamps via faster-whisper (local, $0). Optional yellow CapCut-style sub track for b-roll lines. Trigger when user says "easton reel", "/easton-reel", "finance bro reel", "red kinetic caption reel", "one-word punch captions", "make my talking-head clip look like easton/hamza/hustle reels", or drops a vertical talking-head .mp4 and wants big red one-word-at-a-time captions.4---56# easton-reel78Decoded from the "this is a message to all finance bros" (Easton) reel format.9Produces the signature look: **one word at a time, huge red Times-Bold, red10glow, punch-scaled to the beat of speech**, over a dim crushed-black warm grade.1112## Genre anatomy (what makes it read as "Easton / finance-bro")13141. **War-room shot** — dim room, key-light face only, authority props behind15 (US map, Steve Jobs poster, monitors). Subject does the alpha finger-pinch.162. **Red-serif kinetic caption** — ONE word per beat, Times/Trajan bold caps,17 red fill + red outer glow, punched (scale 78→100%) on the stressed syllable,18 upper-third. Hook + name-drop in this style.193. **B-roll cutaways** — Rolex wrist, eye macro, prop gag (cup-noodles20 "I'm gambling"). Money-aesthetic vs broke-reality contrast = the joke.214. **Clean white-cyc outro** — full body, yellow CapCut sans subs, CTA "tune in".225. **Format** = hook → name-brand → story/joke → CTA. Trending audio low under VO.2324The script does #2 and #3 (grade) automatically from a raw clip. #1/#4/#5 are25shooting/scripting choices — see "Shoot checklist" below.2627## Pipeline (one command)2829```30python easton_reel.py INPUT.mp4 [-o OUT.mp4] [options]31```3233Steps: faster-whisper word timestamps → build `.ass` (one-word red-serif punch)34→ ffmpeg cover-crop 9:16 → grade → burn subs → encode.3536### Options3738- `--text "..."` **manual caption mode** — skips transcription, distributes the39 words one-per-beat evenly across the clip. Use for SILENT b-roll / timelapse40 (no audio to transcribe). `|` inserts a pause beat. Audio track auto-dropped41 when the source has none.42- `--model tiny|base|small|medium` whisper size. Default `small` (good CPU43 accuracy). Use `tiny`/`base` for speed, `medium` for noisy audio.44- `--size N` caption font px (default 110).45- `--style red` Easton red-serif glow (default). `--style yellow` =46 CapCut yellow-sans (use for b-roll / second pass).47- `--upper` force caption into top third (auto-on for red style).48- `--marginv N` vertical offset from top when `--upper` (default 430).49- `--no-grade` skip the cinematic colour grade (keep source look).50- `--keep` keep the generated `.ass` (hand-tweak then re-burn).5152### Examples5354```55# default Easton red punch caption + grade56python easton_reel.py "raw_talkinghead.mp4" --upper5758# faster draft59python easton_reel.py raw.mp4 --model base6061# b-roll line in yellow CapCut style, no grade62python easton_reel.py broll.mp4 --style yellow --no-grade63```6465## House rules / gotchas (hard-won on this machine)6667- **NVENC is broken here** — GPU driver exposes nvenc API 12.2 but ffmpeg 868 needs 13.0 → `h264_nvenc` fails. Script auto-falls back to `libx264 -crf 20`.69 Don't "fix" the nvenc path; the fallback is the working path until the GPU70 driver is updated. (Matches the SkynetLabs video deploy gotcha: NVENC-broken71 → libx264.)72- **Events `Format:` line MUST list `Name`** — the V4+ Events column order is73 `Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text`.74 Omit `Name` and every Dialogue row (which carries the empty Name field75 `E,,0,0,0,,`) mis-parses — libass leaks a phantom **leading comma into the76 text** (`,YOU`). Symptom: clean `.ass` text but a red comma renders before77 every word. Fix = add `Name` to the Format line. Don't strip the comma in78 code — fix the header.79- **Force `-pix_fmt yuv420p`** — the filter chain (`eq`/`curves`/`subtitles`)80 promotes output to `yuv444p` (profile High 4:4:4), which Windows Media Player /81 Photos refuse with **0x80004005 "unsupported encoding settings"**. Both encode82 paths pin `-pix_fmt yuv420p` → profile High, universally playable. Don't ship83 without it.84- **Strip punctuation** — whisper emits `,BROS.`; build_ass strips leading/85 trailing `.,!?;:"()[]—-` so words render clean (`BROS`). Apostrophes kept86 (`I'M`, `EASTON'S`).87- **ASS colour is &HAABBGGRR** (alpha,blue,green,red) — red fill = `&H000000FF&`.88 Don't swap for RRGGBB.89- **Windows path escaping** — the `subtitles=` filter needs the drive colon90 escaped (`C\:/...`); handled in code. Don't pass a raw Windows path.91- Fonts used: **Times New Roman** (red) / **Arial** (yellow) — both ship with92 Windows. Swap to Cinzel/Trajan/Playfair in `STYLES` for a more "luxury" serif.93- Output is always **1080x1920** cover-crop (no letterbox). Feed vertical or94 near-vertical source; very wide source loses the sides.9596## Tuning the look (edit `STYLES` / `build_ass` in easton_reel.py)9798- Bigger glow → raise `blur` (red style, default 9) and `border` (4).99- Slower/snappier punch → change `\t(0,90,...)` ms and the `\fscx78` start scale.100- Hold each word longer/shorter → words hold from their start to the _next_101 word's start (always one on screen). For gap-punches instead, end at `b`.102- Two-track look (red hook + yellow b-roll): run twice — pass 1 `--style red`103 on the hook clip, pass 2 `--style yellow --no-grade` on the b-roll clip,104 then concat.105106## Shoot checklist (to feed this skill the right raw clip)107108- Phone vertical 1080×1920, 30fps. Lock exposure on face.109- Key light on face only; kill background light → crushed-black look the grade110 leans into.111- Authority backdrop (map / poster / monitors). Sit centred, mid-frame.112- Script: punchy hook in first ~1.5s, drop your NAME early (brand), payoff/joke,113 CTA "follow + tune in". Keep it <40s.114- Shoot b-roll separately (watch, eyes, prop gag) for cutaways.115116## Verified117118Tested 2026-06-09: (1) 6s speech trim — faster-whisper word timestamps OK.119(2) Full run on a silent DJI laptop timelapse (2688×1512 landscape, no audio)120via `--text` manual mode → cover-cropped 9:16, graded, red-serif glow punch121words snapped to beats, audio auto-dropped, nvenc→libx264 fallback. Output122clean after fixing the missing-`Name`-column comma bug. Functional, shipped a123real reel (`easton_laptop.mp4`).