Maintainability: - Choice options now carry a stable `code` separate from the display `label`. The command builder and recipe storage key off codes, so relabeling a menu entry no longer silently changes the encode or breaks a saved recipe. Format/Audio dispatch is now a clean code match instead of `starts_with` on display strings. Old recipes that stored labels still load via a label fallback. Correctness: - Fade start times now scale by the speed factor already applied in the filter chain, so Speed + Fade produces a fade in the right place regardless of op order (video and audio). - Two-pass pass 1 uses the platform null device (NUL on Windows). - The stderr drain thread is joined before Finished is sent, so the failure tail reported to the user is never truncated. Features / cleanup: - Accept multiple file arguments on the CLI to open batch mode directly. - try_recv() instead of recv_timeout(ZERO); drop unused import. Testing: - 23 unit tests covering build() arg generation, speed/fade ordering, recipe round-trip + old-label fallback, and the pure helpers. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
lazyff
A friendly terminal UI for FFmpeg. Trim, resize, crop, compress, convert and apply effects to video and audio — without memorizing a single flag.
lazyff always shows the exact ffmpeg command it is about to run, so you can
learn FFmpeg as you use it (and copy-paste the command anywhere).
Requirements
ffmpegandffprobeon your PATH- A terminal
Install / run
cargo run --release
# or
cargo install --path .
lazyff # browse the current directory
lazyff video.mp4 # open a file straight in the editor
lazyff opens a file browser in the current directory. Pick a video or audio
file, then stack up edits and press r. Mark several files with Space to
edit them all at once (batch mode).
What it can do
| Edit | Examples |
|---|---|
| Trim / Cut | keep 0:30 → 1:45, instant lossless stream copy |
| Resize | 1080p/720p/480p presets, half size, custom |
| Crop | centered square / 16:9 / 9:16 / 4:3, custom rectangle |
| Rotate / Flip | 90°, 180°, mirror |
| Speed | 0.25x – 4x, audio pitch preserved |
| Color adjust | brightness, contrast, saturation |
| Visual effects | grayscale, sepia, blur, sharpen, vignette, denoise, fades |
| Frame rate | 12 – 60 fps |
| Compress | H.264/H.265 with plain-English quality presets |
| Fit to size | "make it 25 MB" — two-pass encode to a target size |
| Convert format | MP4, MKV, WebM, MOV, GIF (with palette pass), MP3, M4A, WAV |
| Audio | remove track, volume, loudness normalization |
Edits combine: add a trim, a resize and a compress, and lazyff builds one ffmpeg command that does all three in a single pass.
Audio files (MP3, FLAC, WAV, ...) only offer the edits that make sense for them — trim, speed, volume/fades, and conversion between audio formats (MP3, M4A, FLAC, WAV, OGG).
Keys
File browser — ↑↓ move, Enter open, Backspace parent folder, q quit
Editor — a add edit, Enter change, d delete, J/K reorder,
s save recipe, l load recipe, o output name, r run, Esc back to
files, q quit
Recipes save your current stack of edits under a name
(~/.config/lazyff/recipes.json) so you can re-apply it to any file or
batch with two keys.
Forms — ↑↓ field, ←→ change choice, type into text fields,
Enter save, Esc cancel
While encoding you get a progress bar with speed readout; Esc cancels and
removes the partial output. Output files are written next to the input as
<name>_lazyff.<ext> (rename with o); lazyff refuses to overwrite the
input file.