Agency OS Skill Library

Auto Editor

Turns raw camera and screen recordings into a tight, branded, captioned cut using a scripted command-line pipeline.

Video First result: a full afternoon for the first job auto-editor
Back to all skills

What it does

Takes a raw talking-head recording, optionally plus a screen recording, and returns a finished video file: double-takes and dead space cut, camera and screen composed, graded, levelled to -14 LUFS for vertical and YouTube, and for vertical, karaoke captions and a hook title burned in. It ships three profiles (course, youtube, vertical) that set crop math, box positions, caption style, B-roll density and pace. If you do not name a format, you get vertical 9:16, with screen and speaker in an exact 50/50 split and the speaker in the bottom pane. Horizontal YouTube or course cuts happen only when you ask for them. It is the orchestration layer over ffmpeg, whisper and a Node render pipeline, so the value sits in the cutting rules and the verification loop rather than in the tools themselves. Output is delivered versioned as <name> - EDITED vN.mp4, never overwriting a previous cut.

Say this to start

This skill has no button. You start it by saying what you want. Any of these will do it:

> edit my video
> edit this footage
> cut the dead space
> cut the double-takes
> turn this into a reel
> make this vertical
> make a YouTube cut

When to reach for it

When NOT to use it

If you actually wantUse this instead
slicing an already-finished long video into short clipsvideo-repurposer
turning a finished video into threads, posts or summariescontent-repurposer
writing the feed caption that ships alongside the exportsocial-caption-writer
generating footage that does not exist yetvideo-prompt-builder
the visual direction behind generated footagecreative-director
a full launch with a guide page, comment funnel, captions and postingvideo-lead-magnet-launch (type /launch-video)

Before you start

