ffdash
A terminal UI for batch VP9 video encoding with hardware acceleration, real-time progress monitoring, and full control over quality settings. Made to work as a viable encoding dashboard over SSH.
https://github.com/user-attachments/assets/f7551d5f-fe6c-4a13-81e2-92a5e2bb42c2
Why ffdash?
- Batch processing - Encode entire directories of video files with a single command
- Hardware acceleration - VA-API (Intel/AMD) and NVENC (NVIDIA) support for 3-10x faster encoding
- Live dashboard - Real-time ETA, throughput, queue progress, and system stats
- Full tunability - Rate control modes, quality presets, filters, GOP settings, audio options
- Keyboard-first - Fast navigation, built-in help (
H), SSH-friendly, TUI mouse support - Dry-run preview - See exact FFmpeg commands before committing to an encode
Why VP9?
VP9 delivers 20-50% smaller files than H.264 at equivalent quality. It's open-source, royalty-free, and natively supported by YouTube, all modern browsers, and media servers like Plex and Jellyfin. Will support for AV1 in the future.
Prerequisites
Required
Rust 1.85+ (edition 2024):
|
FFmpeg with VP9 support (tested with v8.0):
# Ubuntu/Debian
&&
# macOS
Or install both automatically:
Optional (Hardware Encoding)
| Platform | Requirements |
|---|---|
| Intel VA-API | Linux, /dev/dri device mapped, Intel HD 5000+ or Arc GPU |
| AMD VA-API | Linux, /dev/dri device mapped, Mesa VAAPI drivers |
| NVIDIA NVENC | Linux, CUDA drivers, GTX 600+ or newer |
Verify hardware support:
|
Installation
Build from source
Verify installation
Quick Start
Basic usage
# Launch TUI and scan current directory
# Launch TUI and scan a specific directory
# Preview FFmpeg commands without encoding (dry run)
# this will use the config that is loaded on app startup
TUI navigation
| Key | Action |
|---|---|
S |
Start encoding |
SPACE |
Mark pending / skipped |
C |
Open config |
H |
Show help |
T |
Toggle stats view |
R |
Rescan directory |
Q |
Quit (progress is saved) |
↑↓ / Tab |
Navigate |
Configuration
Generate a config file to customize defaults:
# Creates ~/.config/ffdash/config.toml
Example configuration:
[]
= false # Wait for manual start
= true # Scan directory on launch
[]
= "vp9-good" # Default encoding profile
= 1 # Concurrent encode jobs
See CONFIG.md for all options.
Command Reference
TUI Mode (default)
)
)
Utility Commands
|
Docker
Build the image (requires local binary first):
Run with Intel/AMD VA-API
Run with NVIDIA NVENC
SSH access (optional)
Add -p 2223:22 -e SSH_PASSWORD=yourpassword to enable SSH into the container.
FAQ
How do I verify hardware encoding is active?
# Look for: -c:v vp9_vaapi (Intel/AMD) or -c:v vp9_nvenc (NVIDIA)
# If you see: -c:v libvpx-vp9 → software encoding is being used
What quality settings should I use?
- CQ (Constant Quality): Start with CQ 28-32 for good balance
- VBR: 2-4 Mbps for 1080p, 6-10 Mbps for 4K
- Hardware encoding: Start with quality 100-140 and adjust lower for better quality (lower = better)
Can I pause and resume encoding?
Yes. Press Q to quit - progress is saved to .enc_state in each directory. Run ffdash again to resume where you left off.
Note: if FFmpeg is still encoding, it will finish in the background and exit.
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.
How much faster is hardware encoding?
Typically 3-10x faster than software encoding. Quality may be slightly lower at equivalent bitrates, so consider increasing bitrate by ~20% when using hardware encoding.
Getting errors on 5+ channel audio Likely need to increase the audio bitrate, or force downmixing into stereo.
The TUI looks broken over SSH
Ensure your terminal supports 256 colors and your TERM variable is set correctly:
Troubleshooting
| 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 | Increase workers in config, or enable hardware encoding |
Validate FFmpeg capabilities:
Features
- TUI batch pipeline (scan, queue, pause/skip, ETA/speed, resume via .enc_state)
- Allows tuning of almost every single VP9 parameter in TUI
- 'Dry run' (outputs FFMPEG command to be run)
- Custom output patterns and containers ({basename}/{filename}/{profile}/{ext}, overwrite/skip)
- SSH / Tmux capable
- Auto‑VMAF calibration (window sampling, target VMAF, fps/scale‑aligned)
- Multi‑encoder support
- AV1 Software / VAAPI
- NVENC VP9 & AV1
- Codec auto-select
- Robust queue invalidation when config/filename pattern changes
- Full‑file VMAF verification option (post‑encode target/tolerance), auto delete option
- Media fix‑ups (deinterlace, colorspace conversions, loudness/EBU R128 normalization)
Known Limitations
- Hardware encoding (VA-API/NVENC) requires Linux; macOS uses software encoding only
- AMD VA-API support depends on Mesa driver version and GPU generation
- NVENC behavior varies by driver version and GPU architecture
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Run
make check-uiandcargo testbefore submitting - Open a pull request
License
MIT. See LICENSE.