Recode
GPU-accelerated H.265/H.264 re-encoding for Plex media libraries with Dolby Vision support.
Features
Encoding
- GPU Encoding — NVIDIA NVENC, AMD VAAPI/AMF, Intel QSV/VAAPI hardware acceleration (10-50x faster than realtime)
- CPU Encoding — libx265 software encoding when no GPU is available
- H.265 & H.264 — Encode to H.265 or H.264 with configurable quality
- Presets — Auto, Film, Animation, Grain, Custom with per-preset CQ/bitrate/speed
- Constant Quality (CQ) — Configurable quality level with max bitrate cap
- Resolution Scaling — Downscale 4K to 1080p, 1440p, 720p, or keep original
- Test Mode — Encode only the first 5 minutes for quick quality checks (originals never deleted)
HDR & Dolby Vision
- HDR10 — Passthrough and metadata preservation
- HLG — Hybrid Log-Gamma support
- Dolby Vision — DV Profile 5, 7, 8 support with skip, keep, HDR10, and P8.4 modes
- DV P5 → P8.4 — Vulkan/libplacebo color conversion (IPTPQc2 → BT.2020) + RPU injection
- DV Keep Original — Re-encode while preserving DV metadata untouched
- HDR to DV Upgrade — Convert HDR10 content to Dolby Vision P8.4
- dovi_tool Integration — Automatic RPU extraction, conversion, and injection
- Remote DV Support — DV P8.4 post-processing works on both local and remote GPU encodes
Audio
- Codec Options — Passthrough, Opus, AAC, AC3, EAC3
- Per-Stream Control — Configure codec and bitrate for each audio track individually
- Language Filter — Keep all or selected languages (comma-separated codes)
- Audio Type Filter — All tracks, TrueHD/Atmos, EAC3, AC3, stereo, surround
- Bitrate Control — Configurable per-codec bitrate (64k-640k)
Subtitles
- Per-Stream Control — Include/exclude individual subtitle tracks
- Language Filter — Keep all, keep selected languages, or discard all subtitles
- Profile Support — Subtitle settings in default profile and per-library profiles
Multi-GPU
- Auto Detection — Automatically detects NVIDIA, AMD, and Intel GPUs with live capability probing
- Auto Load-Balance — Distributes across all local GPUs and remote servers equally
- Per-GPU Max Jobs — configurable max concurrent encodes per GPU, auto-calculated from VRAM
- VRAM-Aware Assignment — GPUs with ≤2GB VRAM excluded from 4K jobs (prevents CUDA OOM)
- Idle GPU Utilization — Jobs can use idle GPUs even when max concurrent limit is reached
- GPU Selection — Auto, All Local, All Remote, specific GPU, or specific server
- OOM Recovery — Automatic re-queue on GPU out-of-memory (up to 3 retries)
- Auto-Disable — Remote GPUs automatically disabled after 3 consecutive failures
Remote GPU (RRP)
- Reverse-Connect — GPU servers connect OUT to clients, NAT-friendly (no port forwarding on GPU side)
- FUSE Mount — Stream input files on-demand with 256KB chunks (~40% faster LAN streaming)
- Multi-Platform — Linux (NVENC, QSV, VAAPI, AMF) and macOS (VideoToolbox) GPU servers
- Hardware Probing — Tests actual GPU encoder capabilities, auto-strips unsupported flags (e.g. temporal-aq on Maxwell)
- H.264/H.265 Badges — Connected GPUs show verified encoder capabilities
- HMAC-SHA256 Auth — Secure authentication with shared secret and heartbeat monitoring
- SHA256 Verification — Output file integrity check
- CUDA Hwaccel — Hardware decode on NVIDIA remote GPUs
- VideoToolbox — Apple Silicon hardware encoding on macOS (H.265/H.264)
- Live Progress — Real-time encoding progress with estimated speed and bitrate
- Cancel Propagation — Cancelling kills ffmpeg on remote, lazy FUSE unmount, temp cleanup
- Auto Cleanup — FUSE unmount + temp files removed on cancel, failure, or disconnect
- Load Balancing — Distribute jobs across GPU servers by name with per-GPU max_jobs
- GPU Name Targeting — Select specific GPUs by name (stable across reconnects)
- Per-GPU Controls — Power button with spinner, connection error tooltips, enable/disable
- Auto-Reconnect — GPU servers reconnect with exponential backoff on disconnect
- Single Binary —
recode-remotehandles server, client, listener, and connect
Plex Integration
- Library Scanner — Scan Plex libraries and detect candidates for re-encoding
- Webhook Auto-Encode — New media added to Plex is automatically queued
- Post-Encode Rescan — Plex library refreshed after each encode completes
- Token Auto-Detection — Finds Plex token from Preferences.xml
- Library Profiles — Different encode settings per Plex library
Queue & History
- Drag & Drop — Reorder queue items by dragging
- Concurrent Encodes — Run multiple encodes simultaneously
- Pause / Resume — Pause individual encodes (SIGSTOP/SIGCONT)
- Search & Filter — Search by name, filter by codec, HDR type, status
- Pagination — Configurable page size for queue, history, and scan results
- Unlimited History — Full encode history with detailed logs
- Retry Failed — One-click retry for failed or cancelled jobs
- Discard Larger — Automatically discard encodes that are larger than the original
- Skip Tagging — Discarded files tagged with RECODE_SKIPPED metadata, excluded from future scans
- Delete Safety — Never deletes original if encoded file is less than 5% of original size
- DV Fallback — RPU extraction failure falls back to HDR10 instead of failing the job
Automation
- Folder Watch — Monitor directories for new files and auto-queue
- Scheduled Encoding — Set active hours (e.g., encode overnight only)
- Auto-Start Queue — Queue starts automatically when jobs are added
- Library Profiles — Per-library settings for codec, quality, resolution, audio
Web Interface
- Real-Time Progress — Live encoding stats via WebSocket with interpolated progress between updates
- Smooth Progress — Preparing phase, decimal percentages, frame-based fallback, 1-second interpolation
- System Monitoring — CPU, RAM, GPU utilization, temperature, VRAM in header
- GPU Graphs — Per-GPU utilization, VRAM, and temperature charts with VRAM capability labels
- Dark / Light Theme — Toggle with header icon or in Settings
- Mobile Responsive — Adapts to desktop, tablet, and mobile screens
- Settings Modal — All settings in one place, save without closing, unsaved indicator
- System Transcodes — View all ffmpeg/Plex processes, remote GPU jobs on servers
- System Logs — Live log viewer with Server, ffmpeg, Listener, and Connector tabs
- Stats Charts — Daily encode count and space saved bar charts (last 30 days)
- Find Duplicates — Detect original + encoded file pairs
- Space Savings — Total potential savings for scanned libraries
- Scan Cache — Instant re-scans with local metadata cache
- Stats Tab — Aggregate stats: files encoded, space saved, compression ratio
Security
- Login Page — Username/password authentication with session cookies
- Default Credentials — admin/admin with forced password change on first login
- SSL/TLS — Auto-generated self-signed certificate, custom cert upload, or Let’s Encrypt
- Let’s Encrypt — One-click free trusted SSL via certbot with HTTP (port 80) or DNS (TXT record) verification
- SSL Toggle — Enable/disable HTTPS from settings with inline restart confirmation
- Root Password — Let’s Encrypt uses root password entered in the browser, never saved
- API Keys — Bearer token authentication for programmatic access
Updates & Deployment
- Python + venv — Runs directly from Python with automatic venv setup
- Auto-Updates — Daily GitHub check, one-click update with backup and live log
- Setup Wizard — System detection, GPU config, Plex integration, GPU Server Mode
- Bundled Tools — ffmpeg, ffprobe, recode-remote, dovi_tool, mediainfo, mkvmerge
- Multi-Distro — Ubuntu, Debian, Fedora, RHEL, Alma, Rocky, openSUSE, SLES, Arch, Manjaro
- Per-Distro NVIDIA — Separate driver install handlers per distribution
- Systemd Service — Auto-start on boot with restart watcher
- FUSE Auto-Setup — Installer installs fuse3 and configures fuse.conf
Quick Install
wget -qO- https://github.com/tarquin-code/recode/releases/latest/download/recode.tar.gz | tar xz && cd recode && sudo bash install.sh
Then open http://your-server:9877 in a browser.
Requirements
Linux (Full Application)
- GPU (NVIDIA, AMD, or Intel) with drivers — auto-detected, CPU-only mode available
- Linux (RHEL/Debian/Arch-based distros)
- Python 3.9+ — installer sets up a virtualenv automatically
macOS (GPU Server Only)
- macOS 11+ on Apple Silicon (M1/M2/M3/M4)
- macFUSE —
brew install macfuse(required for FUSE mount mode) - Uses VideoToolbox hardware encoder for H.265/H.264
Bundled Tools (no manual install needed)
Linux:
recode_server.py— Main application (Python, runs in auto-created venv)ffmpeg/ffprobe— Jellyfin static build with NVENC, QSV, VAAPI, libx265recode-remote— RRP remote GPU encoding (server + client + ping)dovi_tool— Dolby Vision metadata conversionmkvmerge/mkvextract— MKV muxing for DV encodesmediainfo— Detailed media analysis
macOS (separate DMG download):
Recode GPU Server.app— Native macOS app with tray icon, settings UI, and auto-cleanup- Includes
recode-remote,ffmpeg,ffprobe(ARM64, VideoToolbox)
Remote GPU Encoding
Recode includes RRP (Recode Remote Protocol) for offloading encodes to remote GPU servers. Supports both Linux (NVENC) and macOS (VideoToolbox) servers.
Linux GPU Server Setup
- Install Recode on the GPU server (same installer)
- Enable GPU Server Mode in Settings → Remote GPU, set a port and shared secret
- Add Remote Servers on the client in Settings → Remote GPU
- Select “Remote” targets in the GPU Target dropdown
macOS GPU Server Setup
- Install macFUSE — approve the kernel extension in System Settings → Privacy & Security, then reboot
- Download
Recode-GPU-Server.dmgfrom the latest release - Open the DMG and drag Recode GPU Server to Applications
- Launch the app, enter your Recode server address and secret in Settings, click Start
The app handles everything — VideoToolbox encoding, FUSE streaming, tray icon with live progress, and auto-cleanup. No command line needed.
How It Works
The remote server mounts input files on-demand via FUSE — encoding starts immediately without uploading. Only the bytes ffmpeg reads are transferred. Output is returned with SHA256 verification.
Firewall
Open the RRP port (default 9878) on the GPU server:
# Linux: firewalld (RHEL/Fedora/Rocky/Alma)
firewall-cmd --permanent --add-port=9878/tcp && firewall-cmd --reload
# Linux: ufw (Ubuntu/Debian)
ufw allow 9878/tcp
# macOS
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add ~/recode/recode-remote --unblockapp ~/recode/recode-remote
Configuration
On first launch, a setup wizard guides you through:
- System capability detection (GPU, ffmpeg features, tools)
- GPU configuration and concurrency limits
- Plex integration (auto-detects token)
- Default encoding settings
- Queue behavior
- GPU Server Mode (optional)
All settings are configurable via the web UI at any time.
Plex Webhook
Auto-encode new media added to Plex:
- Plex → Settings → Webhooks
- Add:
http://your-server:9876/api/plex-webhook(HTTP webhook port, works with SSL enabled) - New media is automatically queued using library profiles
Service Management
systemctl start recode # Start
systemctl stop recode # Stop
systemctl restart recode # Restart
systemctl status recode # Status
journalctl -u recode -f # Live logs
License
Copyright (C) 2026 Tarquin Douglass
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
See LICENSE for the full text.
Third-Party
This software uses: ffmpeg (LGPL/GPL), dovi_tool (MIT), mkvtoolnix (GPL), NVIDIA NVENC (proprietary). Dolby, Dolby Vision, and Dolby Digital are trademarks of Dolby Laboratories. Plex is a trademark of Plex, Inc.