One time format
10s, 1500ms, 1h30m10s or
00:01:30.500 — accepted by every time-valued flag and every
label spec key.
Rust CLI for macOS, Linux & Windows
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
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.
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/
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.
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
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.
| key | meaning | default |
|---|---|---|
text | The text to draw. Required. | — |
from | When the label appears. | 0s |
to | When it disappears. Use this or length. | — |
length | How long it stays up. Use this or to. | — |
position | top or bottom. | bottom |
color | Text color. | white |
size | Font size in pixels. | 32 |
background | Band behind the text, or none. | black@0.5 |
10s, 1500ms, 1h30m10s or
00:01:30.500 — accepted by every time-valued flag and every
label spec key.
Sources are opened read-only. A failed capture or cut cleans up after itself, so you never inherit a half-written file.
A release build installs a vidcapture skill for Claude
Code, Codex and OpenCode, so your agent knows the flags too.
avfoundation, x11grab (X11), or
gdigrab input, with the microphone found automatically.
brew install ffmpeg,
sudo apt install ffmpeg, or
winget install Gyan.FFmpeg. On macOS, label
needs the drawtext filter:
brew install ffmpeg-full, then
export PATH="$(brew --prefix ffmpeg-full)/bin:$PATH".
vidcapture help has the steps). Without it,
start records the screen and microphone.
cut and label need neither audio devices nor
screen-recording permission.
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.