eternityspring 1b51af897b Add video-scrub demo output; stop tracking demo2.mp4
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/.
2026-09-21 16:12:42 +08:00

中文 English Follow on X

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.

Shot breakdown report

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.

the shot list on a narrow screen
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

Languages
JavaScript 49.4%
HTML 41.4%
CSS 8.7%
Shell 0.5%