4 releases (2 stable)
| 5.1.1 | Apr 14, 2026 |
|---|---|
| 5.0.0 | Mar 24, 2026 |
| 0.6.0 | Mar 24, 2026 |
| 0.2.1 | Mar 7, 2026 |
#174 in Video
155KB
3K
SLoC
GPU-accelerated media transcoding that I could figure out.
Features • Install • Usage • Config • License
Why?
I spent an entire evening trying to get Tdarr working. Nodes, servers, web UIs, plugins, databases... I just wanted to convert my media library to h265. So I wrote tdorr instead.
tdorr is a single binary. Point it at a directory. It finds video files, skips the ones that are already fine, and GPU-transcodes the rest to h265. That's it.
Features
- GPU-accelerated h265 encoding — NVIDIA NVENC, Intel VAAPI, and Apple VideoToolbox
- Smart detection — skips files already in h265 at or below your target resolution/bitrate
- Safe by default — creates
.transcoded.mkvcopies; never touches originals unless you pass--overwrite - Disc image support — extracts and transcodes media from
.isoand.imgfiles via isomage - YAML config — sensible defaults, fully overridable
- Output validation — verifies transcoded files via ffprobe before finalizing (duration, codec, file size checks)
- Fast — 14x realtime on an RTX 2060 for 720p content
Install
Homebrew (macOS)
brew install JackDanger/tap/tdorr
Cargo (any platform)
cargo install tdorr
AUR (Arch Linux)
yay -S tdorr
Pre-built binaries
Download from GitHub Releases for:
- Linux x86_64 / aarch64
- macOS x86_64 (Intel) / aarch64 (Apple Silicon)
From source
git clone https://github.com/JackDanger/tdorr.git
cd tdorr
make build
# ./tdorr is now symlinked to the release binary
Requirements
ffmpegwith a GPU encoder (hevc_nvenc,hevc_vaapi, orhevc_videotoolbox)- For
.iso/.imgsupport: isomage
Usage
# Dry run - see what would be transcoded
./tdorr --dry-run --config config.yaml /mnt/media/movies
# Transcode (creates copies alongside originals)
./tdorr --config config.yaml /mnt/media/movies
# Transcode to a separate output directory
./tdorr --config config.yaml --output-dir /mnt/transcoded /mnt/media/movies
# Overwrite originals in-place
./tdorr --overwrite --config config.yaml /mnt/media/movies
What happens
$ ./tdorr --config config.yaml /mnt/media/movies
GPU detected: NVIDIA GeForce RTX 2060 (encoder: hevc_nvenc)
Found 8 media files in "/mnt/media/movies"
Transcoding: "Some Dumb Marvel Nonsense/TropeGuy versus GI-Robocop.mkv" (h264, 1280x720, 825 kbps)
-> "/mnt/media/movies/Some Dumb Marvel Nonsense/TropeGuy versus GI-Robocop.mkv"
...
Done: 8 transcoded, 0 skipped, 0 errors (of 8 total)
Run it again and everything gets skipped:
Found 8 media files in "/mnt/media/dumb-tv"
Done: 0 transcoded, 8 skipped, 0 errors (of 8 total)
Config
Ships with a default-okay config.yaml, which you can edit:
target:
codec: hevc
quality: 28 # CQ value (lower = better quality, bigger file)
preset: slow # NVENC: p7, VAAPI: mapped automatically
max_width: 3840 # 4K max
max_height: 2160
max_bitrate_kbps: 0 # 0 = no limit (CQ decides)
container: mkv
audio_codec: copy # Don't re-encode audio
subtitle_codec: copy
media_extensions:
- mkv
- mp4
- avi
- ts
- m2ts
- iso
- img
GPU Requirements
tdorr requires a GPU for encoding and will exit with a clear error if none is found:
| GPU | Encoder | Platform | How it's detected |
|---|---|---|---|
| NVIDIA (Kepler+) | hevc_nvenc |
Linux | nvidia-smi + ffmpeg encoder check |
| Intel (Broadwell+) | hevc_vaapi |
Linux | /dev/dri/renderD128 + ffmpeg encoder check |
| Apple Silicon / Intel Mac | hevc_videotoolbox |
macOS | OS detection + ffmpeg encoder check |
No GPU? No encoding. This is intentional — CPU h265 encoding is painfully slow and not what tdorr is for.
License
MIT © Jack Danger
Dependencies
~5.5–9MB
~170K SLoC