Sonarr/Radarr media converter and management
10K+
A self-hosted media maintenance tool that automatically converts, cleans, and optimizes your Plex/Jellyfin library — triggered by Sonarr and Radarr webhooks or kicked off manually from the built-in web UI.
When new content is imported, remuXcode receives a webhook, analyzes the file, and runs whichever conversions are needed: DTS/DTS-HD audio gets converted to AC3/EAC3/AAC for broad device compatibility, 10-bit H.264 (or legacy codecs like VC-1 and MPEG-2) gets re-encoded to HEVC or AV1, and foreign-language audio and subtitle tracks get stripped out. All of this runs in the background with no manual intervention.
The web UI lets you browse your entire Sonarr/Radarr library — movies and shows — with poster grids, episode tables, filters, and per-file analysis. Queue individual files, full series, or bulk selections, and monitor everything from the Jobs page.
Project: https://github.com/sirjmann92/remuXcode
See docs/ for the full feature reference.
Dashboard - live job progress with poster art, phase badges, and ETA
Movies — Radarr library browse with poster grid, filters, and batch queue
Shows — Sonarr series and episode browser with per-file actions
Jobs — full job history with per-job log viewer and stream details
Settings — encoding, audio, cleanup, and integration config
Integrations — Sonarr and Radarr connection status
1. Create compose.yml
services:
remuxcode:
container_name: remuxcode
image: ghcr.io/sirjmann92/remuxcode:latest
ports:
- "7889:7889"
volumes:
- ./config:/app/config # config.yaml, jobs.db, API key
- ./logs:/app/logs
- /mnt/yournas:/share:rw # match the path Sonarr/Radarr use internally
devices:
- /dev/dri:/dev/dri # optional — Intel QSV/VAAPI GPU passthrough
environment:
- TZ=America/Chicago
restart: unless-stopped
Mount your media at the same path Sonarr/Radarr use inside their containers so webhook file paths need no translation. Add additional volume mounts if your library spans multiple shares.
2. Start
docker compose up -d
config/config.yaml is created automatically on first run with sensible defaults. Open http://localhost:7889/config to configure your encoding, audio, and cleanup settings.
To connect Sonarr and Radarr, edit config/config.yaml and add your URLs and API keys (see Integrations).
Your API key is auto-generated on first start and stored in config/.api_key. It's also shown on the Settings page.
git clone https://github.com/sirjmann92/remuXcode.git
cd remuXcode
Create a compose.yml as above, but replace image: ghcr.io/... with:
build: .
Then:
docker compose up -d --build
Configure Sonarr and Radarr to prefer remux releases — full lossless Blu-ray remuxes with no re-encoding. A remux retains the original video bitrate and lossless audio (DTS-HD MA, TrueHD), giving remuXcode the best possible source to work from.
Re-encoding an already-compressed video introduces generation loss: the encoder makes a second round of approximations on top of the first, compounding artifacts that cannot be undone. Starting from a remux means any re-encoding remuXcode does happens exactly once, from a lossless source.
See docs/integrations.md for suggested quality profile tips and full setup instructions.
Settings → Connect → Add → Webhook:
| Field | Value |
|---|---|
| URL | http://<host>:7889/api/webhook |
| Method | POST |
| Triggers | On Import Complete (recommended) |
| Headers | X-API-Key: <your key> |
On Import Complete fires once after a full batch import (e.g. a whole season), delivering all file paths in a single payload — more efficient than per-episode triggers. You can also enable On File Import and/or On File Upgrade for per-file triggers.
Settings → Connect → Add → Webhook:
| Field | Value |
|---|---|
| URL | http://<host>:7889/api/webhook |
| Method | POST |
| Triggers | On Import, On Upgrade |
| Headers | X-API-Key: <your key> |
Interactive API docs are available at http://localhost:7889/docs.
# Health check
curl http://localhost:7889/health
# Queue a single file for full conversion
curl -X POST http://localhost:7889/api/convert \
-H "Content-Type: application/json" \
-d '{"path": "/share/movies/Movie (2024)/movie.mkv", "type": "full"}'
# type options: full | audio | video | cleanup
# Queue all files in a Radarr library (by Radarr movie IDs)
curl -X POST http://localhost:7889/api/convert/movies \
-H "Content-Type: application/json" \
-d '{"movie_ids": [123, 456], "type": "full"}'
# Queue all episodes in a Sonarr series (by Sonarr series ID)
curl -X POST http://localhost:7889/api/convert/series \
-H "Content-Type: application/json" \
-d '{"series_ids": [42], "type": "audio"}'
# List jobs
curl http://localhost:7889/api/jobs
# Analyze a file
curl "http://localhost:7889/api/analyze?path=/share/movies/Movie/movie.mkv"
| Page | Description |
|---|---|
| Dashboard | Live stats, active jobs, queue management |
| Movies | Browse and process your movie library |
| Shows | Browse and process your TV library |
| Jobs | Job history, filtering, controls |
| Settings | Complete settings reference |
| Integrations | Sonarr/Radarr setup, webhooks, and recommended workflow |
MIT
Content type
Image
Digest
sha256:ee5a7da53…
Size
191.6 MB
Last updated
1 day ago
docker pull sirjmann92/remuxcode