SubSyncArr-Ng is an automated subtitle synchronization suite designed to run seamlessly in Docker.
110
SubSyncArr-Ng (Next-Generation) is an automated subtitle synchronization suite designed to run seamlessly in Docker. It continuously monitors your movie and TV show libraries, identifies out-of-sync subtitles, and synchronizes them with precision using three complementary synchronization engines: ffsubsync, autosubsync, and alass.
SubSyncArr-Ng is non-destructive: it preserves your original subtitles untouched and creates distinct synchronized copies for each engine, providing full redundancy and flexibility in players like Plex, Jellyfin, Emby, and Kodi.
localStorage persistence, and automatic operating system theme detection (prefers-color-scheme).DELETE_ORPHANED_SRT=true): Automatically purges orphaned subtitle files and their previously synced variants if no corresponding video file exists on disk.00x20 to S00E20), preventing valid TV subtitles from being misidentified as orphans.alass: Includes an integrated ffprobe wrapper that handles MKV files containing embedded attachment streams (such as subtitle fonts or cover art) without crashing Rust's JSON deserializer.[β» Reset] button right inside the Web UI file cards to unblock files blacklisted by the 3-failure circuit breaker with a single click..mkv, .mp4, .avi, .mov, .ts, .m4v, .webm, .wmv, and .flv.No single subtitle synchronization algorithm works perfectly for every scenario (movies, TV shows, PAL/NTSC frame rate changes, commercial breaks, noisy audio, or sparse forced dialogue). For this reason, SubSyncArr-Ng runs three complementary engines:
βββββββββββββββββββ
β Input Subtitle β (.srt)
ββββββββββ¬βββββββββ
β
βββββββββββββββββββββΌββββββββββββββββββββ
βΌ βΌ βΌ
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
β ffsubsync β β autosubsync β β alass β
ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββ¬ββββββββ
β β β
βΌ βΌ βΌ
.ffsubsync.srt .autosubsync.srt .alass.srt
ffsubsync (Fast Forward Subtitle Sync)<filename>.<lang>.ffsubsync.srtautosubsync (Acoustic Feature & Speech Detection).forced.srt files for autosubsync (delegating them to ffsubsync and alass) and limits worker threads to 1 (--parallelism 1) to ensure 4K Remuxes do not trigger Out-Of-Memory (OOM) errors.<filename>.<lang>.autosubsync.srtalass (Automatic Language-Agnostic Subtitle Synchronization)alass can split subtitles into independent segments and align each chunk separately.<filename>.<lang>.alass.srtSCAN_PATHS for .srt files. Files that are already synchronized (or whose synced outputs already exist) are skipped to save system resources..srt file with its video file in the same directory:
00x20 matches S00E20).DELETE_ORPHANED_SRT is enabled, the orphan subtitle and any obsolete synced variants are deleted automatically..srt output.Create or update your docker-compose.yaml:
name: subsyncarr
services:
subsyncarr:
build:
context: .
dockerfile: Dockerfile
image: subsyncarr-ng:latest
container_name: subsyncarr
ports:
- '3030:3000' # Web UI accessible at http://<host>:3030
volumes:
# Mount your media directories
- /path/to/movies:/movies
- /path/to/tv:/tv
- /path/to/appdata/subsyncarr:/app/data # SQLite database & logs
restart: unless-stopped
deploy:
resources:
limits:
memory: 2048M # Recommended for 4K / high-bitrate media
reservations:
memory: 256M
environment:
- PUID=1000
- PGID=100
- TZ=Europe/Rome
- CRON_SCHEDULE=0 0 * * * # Automatic scan daily at midnight
- SCAN_PATHS=/movies,/tv
- EXCLUDE_PATHS=/movies/temp,/tv/downloads
- MAX_CONCURRENT_SYNC_TASKS=1
- INCLUDE_ENGINES=ffsubsync,autosubsync,alass
- AUTOSUBSYNC_PARALLELISM=1
- AUTOSUBSYNC_SKIP_FORCED=true
- DELETE_ORPHANED_SRT=true
Run the container:
docker compose up -d
Open your browser at http://localhost:3030 (or your server's IP address on port 3030).
| Variable | Default | Description |
|---|---|---|
SCAN_PATHS | /scan_dir | Comma-separated paths to scan for subtitles (e.g. /movies,/tv) |
EXCLUDE_PATHS | (none) | Comma-separated directory paths to exclude from scanning |
SYNC_LANGUAGES | (none) | Comma-separated language codes to sync (e.g., it,en). If unset, all subtitles are synced |
CRON_SCHEDULE | 0 0 * * * | Cron schedule for automatic runs, or disabled to turn off |
MAX_CONCURRENT_SYNC_TASKS | 1 | Number of files processed in parallel (1 is recommended to conserve CPU/RAM) |
INCLUDE_ENGINES | ffsubsync,autosubsync,alass | Comma-separated list of engines to run |
DELETE_ORPHANED_SRT | true | Automatically delete subtitle files that have no matching video in their folder |
AUTOSUBSYNC_PARALLELISM | 1 | Worker threads for autosubsync (set to 1 to prevent OOM on 4K files) |
AUTOSUBSYNC_SKIP_FORCED | true | Skip autosubsync on .forced.srt files (handled by ffsubsync and alass) |
FFSUBSYNC_SUFFIX | ffsubsync | Custom suffix for ffsubsync outputs (e.g. movie.en.ffsubsync.srt) |
AUTOSUBSYNC_SUFFIX | autosubsync | Custom suffix for autosubsync outputs |
ALASS_SUFFIX | alass | Custom suffix for alass outputs |
ALASS_EXTRA_ARGS | (none) | Extra CLI flags passed directly to alass (e.g. --disable-fps-guessing, --split-penalty 15, --no-split) |
SYNC_ENGINE_TIMEOUT_MS | 1800000 | Engine timeout in milliseconds (default 30 minutes) |
WEB_PORT | 3000 | Internal port for the Web UI (mapped to host port via docker-compose) |
WEB_HOST | 0.0.0.0 | Host interface for Web UI binding |
PUID | 1000 | User ID for file permissions |
PGID | 100 | Group ID for file permissions |
TZ | Etc/UTC | Timezone for logs and cron scheduling (e.g. Europe/Rome) |
| Variable | Default | Description |
|---|---|---|
DB_PATH | /app/data/subsyncarr-plus.db | SQLite database file location |
LOG_BUFFER_SIZE | 1000 | Maximum log lines kept in memory |
RETENTION_KEEP_RUNS_DAYS | 30 | Keep completed runs in database for N days |
RETENTION_TRIM_LOGS_DAYS | 7 | Trim verbose logs after N days (keeps summary only) |
RETENTION_CLEANUP_INTERVAL_HOURS | 24 | Frequency of database cleanup job |
The Web UI provides complete real-time monitoring and control:
Header & Status Indicators:
Currently Processing Card:
βοΈ Working on ffsubsync).[π View Log] Button: Opens a full-screen detailed log modal for the active file.[Skip] Button: Cancels processing for that specific file.[π Live Run Log] Button: Opens the global run log for the entire session.Completed & Skipped Files:
β ffsubsync 5.0s, β alass 3.3s).[π Log] Button: Click on any completed file to view its complete timeline, engine duration, stdout, stderr, and copy log output to clipboard.Clear Files Button: Cleans completed files from the UI display without altering disk data.Run History:
/movies
βββ The Old Man and the Gun (2018) {imdb-tt2837574}/
β βββ The Old Man and the Gun (2018).mkv
β βββ The Old Man and the Gun (2018).it.forced.srt # Original subtitle
β βββ The Old Man and the Gun (2018).it.forced.ffsubsync.srt # Synced copy
β βββ The Old Man and the Gun (2018).it.forced.alass.srt # Synced copy
/tv
βββ American Ninja Warrior (2009)/
βββ American Ninja Warrior (2009) - S00E20.mkv
βββ American Ninja Warrior (2009) - 00x20 - Celebrity.en.srt # Original
βββ American Ninja Warrior (2009) - 00x20 - Celebrity.en.ffsubsync.srt # Synced
βββ American Ninja Warrior (2009) - 00x20 - Celebrity.en.alass.srt # Synced
Open-source under the original project license. Maintained at https://github.com/Jorman/SubSyncArr-Ngβ .
Content type
Image
Digest
sha256:c5e9f4368β¦
Size
327.8 MB
Last updated
27 days ago
docker pull chryses/subsyncarr-ng