Plex Re-Encoder — Free GPU-Accelerated HEVC Batch Encoder with Dolby Vision Support

Recode

GPU-accelerated H.265/H.264 re-encoding for Plex media libraries with Dolby Vision support.

Version License Python

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 Binaryrecode-remote handles 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)
  • macFUSEbrew 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, libx265
  • recode-remote — RRP remote GPU encoding (server + client + ping)
  • dovi_tool — Dolby Vision metadata conversion
  • mkvmerge / mkvextract — MKV muxing for DV encodes
  • mediainfo — 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

  1. Install Recode on the GPU server (same installer)
  2. Enable GPU Server Mode in Settings → Remote GPU, set a port and shared secret
  3. Add Remote Servers on the client in Settings → Remote GPU
  4. Select “Remote” targets in the GPU Target dropdown

macOS GPU Server Setup

  1. Install macFUSE — approve the kernel extension in System Settings → Privacy & Security, then reboot
  2. Download Recode-GPU-Server.dmg from the latest release
  3. Open the DMG and drag Recode GPU Server to Applications
  4. 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:

  1. System capability detection (GPU, ffmpeg features, tools)
  2. GPU configuration and concurrency limits
  3. Plex integration (auto-detects token)
  4. Default encoding settings
  5. Queue behavior
  6. GPU Server Mode (optional)

All settings are configurable via the web UI at any time.

Plex Webhook

Auto-encode new media added to Plex:

  1. Plex → Settings → Webhooks
  2. Add: http://your-server:9876/api/plex-webhook (HTTP webhook port, works with SSL enabled)
  3. 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.