JellEmPlex Dedupe web tool for finding and removing duplicate movies in Jellyfin, Emby and Plex, with Docker Compose.
Last updated: Oct 2026
JellEmPlex Dedupe connects to your Jellyfin, Emby or Plex server and finds movies that exist more than once (same title and year). It shows resolution, codecs and file size side by side, so you can keep the best copy and delete the rest from the web UI.
Why you'd want it: Reclaim disk space and tidy libraries after years of upgrades and re-downloads.
| Item | Value |
|---|---|
| Stack folder | /opt/stacks/dedupe |
| Category | Media |
| Main image | spaceinvaderone/jellemplex-dedupe:latest |
| Services | 1 |
| Web UI | http://<SERVER_IP>:3369 |
| Official docs | https://github.com/SpaceinvaderOne/jellemplex-dedupe |
.env/.secret files from Docker Folders and EnvironmentPlexOnlineToken in Preferences.xml)Folder layout:
/opt/stacks/
├── _shared/
│ ├── .env # shared, non-secret settings
│ └── .secret # passwords, tokens and keys (chmod 600, never commit)
└── dedupe/
└── compose.yaml
/opt/appdata/dedupe/ # persistent application data
/opt/stacks/dedupe/compose.yaml:
---
services:
jellyemplex-dedupe:
image: spaceinvaderone/jellemplex-dedupe:latest
container_name: dedupe
hostname: dedupe
env_file:
- /opt/stacks/_shared/.env
- /opt/stacks/_shared/.secret
environment:
- DELETE_FILES=true # allow deleting duplicates from the web UI
volumes:
- /opt/appdata/dedupe/config:/config
- /srv/media:/media # optional: your media library
logging:
driver: json-file
options:
max-file: ${DOCKERLOGGING_MAXFILE:-10} # Max number of log files
max-size: ${DOCKERLOGGING_MAXSIZE:-200k} # Max file size
ports:
- 3369:80
restart: unless-stopped
Compose reads these from the shared files with --env-file. Replace every <PLACEHOLDER> with your own value.
/opt/stacks/_shared/.env:
PUID=1000
PGID=1000
TZ=<TZ>
DOCKERLOGGING_MAXFILE=10
DOCKERLOGGING_MAXSIZE=200k
| Variable | File | Purpose | Example |
|---|---|---|---|
PUID |
.env |
User ID the container runs as (see Docker Folders) | 1000 |
PGID |
.env |
Group ID the container runs as | 1000 |
TZ |
.env |
Time zone in tz database format, e.g. America/New_York | <TZ> |
DOCKERLOGGING_MAXFILE |
.env |
Number of rotated container log files to keep | 10 |
DOCKERLOGGING_MAXSIZE |
.env |
Maximum size of each container log file | 200k |
| Host port | Container port | Protocol | Service | Purpose |
|---|---|---|---|---|
| 3369 | 80 | tcp | jellyemplex-dedupe |
Web UI |
| Host path | Container path | Service | Purpose |
|---|---|---|---|
/opt/appdata/dedupe/config |
/config |
jellyemplex-dedupe |
Saved server configurations |
/srv/media |
/media |
jellyemplex-dedupe |
optional: your media library |
No limits are set. This app is light, so add deploy.resources.limits only if you need to cap it.
sudo mkdir -p /opt/stacks/dedupe /opt/appdata/dedupe
sudo chown -R $USER: /opt/stacks/dedupe
/opt/stacks/_shared/.env and /opt/stacks/_shared/.secret (chmod 600 .secret)./opt/stacks/dedupe/compose.yaml.cd /opt/stacks/dedupe
docker compose --env-file ../_shared/.env --env-file ../_shared/.secret config --quiet
docker compose --env-file ../_shared/.env --env-file ../_shared/.secret up -d
docker compose logs -f.http://<SERVER_IP>:3369.http://<SERVER_IP>:8096 (Jellyfin) or http://<SERVER_IP>:32400 (Plex) and paste the API key or token.Tip: create a small wrapper such as
alias dc='docker compose --env-file /opt/stacks/_shared/.env --env-file /opt/stacks/_shared/.secret'so every stack uses the same env files.
cd /opt/stacks/dedupe
docker compose --env-file ../_shared/.env --env-file ../_shared/.secret pull
docker compose --env-file ../_shared/.env --env-file ../_shared/.secret up -d
docker image prune -f
Back up /opt/appdata/dedupe before major upgrades. Watchtower can automate updates for stateless apps.
docker compose ps and docker compose logs --tail=100.localhost, since the tool runs in its own container.:?err): run the config command above to see which variable is not set in your env files.Educational example. Review every path, port and credential before you deploy, and never publish your .secret file.