Generates what's missing
Transcribes audio with OpenAI and writes an SRT only for the languages your media lacks.
Subtitler
A self-hosted tool that generates the subtitles your media library is missing. It uses preferred audio tracks for timing and calls OpenAI only when it has to — writing clean, standard SRT files. Sonarr and Radarr tell it where your media lives.
Subtitler scans your library, checks what subtitles already exist, and creates only what's absent — doing the least expensive thing each time. It leans on Sonarr and Radarr to locate files, so there's no media path to configure twice.
Asks Sonarr and Radarr for the paths of every file — no separate library config.
Checks existing sidecars and embedded subtitle streams against your required languages.
Transcribes the preferred source audio first, then translates those timed cues when needed.
Saves standard SRT sidecars next to the video and records state for retries.
Transcribes audio with OpenAI and writes an SRT only for the languages your media lacks.
Existing sidecars are respected, while generated subtitles stay tied to the preferred audio track.
Dry-run, missing_only, and a per-scan job cap keep first runs cheap and safe.
Integrates with Sonarr and Radarr to find media, then drops .srt files beside each video.
The image bundles the Go binary plus ffmpeg and ffprobe. Copy
the examples, add your keys, validate in dry-run, then start the daemon.
# configure
cp config.example.yaml config.yaml
cp .env.example .env
# validate safely (dry-run is on by default)
docker compose --env-file .env \
-f docker-compose.example.yaml \
run --rm subtitler doctor -config /etc/subtitler/config.yaml
# start the daemon
docker compose --env-file .env \
-f docker-compose.example.yaml up -d