demo-scrub/ is 28K of text and no video, because video-scrub's output looks
exactly like its source -- that is the design goal. What is worth reading is
the reconciliation, all of it generated by real runs, none hand-written:
- before.txt a plain film's checkup
- dirty-before.txt the same file with GPS, an email address, a platform video
id, a device name, a chapter and a data track injected
- dirty-after.txt cleaned: 14 needles all miss, 12 gates green
- naive.txt counter-example: a naive -c copy, 7 gates red, with byte
offsets
- half.txt the one worth reading
half.txt runs the textbook recipe -- -map_metadata -1, map only the two
streams, drop chapters. ffprobe comes back spotless: no GPS, no email, no
account id, no chapters, 11 gates green. The twelfth reports x264's encoder
settings SEI in 4 places and the AAC DSE in 8. The file puts ffprobe's clean
output and the gate's verdict side by side, which makes the gap between
"looks clean" and "is clean" obvious at a glance.
demo2.mp4 is now gitignored. Nothing references it: the self-test is pure
functions that touch neither ffmpeg nor a real file, so it stays green without
it. Tracking a 12MB binary would also showcase nothing, since a scrubbed file
is visually identical to its source. demo-scrub/README.md carries commands
that reproduce the whole demo from any video.
Both root READMEs get the skill table row and an examples paragraph; both
video-scrub READMEs link to demo-scrub/.
reelbench-skills
Claude Code / Codex skills for working with video.
| skill | what it does |
|---|---|
| video-shots | Shot breakdown: turns a finished film into a shot-by-shot table — duration, shot size, category, camera move, frame description, rhythm role. Cuts and durations are measured by ffmpeg; the model only judges what it should; 15 quality gates check every call. |
| video-sync | Composites a video with the shot data alongside it: footage on one side, the current shot's data on the other, switching at every cut with the list scrolling and highlighting itself. Landscape stacks, portrait sits side by side; the layout is one CSS file. |
| video-scrub | Strips metadata: rebuilds the film as a clean file carrying only picture and sound — GPS, device, account IDs and telemetry tracks all left behind. The hard part is the three layers ffprobe cannot see: SEI, the AAC DSE, and compressorname. Byte-for-byte picture by default, verified by 12 byte-level gates. |
Install
git clone https://github.com/eternityspring/reelbench-skills.git
cd reelbench-skills
./scripts/install.sh
This symlinks the skills into ~/.claude/skills/ and/or ~/.codex/skills/ (whichever exists),
so git pull takes effect immediately.
./scripts/install.sh --claude # Claude Code only
./scripts/install.sh --codex # codex only
./scripts/install.sh video-shots # one skill only
./scripts/install.sh --uninstall # remove the symlinks
Requirements: node >= 18 and ffmpeg / ffprobe (macOS: brew install node ffmpeg).
No npm dependencies, no API keys — it runs on your current session.
Prefer a copy over a symlink? cp -r skills/video-shots ~/.claude/skills/ —
each skill is self-contained.
Example
demo-report/ is the real output of running the skill on demo-video.mp4
(a 202.9-second AI-generated short film, 啥是AI): 53 shots, 3.83 s average shot length,
15.7 cuts per minute, all 15 gates green. demo-report-en/ is the same pipeline run on a
287.4-second English excerpt with --lang en — an entirely English report: 46 shots, 6.25 s
average, and one 46.92 s take that scene detection never cut, because it genuinely never cuts.
The report is a single interactive page: an embedded player (playback highlights the current shot, click a shot to jump), a pace strip, a shot list you can search, filter and sort (list or card view, first and last keyframe side by side, click a frame to enlarge), distributions, cast, and the quality gates. No external dependencies — double-click it offline.
demo-report/
├── shots-report.html ← clone and double-click
├── shots.json ← the breakdown data for all 53 shots
├── shots.md ← Markdown shot list
├── track.json ← frame-difference motion curve (the machine's evidence)
└── frames/ ← first and last keyframe of every shot, 106 files
demo-scrub/ is what video-scrub produces — four pieces of text and no video, because its
output looks exactly like the source, which is the whole point. What is worth reading is the
reconciliation, above all half.txt: the textbook recipe leaves ffprobe
looking spotless while the bitstream still carries x264's encoder-settings SEI in 4 places and the
AAC DSE in 8 — no ffprobe command shows either of them.
What video-sync produces is at the bottom of this page — as a video, not a screenshot.
What it looks like
A 287.4-second English excerpt with its 46-shot breakdown, 1280×1296 (the source is 640×360,
blown up with --scale 2). The panel switches with every cut; the list scrolls up and the
highlight rides along:
If the player does not load, grab the file: demo-sync/demo-en-sync.mp4
