Transcode Talker scans your media library, queues oversized files, re-encodes them to HEVC with hardware acceleration, and gives you back tens of gigabytes, without you ever opening HandBrake again.
Designed for a single goal: shrink your library without losing quality, and never run the same conversion twice.
VAAPI (AMD/Intel), QSV (Intel), or NVENC (NVIDIA). Automatically falls back to libx265 CPU when no GPU is mounted.
Walk any number of folders, filter by minimum size, and queue only files that aren't already HEVC.
Every encode is recorded with hash, FPS, encoder used, CRF, and space saved. Export/import as JSON.
Postgres is the production default; SQLite stays for single-user setups. Switch with one env var.
Real-time fps, ETA, current frame, and a streaming ffmpeg log. Survives API restarts via exponential backoff.
Ring-buffered HTTP and business events with SSE streaming. Parses IP, method, path, and status inline.
English, Português, Español, Français, 中文, 日本語. The in-app manual ships in six languages.
Point at /mnt/media (or anywhere). Filter by size threshold. Files already in HEVC are skipped automatically.
Worker pulls jobs from Postgres, runs ffmpeg with your chosen encoder/preset/CRF, and streams live progress over WebSocket.
Original is replaced atomically; hash and metrics get persisted to history. You watch your free space go up.
Six screens, each doing one thing well. No tabs-in-tabs, no buried settings, no five-second polling loops.
| File | Size | Codec | ||
|---|---|---|---|---|
| Movies/Inception.mkv | 4.2 GB | x264 | ||
| Animes/Baka and Test S00E09.mkv | 1.2 GB | x264 | ||
| Shows/Office S03E18.mkv | 2.8 GB | x264 | ||
| Movies/Interstellar.mkv | 8.1 GB | x264 | ||
| Animes/Bleach S01E20.mkv | 980 MB | x264 |
[22:48:34] ffmpeg -hwaccel vaapi -i input.mkv ...
[22:48:35] vaapi: AMD Renoir initialized (renderD128)
[22:48:36] frame= 2508 fps=334 q=-0.0 size= 142336kB time=00:01:44.65
[22:48:37] frame= 2841 fps=334 q=-0.0 size= 158204kB time=00:01:58.51
[22:48:38] frame= 3175 fps=334 q=-0.0 size= 175020kB time=00:02:12.36
| Filename | Original | Final | Saved | Encoder | Status |
|---|---|---|---|---|---|
| Baka and Test S00E09.mkv | 1.18 GB | .. | .. | vaapi | interrupted |
| Movie Inception.mkv | 8.13 GB | 5.21 GB | 2.92 GB | vaapi | completed |
| Office S03E18.mkv | 2.81 GB | 1.87 GB | 0.94 GB | vaapi | completed |
| Anime E04.mkv | 1.49 GB | 0.86 GB | 0.63 GB | vaapi | completed |
| Bleach S01E20.mkv | 0.98 GB | 0.57 GB | 0.41 GB | vaapi | completed |
Each service does one job. Talk over the docker network; the host only sees port 4246.
nginx:1.27-alpine
Serves the Vite SPA bundle and reverse-proxies /api/* and /ws to the API.
FastAPI · Python 3.12
REST + WebSocket + SSE. Owns scans, queue mutations, history, config, and the live event bus.
4246/tcp internalFFmpeg · Python 3.12
Pulls jobs from Postgres, spawns ffmpeg with hardware accel, streams progress. 8 CPU / 8 GB cap.
no public portpostgres:16-alpine
Metastore for sessions, jobs, history, scan results. Switch to SQLite with DB_BACKEND=sqlite.
Compose ships sane defaults, no .env required for a local boot. Postgres is the production default; SQLite stays one env var away.
/dev/dri mapped for VAAPI/QSV acceleration# 1. Clone & enter
git clone https://github.com/<you>/reencoder-v3.git
cd reencoder-v3
# 2. Build & up (4 containers)
docker compose build
docker compose up -d
# 3. Verify
docker compose ps
NAME STATUS PORTS
reencoder-postgres Up (healthy) 5432/tcp
reencoder-api Up (healthy) 4246/tcp
reencoder-worker Up (healthy)
reencoder-web Up (healthy) 0.0.0.0:4246->80/tcp
# 4. Open the UI
open http://localhost:4246
tail -f