Subtitles for the files
that don’t have any
subtrace walks your media library, finds videos with no subtitle sidecar,
and writes .srt files next to them where Plex, Jellyfin, and Emby pick them up.
No stack to run
No Sonarr, no Radarr, no Bazarr, no database server. One static binary and a SQLite file. Point it at a directory and give it a provider API key.
Matches on ids, not titles
Reads the TMDB/TVDB/IMDB id out of Plex/TRaSH-style folder names and asks the provider for that exact title, instead of guessing from a release name.
Built for small quotas
Provider quotas are far smaller than a real library. State lives in SQLite, so runs resume where the last one stopped and nothing is attempted twice.
Never writes junk
Every download is validated as real SRT and written through an atomic rename in the destination directory. A provider error page never lands on disk named .srt.
Falls through providers
opensubtitles.com and subdl.com, tried in the order you choose. When one runs out of daily quota it is parked and the next takes over.
Fits the *arr container conventions
PUID/PGID, a /config mount, secrets from the environment, and a watch loop as the default command.
subtrace config init > subtrace.toml # write a commented starter config
$EDITOR subtrace.toml # set library roots and API keys
subtrace scan # what is missing? (no network)
subtrace fetch --limit 5 # try a few
subtrace watch # run forever on an interval