Cut dead air out of a recording.

vcut finds the silences, filler words, and technical faults in a raw take, proposes an edit as data, and renders it only after a human approves.

Install npm install -g @crafter/vcut
Try it npx @crafter/vcut recording.mp4
Skill npx skills add Railly/vcut
$ vcut recording.mp4

recording.mp4  6m 22s
  dead air      ###.........  16.5%  (1m 03s)
  net of margin ##..........  10.3%  (~39s)
  silences      119 spans
  fillers       4 hits
  review        1 (never cut)
                clipping: peak -0.24 dB

  Next:
    vcut detect recording.mp4 --json
3
Presets
3
Languages
0
Auto-approvals
1
Command

Cutting silence is mechanical. Deciding what stays is not.

Trimming pauses out of a talking-head recording is work an agent should do. What an agent should not do is decide which of your mistakes stay in, or overwrite the only copy of a take.

vcut splits those. It proposes cuts as data you can read, and every destructive step is gated behind a human. The thresholds are not invented either: they come from a pipeline that ran in production on published video.

vcut detect

Silences by preset, filler words by language, clipping, black and frozen frames. Writes candidates, decides nothing.

vcut detect recording.mp4 --preset clean --lang es

vcut edl build

Inverts the cuts into the spans worth keeping. Every segment is born proposed, the EDL draft.

vcut edl build --detect detect.json \
  --output master.mp4 --campaign my-video

vcut render

Preview accepts proposals. Master needs an approved EDL, matching source hashes, and a free output path.

vcut render --edl edl.json --mode preview

vcut schema

The JSON contract per command, versioned. An agent introspects it instead of parsing help text.

vcut schema detect
JSON by default
Machine output when stdout is not a TTY. An agent never needs to remember a flag.
Exit codes that mean something
2 for a wrong invocation, 1 for a failed run, 0 for success. Data on stdout, diagnostics on stderr.
vcut schema
The output contract is introspectable at runtime, versioned, and does not require reading source.
npx skills add Railly/vcut
The installed skill is a thin stub pointing at vcut skills get, so guidance never drifts from the installed version.
Nothing self-approves
Segments are proposed, the EDL is draft. There is no --yes for the master render.
Sources are hashed
A changed source hash aborts a master render. Original media is never modified.

The renderer checks its own work

After rendering, vcut probes the file it just produced and compares it against the EDL: dimensions, pixel format, colour metadata, decoded frame count within one frame, and the audio contract. A render that quietly produced two extra frames is a bug, and without this check it ships as a working file.

Renders are reproducible

The same EDL produces a byte-identical file. The sha256 in the result exists so you can verify that yourself rather than take it on faith. It is also how the port from one runtime to another was checked: same EDL, same hash, byte for byte.

Unimplemented fields are rejected

The EDL schema has room for external audio, sync offset, and noise reduction. The renderer does not implement them, so it refuses an EDL that sets them instead of rendering something that quietly ignores half the instruction.

Start with one file.

npx @crafter/vcut recording.mp4

Needs ffmpeg and ffprobe on your PATH. Run vcut doctor to check.