Click any screenshot to view it full size.
This project is unstable and may break. TESTING ONLY — DO NOT USE IN PRODUCTION.
Road to redemption → v0.2.0: deep cleanup & refactors to future-proof the codebase. Fewer new features; more fixes and polish.
What works (mostly): most Plex and Trakt features, including live scrobbling (Plex → Trakt).
Still maturing: SIMKL and Jellyfin remain in active testing.
Always back up your data before use.
CrossWatch is a lightweight synchronization engine that keeps your Plex, Jellyfin, Simkl, and Trakt in sync. It runs locally with a clean web UI to link accounts, configure sync pairs, run them manually or on schedule, and track stats/history. It also fully replaces my previous project Plex2SIMKL, with a more modular architecture and broader multi-provider support.
CrossWatch aims to become a one-for-all synchronization system for locally hosted environments. Its modular architecture allows new providers to be added easily. This approach keeps the system maintainable, testable, and easy to extend as new platforms emerge.
|
docker run -d --name crosswatch -p 8787:8787 -v /path/to/config:/config -e TZ=Europe/Amsterdam ghcr.io/cenodude/crosswatch:latest
or
# docker-compose.yml
services:
crosswatch:
image: ghcr.io/cenodude/crosswatch:latest
container_name: crosswatch
ports:
- "8787:8787" # host:container
environment:
- TZ=Europe/Amsterdam
volumes:
- /path/to/config:/config
restart: unless-stopped
The container exposes the web UI at:
👉 http://localhost:8787
By default CONFIG_BASE
will be /config
inside the container.
Your config.json
, state.json
, statistics.json
, etc. will all be stored there.
- FastAPI backend (
crosswatch.py
) at port8787
- Vanilla JS/CSS UI served from
/assets/
- Pluggable providers:
auth
(Plex, Jellyfin, SIMKL, TRAKT)sync
(PLEX ⇄ ⇄ Jellyfin ⇄ SIMKL ⇄ TRAKT)metadata
(TMDb enrichment)
- All state/config stored as JSON in
CONFIG_BASE
- Open the web UI
- Connect at least two Authentication providers, Plex, Jellyfin, SIMKL and/or TRakt under
- Create one or more Sync Pairs (e.g. Plex → SIMKL or two-way) or/and use Scrobble
- Click Synchronize to start, or enable scheduling in Settings
- Track stats, logs, and history from the UI
Open Settings → Troubleshoot to access three quick-fix actions:
- Clear cache — Purges cached data so fresh metadata is fetched next time.
POST /api/troubleshoot/clear-cache
- Reset stats — Resets usage/summary counters used for insights.
POST /api/troubleshoot/reset-stats
- Reset state — Reinitializes app state (filters, view prefs, local UI). Linked accounts are not touched.
POST /api/troubleshoot/reset-state
CrossWatch can scrobble your real-time Plex playback to Trakt — so episodes and movies you watch are instantly marked as “Watching” or “Watched” on Trakt.
- A background watcher connects to your Plex Media Server (via WebSocket).
- Every play/pause/stop is converted into a ScrobbleEvent.
- The event is enriched with TMDb/Tvdb/IMDb IDs and sent to Trakt’s
/scrobble
API. - Built-in deduplication, retries, and fallbacks ensure stable reporting.
MIT © cenodude