Tdarr Media Transcoding
Tdarr distributed transcoding system for media libraries.
Overview
Tdarr is a distributed media transcoding system designed to automate the optimization of video libraries across multiple nodes. The tdarr-server component acts as the central orchestrator, managing transcoding jobs, monitoring media libraries, and providing a web-based interface for configuration and monitoring. It coordinates with worker nodes to distribute processing loads and maintains a database of transcoding operations and media file metadata. The tdarr-node components serve as distributed workers that execute the actual transcoding operations using tools like FFmpeg and HandBrake. This architecture allows media libraries to be processed efficiently across multiple machines, whether they're running on the same host or distributed across a network. The server component scans media directories, applies user-defined rules and plugins, and queues files for transcoding based on criteria like codec, resolution, or file size. This distributed transcoding setup is ideal for homelab enthusiasts, content creators, and media server administrators who need to optimize large video collections for storage efficiency or compatibility across different devices. The combination of centralized management with distributed processing power makes it possible to tackle massive transcoding jobs that would overwhelm a single machine, while the plugin system allows for highly customized transcoding workflows tailored to specific media requirements.
Key Features
- Distributed transcoding architecture with centralized job management and multiple worker nodes
- Plugin-based transcoding system with pre-built and custom workflow options
- Real-time media library scanning with automatic file detection and metadata extraction
- Web-based dashboard showing transcoding progress, queue status, and system statistics
- Hardware acceleration support for GPU-based transcoding using NVENC, QuickSync, and VAAPI
- Conditional transcoding rules based on file properties like codec, bitrate, resolution, and age
- Built-in support for popular transcoding engines including FFmpeg and HandBrake
- Health checking system that validates transcoded files and rolls back failed operations
Common Use Cases
- 1Home media server optimization to reduce Plex or Jellyfin storage requirements
- 2Content preparation for streaming services requiring specific codec and resolution standards
- 3Legacy video archive modernization to convert old formats to contemporary codecs
- 4Multi-location media processing across home lab environments with distributed compute resources
- 5Automated video optimization for mobile device compatibility and bandwidth constraints
- 6Batch processing of recorded TV content to remove commercials and optimize file sizes
- 7Professional media workflow automation for content creators managing large video libraries
Prerequisites
- Minimum 4GB RAM per transcoding node, with 8GB recommended for 4K content processing
- Sufficient storage space for transcoding cache, typically 2-3x the size of largest video files
- Available ports 8265 (web UI) and 8266 (server communication) not conflicting with other services
- Understanding of video codecs, containers, and transcoding concepts for effective plugin configuration
- Fast storage or SSD recommended for temporary transcoding files to avoid I/O bottlenecks
- Basic knowledge of FFmpeg parameters and video encoding settings for custom workflows
For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms
docker-compose.yml
docker-compose.yml
1services: 2 tdarr: 3 image: ghcr.io/haveagitgat/tdarr:latest4 container_name: tdarr5 environment: 6 - PUID=10007 - PGID=10008 - TZ=${TZ}9 - serverIP=0.0.0.010 - serverPort=826611 - webUIPort=826512 - internalNode=true13 - inContainer=true14 volumes: 15 - tdarr_server:/app/server16 - tdarr_configs:/app/configs17 - tdarr_logs:/app/logs18 - /path/to/media:/media19 - /path/to/transcode_cache:/temp20 ports: 21 - "8265:8265"22 - "8266:8266"23 networks: 24 - tdarr-network2526 tdarr-node: 27 image: ghcr.io/haveagitgat/tdarr_node:latest28 container_name: tdarr-node29 environment: 30 - PUID=100031 - PGID=100032 - TZ=${TZ}33 - serverIP=tdarr34 - serverPort=826635 - inContainer=true36 volumes: 37 - tdarr_configs:/app/configs38 - tdarr_logs:/app/logs39 - /path/to/media:/media40 - /path/to/transcode_cache:/temp41 networks: 42 - tdarr-network4344volumes: 45 tdarr_server: 46 tdarr_configs: 47 tdarr_logs: 4849networks: 50 tdarr-network: 51 driver: bridge.env Template
.env
1# Tdarr2TZ=UTCUsage Notes
- 1Web UI at http://localhost:8265
- 2Add libraries and configure
- 3Create processing plugins
- 4Scale with additional nodes
- 5GPU transcoding supported
Individual Services(2 services)
Copy individual services to mix and match with your existing compose files.
tdarr
tdarr:
image: ghcr.io/haveagitgat/tdarr:latest
container_name: tdarr
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
- serverIP=0.0.0.0
- serverPort=8266
- webUIPort=8265
- internalNode=true
- inContainer=true
volumes:
- tdarr_server:/app/server
- tdarr_configs:/app/configs
- tdarr_logs:/app/logs
- /path/to/media:/media
- /path/to/transcode_cache:/temp
ports:
- "8265:8265"
- "8266:8266"
networks:
- tdarr-network
tdarr-node
tdarr-node:
image: ghcr.io/haveagitgat/tdarr_node:latest
container_name: tdarr-node
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ}
- serverIP=tdarr
- serverPort=8266
- inContainer=true
volumes:
- tdarr_configs:/app/configs
- tdarr_logs:/app/logs
- /path/to/media:/media
- /path/to/transcode_cache:/temp
networks:
- tdarr-network
Quick Start
terminal
1# 1. Create the compose file2cat > docker-compose.yml << 'EOF'3services:4 tdarr:5 image: ghcr.io/haveagitgat/tdarr:latest6 container_name: tdarr7 environment:8 - PUID=10009 - PGID=100010 - TZ=${TZ}11 - serverIP=0.0.0.012 - serverPort=826613 - webUIPort=826514 - internalNode=true15 - inContainer=true16 volumes:17 - tdarr_server:/app/server18 - tdarr_configs:/app/configs19 - tdarr_logs:/app/logs20 - /path/to/media:/media21 - /path/to/transcode_cache:/temp22 ports:23 - "8265:8265"24 - "8266:8266"25 networks:26 - tdarr-network2728 tdarr-node:29 image: ghcr.io/haveagitgat/tdarr_node:latest30 container_name: tdarr-node31 environment:32 - PUID=100033 - PGID=100034 - TZ=${TZ}35 - serverIP=tdarr36 - serverPort=826637 - inContainer=true38 volumes:39 - tdarr_configs:/app/configs40 - tdarr_logs:/app/logs41 - /path/to/media:/media42 - /path/to/transcode_cache:/temp43 networks:44 - tdarr-network4546volumes:47 tdarr_server:48 tdarr_configs:49 tdarr_logs:5051networks:52 tdarr-network:53 driver: bridge54EOF5556# 2. Create the .env file57cat > .env << 'EOF'58# Tdarr59TZ=UTC60EOF6162# 3. Start the services63docker compose up -d6465# 4. View logs66docker compose logs -fOne-Liner
Run this command to download and set up the recipe in one step:
terminal
1curl -fsSL https://docker.recipes/api/recipes/tdarr-transcode/run | bashTroubleshooting
- Node shows as offline in web UI: Verify serverIP environment variable matches tdarr service name and network connectivity between containers
- Transcoding jobs fail with 'file not found' errors: Ensure media volume mounts are identical between tdarr-server and tdarr-node containers
- High memory usage during transcoding: Reduce concurrent transcoding jobs in node settings or increase available RAM allocation
- GPU transcoding not working: Install nvidia-docker runtime and add device mappings for GPU access to transcoding nodes
- Files stuck in processing queue: Check transcoding cache volume has sufficient free space and proper write permissions
- Web UI shows 'server connection lost': Verify tdarr-server container is running and port 8266 is accessible within the docker network
Community Notes
Loading...
Loading notes...
Download Recipe Kit
Get all files in a ready-to-deploy package
Includes docker-compose.yml, .env template, README, and license
Components
tdarr-servertdarr-node
Tags
#tdarr#transcoding#ffmpeg#handbrake#media
Category
Media & EntertainmentAd Space
Shortcuts: C CopyF FavoriteD Download