vidcapture

Rust CLI for macOS, Linux & Windows

Record your screen from the terminal. Stop it with one key.

Cut a precise range out of the result, and caption it, without opening an editor. No GUI, no project files, no export dialog — one binary that shells out to ffmpeg and gets out of the way.

cargo install vidcapture
$ vidcapture start
Capturing [12s elapsed], press s to stop.
Saved to vidcapture_2026-08-27_21-40-03.mp4

$ vidcapture cut vidcapture_2026-08-27_21-40-03.mp4 --from 3s --to 9s
Cut saved to vidcapture_2026-08-27_21-40-03_cut.mp4

$ vidcapture label talk.mp4 -l "text=Setting up,from=1m32s,to=2m"
Labeled video saved to talk_labeled.mp4
01

start — record

Records the full screen plus system audio and microphone, mixed into one track, as H.264/AAC MP4. Press s to stop, or set -d 30s to stop on a timer. Interval mode (-e 10s) splits a long recording into seamless, independently playable segments as it goes — a crash only costs the current segment.

seg 1 seg 2 seg 3 seg 4 ●
vidcapture start -e 10s
$ vidcapture start                    # record until you press 's'
$ vidcapture start -d 30s             # stop automatically after 30 seconds
$ vidcapture start -e 10s             # split into 10-second segments
$ vidcapture start -o ./recordings/   # save into ./recordings/
02

cut — trim

Pulls a millisecond-precise range out of any existing video into a new file. The source is opened read-only and never modified. Re-encodes by default for a frame-accurate start; --fast stream-copies for a near-instant, keyframe-aligned cut.

in 10s out 25s
vidcapture cut talk.mp4 --from 10s --to 25s → talk_cut.mp4
$ vidcapture cut talk.mp4 --length 5s                       # first 5 seconds
$ vidcapture cut talk.mp4 --from 10s --to 25s               # 10s through 25s
$ vidcapture cut talk.mp4 --from 1m --length 1500ms --fast   # no re-encode
03

label — caption

Draws timed text onto any existing video: each label appears for the span you give it and disappears again. Repeat -l for as many labels as you need, all in one pass. A label needs only its text and its window — it comes out white on a translucent band, readable over whatever is behind it.

$ vidcapture label talk.mp4 \
    -l "text=Intro,from=0s,to=1m32s,position=top" \
    -l "text=Setting up,from=1m32s,to=2m" \
    -l "text=Live demo,from=2m,length=90s,color=#ffcc00,size=48,background=black@0.7"

Each -l takes one label as comma-separated key=value pairs. To put a literal comma in the text, write \,. The result is written beside the source as talk_labeled.mp4; talk.mp4 is never modified.

Label spec keys
keymeaningdefault
textThe text to draw. Required.—
fromWhen the label appears.0s
toWhen it disappears. Use this or length.—
lengthHow long it stays up. Use this or to.—
positiontop or bottom.bottom
colorText color.white
sizeFont size in pixels.32
backgroundBand behind the text, or none.black@0.5

Small things that matter

One time format

10s, 1500ms, 1h30m10s or 00:01:30.500 — accepted by every time-valued flag and every label spec key.

Nothing left behind

Sources are opened read-only. A failed capture or cut cleans up after itself, so you never inherit a half-written file.

Ships an agent skill

A release build installs a vidcapture skill for Claude Code, Codex and OpenCode, so your agent knows the flags too.

Requirements

Get it

cargo install vidcapture

Or build from source: git clone the repo, then cargo install --path .. Re-running either command upgrades an existing install in place.