Repository navigation
TDLD now follows the linuxserver.io container conventions: settings in /config, downloads in /downloads, files owned by PUID/PGID, nothing world-writable any more.
Important
Needs action when upgrading. The folder layout and the user variables change. The container migrates your lists, yt-dlp configs and download history by itself, but only if you change the mappings as described below before the first start.
ghcr.io/tom-joad/tdld:2.0.0 # this release, never changes
ghcr.io/tom-joad/tdld:2 # stays on 2.x, no changes that need action
ghcr.io/tom-joad/tdld:latest
Upgrading from the old image
1. Change the folder mappings
| Before | After |
|---|---|
…/appdata/tdld → /app/data |
keep it for the first start, the migration reads from it |
| — | new, empty folder, e.g. …/appdata/tdld-config → /config |
…/youtube → /app/data/output |
same host folder → /downloads |
…/hotfolder → /app/data/hotfolder |
same host folder → /hotfolder |
2. Change the variables
| Before | After |
|---|---|
UID, GID |
remove; they never had an effect |
| — | PUID, PGID: the owner of new files (Unraid: 99 / 100) |
| — | optional UMASK: 002 makes new files writable for the group, e.g. over SMB |
TZ, SLEEP_INTERVAL, AUTO_UPDATE_YTDLP and HOTFOLDER_INTERVAL stay as they are.
3. Start once and check the log
**** migrating /app/data to /config ****
What is carried over:
- the lists (
audioonly,channels,playlists) - the yt-dlp configs including
cookies.txt, with the paths rewritten to/configand/downloads. Your own changes to the configs are kept. - the download archives, so nothing is downloaded twice
What is not carried over:
/app/data/scripts/ytdl.shstill uses the old paths, so the new default script is used. If you changed it, carry your changes over to/config/scripts/ytdl.sh; the log reminds you.- the old logs
If the log shows /downloads is not mapped, the download folder is missing from step 1. Without it, new downloads end up inside the container.
4. Clean up
Once the web UI (http://<host>:8083/) shows your lists, remove the /app/data mapping and restart. Delete the old appdata folder once you're sure everything is in /config.
Unraid
The easiest way is the new template: add https://github.com/Tom-Joad/TDLD under Docker → Template repositories, then Add Container → tdld. It comes with PUID=99, PGID=100 and UMASK=002. Add the old /app/data mapping by hand for the first start, then delete the old container.
docker compose
services:
tdld:
image: ghcr.io/tom-joad/tdld:2
container_name: tdld
environment:
- PUID=1000
- PGID=1000
- UMASK=022
- TZ=Europe/Berlin
ports:
- 8083:8083
volumes:
- /path/to/tdld/config:/config
- /path/to/downloads:/downloads
- /path/to/hotfolder:/hotfolder # optional
- /path/to/old/appdata:/app/data # first start only, then remove
restart: unless-stoppedWhat's new
Changed
- Folders: settings, lists, yt-dlp configs, archives, logs and the download script in
/config; downloads in/downloads; the hotfolder in/hotfolder. - User:
PUID,PGIDandUMASKset the owner and permissions of new files. - Permissions: the
chown nobodyandchmod -R 777on every start are gone./configbelongs toPUID;/downloadsand/hotfolderare only taken over if Docker created them. - Services run as s6-rc units (
init-tdld-config,svc-ytdl,svc-webui,svc-hotfolder) as the unprivileged userabc./custom-cont-init.dis free for your own scripts again. AUTO_UPDATE_YTDLPupdates yt-dlp once per container start, no longer each time the download service restarts.- The image version comes from the build:
docker inspect -f '{{ index .Config.Labels "build_version" }}' tdld.
Fixed
- Starting without a mapped
/app/datastopped the setup, and the web UI and the download loop failed withPermission denied/No such file.
Added
- Unraid template
unraid/tdld.xml - Image tags
2and2.0.0 - Security policy: please report security problems privately through Security → Report a vulnerability
- Issue templates, changelog, MIT license
- Images are signed with cosign:
cosign verify ghcr.io/tom-joad/tdld:2.0.0 \ --certificate-identity-regexp 'https://github.com/Tom-Joad/ytdldocker/' \ --certificate-oidc-issuer https://token.actions.githubusercontent.com