| Crates.io | ffdash |
| lib.rs | ffdash |
| version | 0.3.0 |
| created_at | 2026-01-01 05:48:14.679967+00 |
| updated_at | 2026-01-02 15:08:03.289363+00 |
| description | FFMPEG video encoder with live dashboard, hardware acceleration, and batch processing |
| homepage | https://github.com/bcherb2/ffdash |
| repository | https://github.com/bcherb2/ffdash |
| max_upload_size | |
| id | 2015799 |
| size | 1,382,757 |
A terminal UI for batch VP9/AV1 video encoding with hardware acceleration, real-time progress monitoring, and full control over quality settings. Made to work as a dashboard over SSH.
https://github.com/user-attachments/assets/f7551d5f-fe6c-4a13-81e2-92a5e2bb42c2
VP9 delivers 20-50% smaller files than H.264 at equivalent quality. AV1 is the next-generation codec offering slightly better compression than VP9. Both are open-source, royalty-free, and natively supported by YouTube, all modern browsers, and media servers like Plex and Jellyfin.
Typical file sizes:
Rust 1.85+ (edition 2024):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
rustc --version # Should show 1.85.0 or higher
FFmpeg with VP9/AV1 support (tested with v8.0):
# Ubuntu/Debian
sudo apt update && sudo apt install ffmpeg
# macOS (or Linux with brew)
brew install ffmpeg
Or install both automatically:
make deps
| Platform | Requirements |
|---|---|
| Intel QSV | Linux, /dev/dri device mapped, Intel HD 5000+ or Arc GPU |
| Intel/AMD VA-API | Linux, /dev/dri device mapped, Mesa VAAPI drivers |
| NVIDIA NVENC | Linux, CUDA drivers, Ada Lovelace+ (RTX 4000 series or newer) |
Verify hardware support:
ffdash check-vaapi # Intel/AMD VA-API
ffmpeg -encoders | grep -E "vp9|av1" # List available VP9/AV1 encoders
Download from GitHub Releases:
ffdash-x86_64-unknown-linux-gnu.tar.gzffdash-x86_64-apple-darwin.tar.gzffdash-aarch64-apple-darwin.tar.gzffdash-x86_64-pc-windows-msvc.zip# Arch Linux (AUR)
yay -S ffdash-bin
# macOS or Linux (Homebrew)
brew tap bcherb2/ffdash
brew install ffdash
git clone https://github.com/bcherb2/ffdash.git
cd ffdash
make release
sudo make install # Installs to /usr/local/bin
ffdash check-ffmpeg # Verify FFmpeg is configured correctly
ffdash --help # Show all commands
# Launch TUI and scan current directory
ffdash
# Launch TUI and scan a specific directory
ffdash /path/to/videos
# Preview FFmpeg commands without encoding
ffdash dry-run /path/to/video.mp4
| Key | Action |
|---|---|
S |
Start encoding |
SPACE |
Toggle pending / skipped |
C |
Open config |
H |
Show help |
T |
Toggle stats view |
R |
Rescan directory |
Q |
Quit (confirms if encoding) |
X |
Clear state and exit |
↑↓ |
Navigate queue |
Tab |
Cycle active jobs |
[/] |
Adjust workers |
Generate a config file to customize defaults:
ffdash init-config
# Creates ~/.config/ffdash/config.toml
Example configuration:
[startup]
autostart = false # Wait for manual start
scan_on_launch = true # Scan directory on launch
[defaults]
profile = "1080p Shrinker" # Default encoding profile
max_workers = 1 # Concurrent encode jobs
See CONFIG.md for all options.
Automatically calibrate encoder quality to achieve a target VMAF perceptual quality score.
How it works:
Configuration (in TUI Config screen):
Supported modes:
Performance: Adds ~10% overhead via sparse sampling (60s total analysis budget, evaluates 1 frame/sec).
Status display: Shows "Calibrating" during analysis, displays achieved VMAF in results column.
Please be familiar with VMAF and how it works. There can be some differences between scores of older or highly compressed / low-res footage - I assume this is because of the objectively low quality being used as a reference.
See docs/AUTO_VMAF.md for detailed algorithm and advanced settings.
ffdash [OPTIONS] [DIRECTORY]
Options:
--autostart Start encoding immediately after scan
--no-autostart Wait for manual start (overrides config)
--scan Scan directory on launch (overrides config)
--no-scan Start with empty dashboard
ffdash check-ffmpeg # Verify FFmpeg installation
ffdash check-vaapi # Test VA-API hardware encoding support
ffdash init-config # Create/show config file location
ffdash probe FILE # Get video duration and metadata
ffdash scan DIR # List detected video files
ffdash dry-run FILE|DIR # Preview FFmpeg commands
ffdash encode-one DIR # Encode only the first pending file
Build the image (requires local binary first):
make docker-build
docker run -it --rm \
--device /dev/dri:/dev/dri \
-v /path/to/videos:/videos \
ffdash:latest ffdash /videos
docker run -it --rm \
--gpus all \
-e NVIDIA_DRIVER_CAPABILITIES=compute,utility,video \
-v /path/to/videos:/videos \
ffdash:latest ffdash /videos
Add -p 2223:22 -e SSH_PASSWORD=yourpassword to enable SSH into the container.
I changed settings but they didn't apply to my encode?
If a queue is already built, you need to rescan (R) to apply new settings. This is similar to how Handbrake's queue works.
How do I verify hardware encoding is active?
Help screen shows what hardware acceleration is available
Logs are written to directory where ffdash is launched
Use tools like nvidia-smi or intel_gpu_top to verify utilization
It should be very obvious - CPU encoding will take HOURS for most films
What quality settings should I use?
I almost always use AV1 with QSV encoder on slowest (1) with a quality of between 80 and 140, depending on the resolution, quality, etc.
Can I pause and resume encoding?
Yes. Press Q to quit - if encodes are running, you'll be asked to confirm. Progress is saved to .enc_state in each directory. Run ffdash again to resume where you left off.
Why aren't my video files showing up?
Supported formats: .mp4, .mkv, .avi, .mov, .webm, .flv, .m4v
Press R to rescan the directory after adding files.
Why am I having issues encoding this Blu-ray?
How much faster is hardware encoding?
Way faster than software encoding. Quality may be slightly lower at equivalent bitrates, so consider increasing bitrate by ~20% when using hardware encoding. In rare cases, you may want to use software encoding for AV1. You may want to do this for maximum compression, or to use the software-only film-grain options.
Getting errors on 5+ channel audio?
Likely need to increase the audio bitrate, or force downmixing into stereo. Passthru may also be your best option if using something like TrueHD audio.
The TUI looks broken over SSH
Ensure your terminal supports 256 colors and your TERM variable is set correctly:
export TERM=xterm-256color
| Problem | Solution |
|---|---|
| "No hardware devices detected" | Verify /dev/dri exists (VA-API) or --gpus all is set (NVENC) |
| Encoding fails immediately | Run ffdash dry-run and test the command manually with ffmpeg |
| Wrong encoder selected | Check hardware toggle in Config screen (C) |
| Slow performance | Press ] to add workers, or enable hardware encoding |
Validate FFmpeg capabilities:
# VP9 encoders
ffmpeg -h encoder=libvpx-vp9 # Software VP9
ffmpeg -h encoder=vp9_vaapi # VA-API VP9
# AV1 encoders
ffmpeg -h encoder=libsvtav1 # Software AV1 (SVT-AV1)
ffmpeg -h encoder=av1_qsv # Intel Quick Sync AV1
ffmpeg -h encoder=av1_nvenc # NVIDIA NVENC AV1
ffmpeg -h encoder=av1_vaapi # VA-API AV1
Batch directory scanning
Resume interrupted encodes
Skip/unskip files in queue
Per-directory state persistence
Watch mode (auto-encode new files)
Post-encode scripts/hooks
Better way to build queue
Contributions are welcome! Please:
cargo test before submittingMIT. See LICENSE.