Projects

Screen-recording edit

Screen Recording → 2-Minute Highlight Reel

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.

  • 11:15 Original
  • 2:00 Final cut
  • 91% Was dead time
  • 5.6× Shorter

Where it started

“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.”

How we did it

  1. Got the tools working

    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.

  2. Measured activity across the whole video

    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.

  3. Found the structure

    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.

    Setup & prompt 0:00–1:10 · you, typing
    Claude working 1:10–10:20 · dead time
    The payoff 10:20–11:15 · result reveal
  4. Re-timed each moment

    Actions stay slow and watchable; Claude’s processing flies by. Stitched back together with brief crossfades at every speed change.

    Actions 1.5× You navigating, typing the prompt, the result reveal — kept readable.
    Claude working 15× Thinking + streaming output. A 139-second “Thinking…” stretch collapses to ~9s.
  5. Rendered the cut

    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.

The key insight

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.

The result

Original 11:15 · 675s
Highlight reel 2:00 · 120s

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.

Bumps along the way

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.

Broken ffmpeg

ffmpeg pointed at a libx265.215 that no longer existed. A reinstall relinked it to the current library.

The collapsing crossfade

A single 39-segment filter graph mis-scheduled and produced a 19s clip. Switching to render-then-chain (clean independent timelines) fixed it.

Sub-frame slivers

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.

highlights.mp4 · 1440×1076 · 30fps · 5.8 MB · Neo4j blog-post import

Have footage that's mostly waiting?

We build agentic workflows that turn raw recordings into something worth watching.

Start a conversation