A web interface for HandBrake CLI — upload a video, pick a preset, encode it, and download the result. Built with Bun and plain HTML/CSS/JS. No frameworks, no build step.
-
Bun — JavaScript runtime
curl -fsSL https://bun.sh/install | bash -
HandBrake CLI — video encoder
- macOS:
brew install handbrakeorbrew install --cask handbrake(the CLI is included) - Ubuntu/Debian:
sudo apt install handbrake-cli - Fedora:
sudo dnf install HandBrake-cli - Windows: download from handbrake.fr and add to PATH
Verify it's installed:
HandBrakeCLI --version
- macOS:
git clone https://github.com/sonigeez/handbrake-webui.git
cd handbrake-webui
bun installbun startbun run build
./handbrake-webThis compiles everything into a single standalone binary — faster startup, no Bun runtime needed on the target machine. Only HandBrakeCLI must be in PATH.
Open http://localhost:9550 in your browser.
- Drop a video file (or click to browse)
- Pick a preset from the dropdown
- Click Encode
- Watch the progress bar
- Click Download when done
Both the uploaded original and encoded output are automatically deleted after download.
| Method | Path | Description |
|---|---|---|
GET |
/ |
Web UI |
GET |
/api/presets |
List available HandBrake presets |
POST |
/api/upload |
Upload a video and start encoding (multipart form: file + preset) |
GET |
/api/status/:id |
Poll encoding progress |
GET |
/api/download/:id |
Download encoded file (auto-cleans up after) |
- Single file server (
index.ts) usingBun.serve - Parses presets from
HandBrakeCLI --preset-listat startup - Spawns
HandBrakeCLIas a child process per job - Parses stdout in real-time for encoding progress and ETA
- Supports multiple concurrent encodes
- Temporary files stored in
uploads/andoutputs/(gitignored)