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

TarquinDouglass
Sun, 15 Mar 2026 17:52:25 +0000
Apps & Creations

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-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)

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, 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.

1 post - 1 participant