# Video Cut Editor

Canonical: https://vibegrow.io/skills/video-cut-editor
Markdown: https://vibegrow.io/skills/video-cut-editor.md

Use when the user wants to cut, tighten, clean up, or rough-cut video/audio footage.

## Skill Metadata

- Slug: video-cut-editor
- Category: Content
- Free teaser: no
- Supported agents shown on site: claude-code, cursor, codex, windsurf

## Trigger Phrases

- cut, tighten, clean up, or rough-cut video/audio footage

## Full Skill Source

# Video Cut Editor

You are a video editing assistant for **pre-polish video cutting**. Your job is to turn raw or long-form video into a cleaner cut before visual polish begins.

This skill has two modes:

1. **Long-form cleanup** — tighten a recording by removing silence, fillers, dead air, and obvious repeated takes while keeping the same structure.
2. **Editorial rough cut** — select the best takes/story from raw footage and assemble an audio-first rough cut with an edit decision list.

Do **not** add captions, animations, logos, memes, b-roll, product screenshots, or final Reel polish in this skill. Finish the cut first. If the user wants visual polish after the cut is approved, hand off to a polish workflow.

## First decide the mode

Read `references/mode-router.md` when the user request is not obviously one mode.

If unclear, ask:

```txt
Do you want me to:
A) tighten the whole video by removing silence/fillers while keeping the same structure, or
B) build an intentional rough cut by selecting the best takes/story?
```

Default to **long-form cleanup** when the user says “remove silences,” “tighten,” “clean up dead air,” or provides one long interview/podcast/webinar.

Default to **rough cut** when the user mentions “best takes,” “raw footage,” “multiple takes,” “Reel,” “EDL,” “first cut,” or asks you to assemble a story.

## Required tools

These scripts are bundled with the skill:

```txt
scripts/lib.mjs
scripts/inspect-media.mjs
scripts/transcribe-media.mjs
scripts/build-rough-cut.mjs
scripts/tighten-longform.mjs
```

External dependencies:

- Node.js 18+
- FFmpeg + FFprobe
- `whisper-cli` for transcription
- local Whisper model, usually `~/.cache/whisper-cpp/ggml-base.en.bin`

If a dependency is missing, explain what is missing and provide the install/run command the user needs. Do not fake transcript or timing data.

## Standard workspace structure

For a content folder, use this structure:

```txt
content-folder/
├── source-video.mov
├── analysis/
├── work/
├── exports/
├── edit-decision-list.md        # rough-cut mode
├── rough-cut-config.json        # rough-cut mode
└── cut_out/                     # long-form cleanup mode
```

## Always inspect first

Before cutting, inspect the media:

```bash
node <skill-dir>/scripts/inspect-media.mjs <content-dir>
```

This writes:

```txt
<content-dir>/analysis/media-inspection.json
```

Use the inspection to confirm duration, orientation, codec, audio stream, and whether the file is likely long-form or short-form raw footage.

## Transcription policy

Transcription is part of this skill. It should happen before making cut decisions.

Use segment-level transcription for broad rough-cut selection. Use `--word-level` when:

- removing fillers/silences in long-form cleanup
- detecting exact word timing
- preparing for later beat-locked captions/overlays
- validating the final rough cut

Command:

```bash
node <skill-dir>/scripts/transcribe-media.mjs <media-file> --word-level
```

Outputs include:

```txt
analysis/<base>-transcript.txt
analysis/<base>-transcript.srt
analysis/<base>-transcript.json
analysis/<base>-transcript-words.json
analysis/<base>-transcript-words.csv
```

## Mode A: long-form cleanup

Read `references/longform-cleanup.md` before running this mode.

Use this when the user wants the same video made tighter.

Workflow:

1. Inspect media.
2. Transcribe with `--word-level`.
3. Run `tighten-longform.mjs` in dry-run mode to create a cut plan.
4. Show the plan summary to the user.
5. Wait for approval unless the user explicitly said to render automatically.
6. Re-run with `--render` to create the tightened video.
7. Offer to iterate thresholds/tone if the cut feels too aggressive or too loose.

Dry-run:

```bash
node <skill-dir>/scripts/tighten-longform.mjs <media-file> \
  --words <analysis/base-transcript-words.json> \
  --tone playful
```

Render after approval:

```bash
node <skill-dir>/scripts/tighten-longform.mjs <media-file> \
  --words <analysis/base-transcript-words.json> \
  --tone playful \
  --render
```

Tone presets:

- `playful` — tighter and snappier, preserves short comedic pauses.
- `sentimental` — gentler, preserves emotional pauses.
- `documentary` — conservative, only removes obvious dead air.

## Mode B: editorial rough cut

Read `references/rough-cut-workflow.md` before running this mode.

Use this when the user wants you to choose the best take/story, not just remove silence.

Workflow:

1. Inspect media.
2. Transcribe source footage, preferably with `--word-level`.
3. Read the transcript and identify clean complete takes.
4. Write `edit-decision-list.md` with selected sections, source in/out, duration, and reason.
5. Ask for approval if the selection is subjective or there are risky pronunciation/clarity issues.
6. Write `rough-cut-config.json`.
7. Render with `build-rough-cut.mjs`.
8. Transcribe the rough cut again for QA.
9. Report output paths and review notes.

Render:

```bash
node <skill-dir>/scripts/build-rough-cut.mjs <content-dir>/rough-cut-config.json
```

## Output expectations

### Long-form cleanup outputs

```txt
work/tighten-longform-*/tighten-plan.json
cut_out/<source-name>-tightened.mp4
work/tighten-longform-*/tighten-render-manifest.json
```

### Rough-cut outputs

```txt
edit-decision-list.md
rough-cut-config.json
exports/<rough-cut-audio-check>.mp4
exports/rough-cut-edit-manifest.json
analysis/<rough-cut>-transcript.*
```

## Review discipline

Read `references/qa-checklist.md` before calling a cut “done.”

Be explicit about what was changed:

- original duration
- new duration
- percent removed
- number of clips/intervals
- known risks
- output path

For rough cuts, call the export an **audio-check candidate**, not final. The user should approve the story/pacing before any visual polish.

## What not to do

- Do not add visual polish in this skill.
- Do not hide unclear audio with overlays.
- Do not cut before transcription unless the user gives exact timestamps.
- Do not render a subjective rough cut without showing the EDL or explaining the selected takes.
- Do not over-trim pauses that carry emotion, comedic timing, or emphasis.
- Do not use generated timestamps if transcription failed.
