CLI reference¶
Every command prints one JSON result envelope on
stdout and exits non-zero with a stable error code on failure.
video-edit-cli --help and each subcommand's --help output define the current
interface. This page adds context.
Installation¶
Install the base CLI as a tool:
Optional extras:
# Local transcription on Apple Silicon (mlx-whisper)
uv tool install 'video-edit-cli[mlx]'
# DeepFilterNet speech denoising (Python 3.11–3.12 only)
uv tool install 'video-edit-cli[df]'
Install ffmpeg and ffprobe separately and add them to PATH. Commands fail
with the stable error code missing-binary when they are absent.
Verify your environment with doctor before starting work.
Quickstart¶
# 1. Create a workspace and register the immutable source
video-edit-cli workspace init --root /tmp/ep1 --source recording.mp4
# 2. Inspect the media
video-edit-cli probe --input recording.mp4
# 3. Gather visual evidence for a range
video-edit-cli filmstrip create --input recording.mp4 \
--start 60 --end 90 --output /tmp/ep1/analysis/strip.png --workspace /tmp/ep1
# 4. Transcribe (Apple Silicon, requires the mlx extra)
video-edit-cli transcript create --input recording.mp4 \
--output /tmp/ep1/transcripts/recording.json --workspace /tmp/ep1
# 5. Author an edit-plan JSON yourself, then validate and render it
video-edit-cli plan validate --plan /tmp/ep1/plans/main.json
video-edit-cli render preview --plan /tmp/ep1/plans/main.json \
--output /tmp/ep1/renders/preview.mp4 --workspace /tmp/ep1
Every command prints a JSON envelope, so results compose in scripts:
Conventions¶
Conventions used by many commands:
--workspace WORKSPACE— optional workspace root; records the derived artifact inworkspace.json. Never required.- Commands that create files take an explicit
--output(or--output-dir) and never overwrite source media. - Times and durations are seconds (fractions allowed); ranges are
--start/--endin source time.
Environment¶
doctor¶
Check local dependencies for an editing workflow.
| Option | Description |
|---|---|
--workflow |
Which dependency chain to verify (default base: ffmpeg + ffprobe). transcription adds the local Whisper backend; audio-restoration verifies the full Torch/Torchaudio/DeepFilterNet import chain; vertical-captioned covers the short-form pipeline. |
Run the matching workflow check before costly work. Fix failures first.
Workspace¶
workspace init¶
Create a workspace and register immutable sources.
| Option | Description |
|---|---|
--root |
Directory to create the workspace in |
--source |
Source media path (repeatable) |
--role |
Role label per source, in --source order (e.g. camera-a, mic-guest) |
Writes workspace.json with each source's path, SHA-256 hash, and id
(src-1, src-2, …), and creates the standard subdirectories.
Inspection¶
probe¶
Inspect streams and container metadata.
| Option | Description |
|---|---|
--input |
Path to the media file |
proxy create¶
Create a low-resolution proxy for fast seeking and review.
| Option | Description |
|---|---|
--input |
Path to the source media file |
--output |
Path for the new derived file |
--height |
Proxy height in pixels |
frame extract¶
Extract one frame at a source time.
| Option | Description |
|---|---|
--time |
Source time in seconds |
filmstrip create¶
Create a timestamped contact sheet for a range.
video-edit-cli filmstrip create --input INPUT --output OUTPUT \
--start START --end END [--columns COLUMNS] [--frames FRAMES] [--workspace WS]
| Option | Description |
|---|---|
--start / --end |
Range in seconds |
--columns |
Tiles per row |
--frames |
Frames to sample |
waveform create¶
Render a waveform image for a range.
video-edit-cli waveform create --input INPUT --output OUTPUT --start START --end END [--workspace WS]
preview create¶
Render a short, low-resolution preview of a range.
video-edit-cli preview create --input INPUT --output OUTPUT --start START --end END [--workspace WS]
Audio¶
audio extract¶
Extract lossless canonical WAV audio.
audio analyze¶
Measure loudness, peaks, clipping, silence, and bandwidth.
audio master¶
Deterministic mastering with two-pass loudness normalization.
video-edit-cli audio master --input INPUT --output OUTPUT \
[--target-lufs TARGET] [--true-peak DBTP] [--lra LRA] \
[--highpass HZ] [--no-compressor] [--workspace WS]
| Option | Description |
|---|---|
--target-lufs |
Integrated loudness target |
--true-peak |
True-peak ceiling in dBTP |
--lra |
Loudness range target |
--highpass |
Rumble highpass frequency in Hz |
--no-compressor |
Skip the gentle speech compressor |
audio denoise¶
Run one selected local denoising backend. The command never applies denoising unless you request it.
| Option | Description |
|---|---|
--backend |
Denoising backend; currently deepfilternet (requires the df extra, Python 3.11–3.12) |
Run doctor --workflow audio-restoration first.
audio compare¶
Create loudness-matched A/B files and metrics for candidate audio files.
video-edit-cli audio compare --input A.wav --input B.wav --output-dir DIR \
[--match-lufs LUFS] [--start START] [--duration SECONDS]
| Option | Description |
|---|---|
--input |
Candidate audio (repeat 2+ times) |
--output-dir |
Directory for samples and the report |
--match-lufs |
Loudness to match excerpts to |
--start / --duration |
Excerpt to compare |
audio replace¶
Replace a video's audio stream while stream-copying its video.
video-edit-cli audio replace --video VIDEO --audio AUDIO --output OUTPUT \
[--audio-codec CODEC] [--audio-bitrate BITRATE] \
[--duration-tolerance SECONDS] [--workspace WS]
| Option | Description |
|---|---|
--video |
Video whose video stream is kept |
--audio |
Replacement audio input |
--duration-tolerance |
Maximum allowed audio/video duration difference in seconds |
Transcription¶
transcript create¶
Transcribe with a local backend and write detailed word-level JSON (the authoritative transcript).
video-edit-cli transcript create --input INPUT --output OUTPUT \
[--backend {mlx-whisper,fixture}] [--model MODEL] [--language LANG] \
[--fixture FIXTURE] [--source-id ID] [--workspace WS]
| Option | Description |
|---|---|
--backend |
Transcription backend; fixture replays a prepared raw JSON (tests/dev) |
--model |
Backend model name |
--language |
Spoken language hint (e.g. en, da) |
--fixture |
Raw transcription JSON for --backend fixture |
--source-id |
Workspace source id to record in the transcript |
mlx-whisper requires the mlx extra (Apple Silicon).
transcript pack¶
Derive the compact agent-readable text view from an authoritative transcript.
transcript search¶
Find time-aligned matches for a spoken phrase.
Plans and rendering¶
plan validate¶
Validate a plan's schema, references, and ranges against the real media. See Concepts → Edit plans.
render preview¶
Render a plan with the 360p preview profile by default. The command also writes
<output>.manifest.json, which maps output boundaries to source times.
render master¶
Render a plan using a named profile from an external project profile YAML.
video-edit-cli render master --plan PLAN --profile PROFILE.yaml \
--profile-name NAME --output OUTPUT [--workspace WS]
Cut review¶
cuts list¶
List cut boundaries from a render manifest.
cut inspect¶
Gather frames, waveform, preview, transcript context, and checks around one cut (or every cut).
video-edit-cli cut inspect --manifest MANIFEST (--cut INDEX | --all) \
--output-dir DIR [--window SECONDS] [--transcript TRANSCRIPT]
| Option | Description |
|---|---|
--cut |
Zero-based cut index from cuts list |
--all |
Inspect every cut in the manifest |
--window |
Seconds of context on each side |
--transcript |
Source transcript JSON for clipped-word checks |
Subtitles¶
subtitles create¶
Use a render manifest to derive SRT + WebVTT from source transcripts.
video-edit-cli subtitles create --manifest MANIFEST --transcript TRANSCRIPT \
--output-srt OUT.srt --output-vtt OUT.vtt \
[--max-words N] [--max-chars N] [--max-duration SECONDS] [--workspace WS]
| Option | Description |
|---|---|
--transcript |
Source transcript JSON (repeatable, one per source) |
--max-words / --max-chars |
Cue limits for short-form reflow |
--max-duration |
Maximum approximate cue duration in seconds |
subtitles render¶
Mux (soft) or burn (hard) subtitles into a video.
video-edit-cli subtitles render --input VIDEO --subtitles SUBS --output OUTPUT \
[--mode {mux,burn}] [--font NAME] [--font-size UNITS] \
[--primary-color ASS] [--outline-color ASS] [--outline-width UNITS] \
[--shadow UNITS] [--alignment 1-9] [--margin-v UNITS] [--workspace WS]
| Option | Description |
|---|---|
--subtitles |
SRT, VTT, or ASS path |
--mode |
mux (subtitle stream) or burn (pixels) |
--font-size |
Burn mode, in libass script units — not output pixels (SRT/VTT commonly use a 288-unit-high script canvas) |
--primary-color / --outline-color |
Burn mode ASS colors, e.g. &H00FFFFFF |
--alignment |
ASS alignment 1–9 (2 = bottom center) |
--margin-v |
Burn mode vertical margin in ASS script units; 35–50 suits lower-third captions |
Assets and output¶
asset inspect¶
Validate an intro, outro, music, font, image, or subtitle asset before use.
output validate¶
Check streams, canvas, duration, loudness, and subtitles. A person or agent must review framing and editorial quality.
video-edit-cli output validate --input INPUT \
[--profile PROFILE.yaml] [--profile-name NAME] \
[--expect-duration SECONDS] [--expect-canvas WIDTHxHEIGHT] \
[--duration-tolerance SECONDS] [--loudness-tolerance LU] \
[--expect-subtitles] [--subtitles SUBS]
| Option | Description |
|---|---|
--expect-canvas |
Expected WIDTHxHEIGHT without requiring a profile |
--expect-subtitles |
Require a subtitle stream |
--subtitles |
Subtitle file to check against the output duration |
Synchronization¶
sync analyze¶
Estimate the audio offset between two sources. This command changes nothing.
sync apply¶
Create an aligned derivative (or a .json offset mapping) from an approved
offset.
| Option | Description |
|---|---|
--output |
Aligned media path, or a .json path for mapping metadata only |
Short-form¶
reframe preview¶
Preview an explicit crop scaled onto a canvas.
video-edit-cli reframe preview --input INPUT --output OUTPUT \
--start START --end END --crop X:Y:WIDTH:HEIGHT --canvas WIDTHxHEIGHT [--workspace WS]
| Option | Description |
|---|---|
--crop |
x:y:width:height in source pixels |
--canvas |
Output canvas WIDTHxHEIGHT |
short create-plan¶
Derive an editable vertical plan from an explicit source range. You choose the range — this command never picks highlights.
video-edit-cli short create-plan --input INPUT --start START --end END \
--reason REASON --output PLAN.json \
[--source-id ID] [--canvas WIDTHxHEIGHT] [--crop X:Y:W:H] \
[--parent-plan ID] [--created-by NAME] [--workspace WS]
| Option | Description |
|---|---|
--reason |
Editorial reason for choosing this range (required) |
--parent-plan |
Plan id this short derives from |
--created-by |
Authoring agent identifier |
Agent skills¶
skills list¶
List the skills bundled with the CLI.
skills install¶
Copy the bundled skills into an agent skills directory.
| Option | Description |
|---|---|
--target |
Skills directory to install into (default .claude/skills) |