What you needWhy
ffmpeg and ffprobe on your PATHevery measurement, cut, grade and render runs through them, so nothing starts without bothRequired
whisper-cli plus at least one whisper model file, for example small.enno transcript means no take detection, no word-level cut boundaries and no verification gateRequired
Python with numpy, OpenCV and Pillowcut placement by sound energy, face framing and the picture-in-picture and split layouts. Needed for every profile, and the check reports BLOCKED without themRequired
Node.js with hyperframes runnableit builds the motion-graphic B-roll cards and is the primary path for vertical karaoke captionsRequired
Your own Gemini API key on a paid tier, set as GEMINI_API_KEYit powers the optional review gate, which watches the render and listens for audible repeats, at a small cost per video (check the provider's current pricing). The script it calls is bundled with the plugin, so a paid key is the only thing you supply. Without it you get a structurally checked render that may still contain audible stuttersOptional
The raw camera file, plus the screen recording if the video is a demothe skill edits your footage; it never generates anyRequired
A local scratch folder outside any synced cloud driveworking inside Drive, Dropbox or iCloud causes sync churn on every intermediate renderRequired
An active workspace with brand files for colours, fonts and verified claimshook titles, B-roll cards and any authored on-screen text are claim-checked and brand-styled before renderingRequired

Installing what it needs

This skill drives a real command-line toolchain, so there is a genuine setup step. On a Mac it is about fifteen minutes. It refuses to start rather than half-edit your video if anything mandatory is missing.

Read this before you install anything

"Whisper" is at least six different products, and picking the wrong one is the most common setup failure. The wrong one installs perfectly and the skill still refuses to start.

This skill looks for a command called whisper-cli, and only whisper.cpp provides it. OpenAI's Whisper (openai-whisper on pip) gives you a command called whisper, which will not satisfy the check. Neither will faster-whisper, WhisperX, MacWhisper or Whisper Transcribe. If you installed Whisper and the skill still says it is missing, this is why.

1. ffmpeg

All measuring, cutting, grading and rendering. Mandatory.

brew install ffmpeg

2. whisper.cpp

Transcription, take detection, and the free verification gate. This is the package that gives you whisper-cli.

brew install whisper-cpp

3. A real Whisper model

Homebrew ships only a 562KB test fixture, which cannot transcribe anything usable. This step is the one people skip.

mkdir -p ~/whisper-models && curl -L -o ~/whisper-models/ggml-small.en.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.en.bin

4. Python libraries

numpy, OpenCV and Pillow. Mandatory for every profile, including course and YouTube.

pip3 install --user --break-system-packages numpy opencv-python pillow

5. Node and HyperFrames

Needed for motion-graphic B-roll and karaoke captions. Not needed for a plain cut, so you can skip this and still get most of the value.

brew install node
npx hyperframes@latest --version

6. Optional: the review gate

Only if you want the paid gate that catches audible stutters and visual defects. Use a paid tier: a free key dies partway through a gate, quietly. Get one at aistudio.google.com/apikey.

pip3 install --user --break-system-packages google-genai
echo 'export GEMINI_API_KEY=your_key_here' >> ~/.zshrc && source ~/.zshrc

Check it worked

One command. Every line should print something. If whisper-cli is the line that fails, re-read the box above.

ffmpeg -version | head -1 && ffprobe -version | head -1 && whisper-cli --help | head -1 && node --version && python3 -c "import numpy, cv2, PIL; print('python libraries ok')"

How it runs

  1. Toolchain preflightBefore touching your footage it checks ffmpeg, ffprobe, whisper-cli with a real model, the Python libraries, node and hyperframes. It installs nothing and spends nothing. If anything is missing it stops and names the missing pieces rather than half-starting an edit. This is deliberate: a partial toolchain produces a broken render, not a smaller one.
  2. Pick the profile and agree the planNo format named means vertical 9:16 with the 50/50 split, whatever your camera shot. It confirms the profile with you (course, youtube or vertical) and states the plan: layout, hook title, audio and length. You approve the plan before anything is built. Your own saved preferences, or a direct request, override the defaults.
  3. Measure, do not assumeIt probes the real width, height and fps of both files and pulls sample frames to see where your face sits and how tall the screen recording's menu bar is. The published crop values are starting points from one reference rig, so they get recomputed for your setup.
  4. Transcribe and detect takesIt extracts a 16k mono wav, runs silence detection at -30dB and transcribes with word-level timing. A bundled script then proposes drop ranges for back-to-back repeated takes, keeping the last complete one.
  5. Plan the cutYou review the auto-detected take drops, then it adds false starts, dead space and your own spoken editor cues such as 'leave that part out'. Every boundary lands in the silence between words, never inside one. On pause-heavy recordings it maps the speech itself rather than trusting word timings.
  6. Length check (vertical)If the kept takes run past the cap (60 seconds by default), the length is your call. You get three options with measured durations: under the cap, a light trim, or the full cut. Good content is never cut silently to hit the cap.
  7. Compose, grade and add B-rollKept spans get tagged camera, screen, picture-in-picture or split. Camera gets a grade and the voice chain; the screen is never graded so its colours stay accurate. For youtube and vertical it proposes generated or stock cutaway moments and waits for your OK before spending any credits.
  8. Assemble and renderOne ffmpeg pass handles trim, concat, grade, layout and format, with B-roll and captions composited as alpha overlays over the graded base.
  9. Verify the render, then deliver versionedA free structural gate re-transcribes the output and flags leftover blanks and doubles, and a dead-air check measures every pause. It then stops and asks whether to run the optional paid review gate.
  10. You approve, then it deliversA render is a draft until you approve it. You see the file, a frame grab (plus the first frame for verticals, which is the default thumbnail) and the gate results. Notes become a new version, never an overwrite. Only the version you approve is delivered, as a new vN file with a report stating source and final duration, cut counts, and whether the review gate ran.

What you get

Honest limits

Read this before you rely on it

Where people go wrong

The mistakeDo this instead
Checking the cut plan and calling it doneVerify the rendered output, not the plan. Whisper hallucinates missing words when transcribing the source, so a clipped word looks fine in planning and only shows up once you re-transcribe the render.
Pushing the silence threshold to -35dB or -40dB to catch moreStay at -30dB. More sensitive settings grab room tone and leave long dead air in the output. If genuinely soft speech is being dropped, go to -33dB and verify.
Overwriting the previous cut with the new oneEvery revision is a new vN file. Keep the prior cut so you can compare or revert.
Reporting a render as 'verified' when only the free gate ranSay 'structurally checked (8b review gate not run)' and warn that audible stutters may remain. Reserve 'verified' for a render where the paid review gate actually passed.
Pasting the documented crop and position values straight inProbe your own files and pull sample frames first. Those values were tuned to one specific camera and screen setup and will be wrong for a different rig.
Worth knowing

On pause-heavy speech, whisper word timestamps drift by seconds because whisper stretches words across silence, so never place a surgical retake cut from them there. Use the bundled energy profile script instead and put the boundary in a sustained low pocket, at least 60ms away from any rise in energy.