Click any screenshot to view it full size.
At minimum, read the Best Practices before enabling two-way sync or media server to media server writes.
CrossWatch is a synchronization engine that keeps your Plex, Jellyfin, Emby, SIMKL, Trakt and MDBlist in sync.
It runs locally with a clean web UI where you link accounts, define sync pairs, run them manually or on a schedule, and review stats and history.
CrossWatch also includes its own tracker to keep your data safe with snapshots.
It supports movies and shows/episodes Anime is not supported yet....sorry..
- One brain for all your media syncs A single place to configure and understand everything.
- Multi-server (Plex, Jellyfin, Emby) and multi-tracker (Trakt, SIMKL, MDBlist) in one tool.
- Flexible sync directions Between media server. Between trackers. Or from/to media servers and trackers.
- Simple and advanced scheduling From “run once a day” to more detailed, time-based pair schedules
- Internal CrossWatch Tracker Keeps snapshots/backups of your Watchlist, History and Ratings from your media servers and trackers.
- Unified, visual Watchlist across providers View all watchlist items in one place, with filter, search, bulk-remove and more.
- Back-to-the-Future (Fallback GUID) Revives items that left your Plex library but still exist in your server database.
- Webhooks (Plex / Jellyfin / Emby to Trakt)
- Watcher (Plex / Emby to Trakt and/or SIMKL) Plugin-free and subscription-free.
- Watchlist Auto-Remove Clears items from your Watchlist after a verified finish.
- Analyzer Finds items that are stuck or inconsistent between providers.
- Editor Inspect and adjust CrossWatch data. Add or block items. Example: tell Plex to stop sending movie X because you do not want it.
- Player card (Webhooks and Watcher) Shows what you are currently watching in real time while Webhooks or Watcher are active.
|
- Docker (recommended):
docker pull ghcr.io/cenodude/crosswatch:latest
- Prebuilt releases:
Get the latest builds and assets here: Releases ▸
Tip: use :latest for stable, or a specific tag like :v0.2.x.
docker run -d --name crosswatch -p 8787:8787 -v /path/to/config:/config -e TZ=Europe/Amsterdam ghcr.io/cenodude/crosswatch:latestor
# 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-stoppedThe 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.
- Open the web UI
- Connect at least two authentication providers, Plex, Jellyfin, Emby, SIMKL and/or TRAKT
- Create one or more Sync Pairs (for example: Plex to SIMKL or two-way) and/or enable Scrobble
- Click Synchronize to start, or enable scheduling in Settings
- Track stats, logs, and history from the UI
CrossWatch can scrobble your real-time Plex, Jellyfin, and Emby playback to Trakt, so episodes and movies you watch are instantly marked as “Watching” or “Watched” on Trakt.
Have Plex Pass / Emby Premiere? Prefer Webhook. No Pass/Premiere? Use the Watcher. Jellyfin users: use Webhook.
- Do NOT port-forward
8787from your router or expose the web UI directly to WAN. - Run CrossWatch on your local network only, or access it via:
- a VPN (WireGuard, Tailscale, etc.)
- Anyone who can reach the web UI can change sync pairs, tokens and settings, which may:
- delete or corrupt watch history / ratings / watchlists,
- cause unwanted writes between servers/trackers,
- leak information about your media libraries and accounts.


