Pronounced "Nah-gah-reh" — subtitle mining companion for Emby, Jellyfin, and Plex.
The subtitle timeline — mine any line from the current or past session directly in the browser. Highlighting via https://jiten.moe/reader
Anki Enhancement Dialogue allowing for tight control over what we mine
card_example.mp4
Finished Card (Kiku Notetype)
Nagare watches your active media server playback sessions, displays a live subtitle timeline in the browser, and enriches Anki cards with sentence audio, screenshots, and source metadata — without interrupting your immersion.
Note: This project is my most vibe-coded yet, so YMMV. It's really a problem that I sought out to solve for myself, but I believe/hope it can be useful for others.
- Live subtitle timeline synced to playback
- Sentence audio extraction and animated AVIF screenshot clips
- AnkiConnect integration with automatic card matching
- Playback controls (seek, pause, resume) from the browser.
- Yomitan-aware pause behavior. (Must turn off Secure Popup in Yomitan)
- Watch history for mining after playback ends
- Multi-server support (Emby + Jellyfin + Plex simultaneously)
- Manual-review or automatic daily Tadoku listening-log sync, grouped by show with duplicate protection
- Initial prototype with Emby support
- Add Jellyfin support
- Add Plex support
- AnkiConnect integration
- Support for subtitles even when player has none (listening practice while maintaining mineability).
- Mining History, allowing you to touch up cards after the fact, or add more context.
- Session History, allowing you to load past sessions and mine from them.
- Manual Subtitle Offset
- Automatic Subtitle Sync? IDK if this is even feasible, the ability to press a button, Nagare syncs with alass or subplz, and then sends the updated sub to the media server would be the idea.
- More Active Subtitle Sync? If you change subtitle timing in media player, Nagare will not adjust. I doubt this is possible...
- More options for audio/ss formats
- Run with Docker Compose:
# docker-compose.yml
services:
nagare:
image: ghcr.io/bpwhelan/nagare:latest
container_name: nagare
ports:
- "9470:9470"
volumes:
- ./data:/app/data
# Optional: mount media library for disk-mode access
# - /path/to/anime:/media/Anime:ro
extra_hosts:
- "host.docker.internal:host-gateway"
restart: unless-stoppeddocker compose up -d- Open
http://localhost:9470and configure Nagare from the web UI Config page.
Download the latest binary for your platform from GitHub Releases.
Requirements:
ffmpegonPATH- Anki with AnkiConnect
./nagareThe web UI is served at http://localhost:9470.
cd frontend && npm ci && npm run build && cd ..
cargo build --releaseAll configuration is managed through the web UI Config page and stored in data/nagare.sqlite. On first run, configure:
- Media server — URL and API key (Emby/Jellyfin) or token (Plex)
- AnkiConnect — URL and field mappings (
Sentence,SentenceAudio,Picture) - Media access —
auto,disk, orapimode; add path mappings if server and Nagare see different file paths - Tadoku (optional) — save your Tadoku username and password, then choose manual review or automatic daily sync. Nagare signs in and refreshes the browser session automatically. Manual review lets you approve or permanently decline individual ready episodes; automatic sync defaults to 8 PM Eastern. When the review workflow is first enabled, episodes completed after the previous successful sync are queued.
- Nagare polls your media server(s) for active playback sessions
- Select a session or allow Nagare to auto-select the most recently active one
- Create a card in Anki — Nagare matches it to the exact subtitle context
- Confirm the match, preview audio/screenshot, and enrich the card
src/ Rust backend (Axum + Tokio)
frontend/ Svelte frontend (Vite)
Dockerfile Multi-stage container build
Data is stored in data/nagare.sqlite. Generated Anki media files are prefixed with nagare_.

