The invisible filename
A narrow no-break space (U+202F) hid before “PM” in the filename — ls showed it but every other command said “No such file.” Found it by dumping the raw bytes.
Screen-recording edit
From an 11-minute screen recording to a 2-minute highlight reel — automatically detecting the moments worth watching, and fast-forwarding through everything that was just Claude working.
“There's a screen recording in this directory. It's a recording of me using Claude to import a Google Doc into our Neo4j.com site as a draft blog post. There are nice to see actions in there, but there is a lot of dead time where Claude is processing.
It's a 10m+ video, and I'd like to see if we can get it down to a minute. I'm wondering you can detect actions, but 3× the video speed when nothing is happening except for Claude working through tasks.”
ffmpeg was broken on the machine (a stale libx265 link), so it got reinstalled. The recording’s filename also hid an invisible Unicode space (U+202F) that broke every command — renamed to recording.mov. Original footage untouched.
Sampled the video 4×/second and frame-differenced a heavily downscaled copy. Shrinking the frames first cancels out spinner and cursor jitter, so only real screen changes register as motion.
The data revealed a clean three-act shape — and that 91% of the video was idle, with Claude grinding through tasks while the screen barely changed.
Actions stay slow and watchable; Claude’s processing flies by. Stitched back together with brief crossfades at every speed change.
39 segments, joined with 0.2s crossfades, exported at 30fps — 2:00 flat, 5.8 MB. Verified frame-by-frame that the intro, the prompt, and the final “draft created” reveal all survived.
Claude's streaming output also moves the screen — so a naïve motion detector flags it as “action.” But by your definition that's still Claude working, so it gets sped up too. Only genuine transitions and human input earn the slow 1.5× beat. That distinction is what kept the cut tight instead of landing at ~5 minutes.
Your two goals pulled against each other — a literal “3× the idle” would have landed near 5 minutes, because keeping every action at full speed already costs ~112s on its own. The balanced ~2-minute target reached the sweet spot: brisk, but every action still readable.
A narrow no-break space (U+202F) hid before “PM” in the filename — ls showed it but every other command said “No such file.” Found it by dumping the raw bytes.
ffmpeg pointed at a libx265.215 that no longer existed. A reinstall relinked it to the current library.
A single 39-segment filter graph mis-scheduled and produced a 19s clip. Switching to render-then-chain (clean independent timelines) fixed it.
Tiny idle gaps between rapid actions would become sub-frame blips at 15× and break the fades — so short gaps were absorbed into the neighboring action.
We build agentic workflows that turn raw recordings into something worth watching.