A self-hosted subtitle automation system with an LLM agent at its core — it identifies your media, j
A self-hosted subtitle automation system with an LLM agent at its core — it identifies your media, j
Subtitle Scout
A self-hosted system with an LLM agent at its core. It finds subtitles for your media library, judges whether each candidate belongs to the exact episode, and installs the one that fits.
以 LLM agent 为核心的自托管系统。替你的媒体库找字幕,逐条判定候选是否属于这一集,装上最适配的那条。
Live demo (read-only) · Website · English · 中文
For every episode or movie missing a subtitle in your target language, an agent runs a loop instead of a fixed pipeline:
Languages: Chinese has the deepest source coverage. English, Japanese, and Korean are fully supported. Spanish, French, German, Portuguese, Russian, and Italian work with basic coverage. Details in Target languages.
git clone https://github.com/fancydirty/subtitle-scout && cd subtitle-scout
mkdir -p cache && cp .env.example .env
docker compose up -dOpen http://:8099 and finish the setup wizard. Or let your coding agent do it, see the next section.
Subtitle Scout ships an Agent Skill at
skills/subtitle-scout-wizard/SKILL.md that walks your
coding agent through deployment, configuration, and troubleshooting, end to end.
Option 1 — paste this to your agent (Claude Code, Codex, Gemini CLI, Cursor, or any agent that can fetch URLs and run shell commands):
Fetch https://raw.githubusercontent.com/fancydirty/subtitle-scout/main/skills/subtitle-scout-wizard/SKILL.md and follow it to deploy and configure Subtitle Scout for me. If it references other files, fetch them from the same base path — or clone https://github.com/fancydirty/subtitle-scout and work from
skills/subtitle-scout-wizard/.
Option 2 — clone first (offline-friendly; you need the repo to self-host anyway):
Clone https://github.com/fancydirty/subtitle-scout, read
skills/subtitle-scout-wizard/SKILL.md, and follow it to deploy and configure Subtitle Scout for me.
Option 3 — install as a skill (harnesses supporting the Agent Skills standard):
npx skills add fancydirty/subtitle-scoutThen tell your agent: "Use the subtitle-scout-wizard skill to deploy Subtitle Scout."
The agent will ask before anything destructive. Review what it proposes — this skill has the same trust model as any install script you run from the internet.
Prefer doing it by hand? The manual path is below.
Get subtitle-scout running from zero to dashboard in under 5 minutes.
Two credentials are required: TMDB (recognizes every file) and an LLM key set (judging and translation). The wizard is only complete once both are in place. Every subtitle source is optional.
Of the seven sources, five take keys and the wizard can skip them all — configure the ones for your language anyway (the wizard and Settings only show sources relevant to your target language). OpenSubtitles and SubDL are international catalogs useful for every target language — don't skip them. ASSRT is the professional Chinese catalog (finished Chinese sidecars); r3sub carries official Traditional Chinese tracks from Taiwan releases (email + password of your r3sub.com account). Jimaku feeds the translation agent with Japanese source subtitles. The remaining two, SubHD and Zimuku, need no keys — they are Chinese-focused sources you enable with a toggle in Settings (off by default; see SECURITY.md for the terms-of-service caveat).
LLM (OpenAI-compatible) is a separate wizard step and is not covered here. One expectation to set now: model tier matters more than any other setting. The agent does long multi-step tool-calling; models below roughly the deepseek-v4-flash / mini tier do not fail loudly — they confidently fabricate, which shows up as misidentified media rather than an error. If matching quality is poor, suspect the model tier before filing a bug. Good value starting points: deepseek-v4-flash (api.deepseek.com), Qwen qwen3.5-plus (Alibaba DashScope), or any current mini/flash-class frontier model. Check current prices on each provider's official pricing page.
TMDB powers media file recognition. Without it, subtitle-scout cannot identify your files.
Mainland China note:
api.themoviedb.orgis blocked in mainland China. Subtitle Scout exposesTMDB_BASE_URL/TMDB_IMAGE_BASE_URL/TMDB_PROXY_URLso you can point it at the still-reachable official legacy domain (https://api.tmdb.org/3) or your own reverse proxy — a ready-to-paste Cloudflare Worker template ships in docs/tmdb-proxy-worker.js. Full walkthrough (Chinese): 大陆网络环境:TMDB 直连不通怎么办.
ASSRT is the primary Chinese subtitle source. The wizard lets you skip it; don't, if you want Chinese subs.
OpenSubtitles is an international source for Chinese-speaking and non-Chinese-speaking users alike. Jimaku is not a professional Chinese catalog; it supplies Japanese source subtitles to the translation agent.
→ OpenSubtitles · Jimaku
# Clone the repository
git clone https://github.com/fancydirty/subtitle-scout.git
cd subtitle-scout
# Create the cache directory (holds the SQLite DB and logs).
# Needed up front on Synology/DSM: its Docker daemon does not auto-create
# bind-mount host paths the way standard Linux Docker does.
mkdir -p cache
# Create environment file
cp .env.example .envEdit .env — you only need to set the timezone:
TZ=Asia/Shanghai # or your timezoneImportant: API keys are NOT configured in
.env. You'll enter them through the web dashboard in Step 4.
docker compose up -dWait 10-20 seconds for the container to initialize.
If ghcr.io is slow or blocked on your network, pull through a mirror and retag — it serves the same image digest:
docker pull ghcr.1ms.run/fancydirty/subtitle-scout:latest
docker tag ghcr.1ms.run/fancydirty/subtitle-scout:latest ghcr.io/fancydirty/subtitle-scout:latestOpen http://localhost:8099 (or http://:8099 if running on a NAS/server)
Create Admin Account — the setup wizard will prompt you to:
Configure Credentials — in the Settings page, fill in:
Add Media Directories:
/hostroot, so:/mnt/media/Movies → select /hostroot/mnt/media/Movies/Users/yourname/Media → select /hostroot/Users/yourname/MediaSame-filesystem rule for the archive dir: when subtitle-scout reorganizes a media folder (realign), it moves it with atomic
renameand deliberately never falls back to copying — no half-moved libraries. If the archive directory (REALIGN_ARCHIVE_ROOT, default: parent of the library root) is on a different filesystem, the move is skipped (abandon) and logged. Synology note: every shared folder is its own btrfs subvolume, so cross-shared-folder moves always fail withEXDEV— keep the archive dir inside the same shared folder as the library it serves.
Run the health check:
docker compose exec subtitle-scout node dist/cli/index.js doctorYou should see green checkmarks (✓) for:
Subtitle-scout automatically scans your media library every 15 minutes. To trigger an immediate scan:
That's it. Subtitle-scout is now monitoring your library and will fetch subtitles for any media missing them, in whichever target language you set (Chinese by default — see Target languages for what each language actually gets).
http://localhost:8099/activity) — see what's being processed in real-timeFor detailed configuration, troubleshooting, and development setup, see the sections below.
本仓库自带 Agent Skill:
skills/subtitle-scout-wizard/SKILL.md,
可引导你的编码 agent 全程完成部署、配置与排障。
方式一——把这段话粘贴给你的 agent(Claude Code / Codex / Gemini CLI / Cursor,或任何能抓取 URL 并执行命令的 agent):
抓取 https://raw.githubusercontent.com/fancydirty/subtitle-scout/main/skills/subtitle-scout-wizard/SKILL.md 并按其中指引为我部署并配置 Subtitle Scout。若其中引用了其他文件, 从同一路径前缀抓取,或直接 clone https://github.com/fancydirty/subtitle-scout 后在 `skil
No open issues yet, or sync has not completed.