https://github.com/cenodude/CrossWatch
Synchronize your data across Plex, Jellyfin, Emby, SIMKL, Trakt, AniList, TMDb, MDBlist, and more. Keep your movies and shows in sync, no matter where you watch.
https://github.com/cenodude/CrossWatch
anilist emby jellyfin mdblist media-sync media-synchronisation plex plex-media-server simkl tautulli tmdb trakt watcher webhook
Last synced: 6 days ago
JSON representation
Synchronize your data across Plex, Jellyfin, Emby, SIMKL, Trakt, AniList, TMDb, MDBlist, and more. Keep your movies and shows in sync, no matter where you watch.
- Host: GitHub
- URL: https://github.com/cenodude/CrossWatch
- Owner: cenodude
- License: other
- Created: 2025-08-27T17:26:22.000Z (6 months ago)
- Default Branch: main
- Last Pushed: 2026-02-01T15:09:06.000Z (9 days ago)
- Last Synced: 2026-02-01T23:49:56.595Z (9 days ago)
- Topics: anilist, emby, jellyfin, mdblist, media-sync, media-synchronisation, plex, plex-media-server, simkl, tautulli, tmdb, trakt, watcher, webhook
- Language: Python
- Homepage: https://wiki.crosswatch.app
- Size: 23.3 MB
- Stars: 452
- Watchers: 3
- Forks: 11
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
- Security: SECURITY.md
Awesome Lists containing this project
README
⭐ Star this repository to get updates
**CrossWatch/CW** is a synchronization engine that keeps your **Plex, Jellyfin, Emby, SIMKL, Trakt, AniList, TMDb, MDBList and Tautulli** in sync. It runs locally with a web UI where you link accounts, define sync pairs, run them manually or on a schedule, and review stats and history. CW also includes its own tracker to keep your data safe with snapshots.
Supported: **Movies** and **TV shows / episodes / Seasons**\
Supported: **Plex, Emby, Jellyfin, MDBList, Tautulli, AniList, Trakt, SIMKL, TMDb and CW internal tracker**\
> **Not supported (yet): Multi-users / Multi-servers per instance**
> CrossWatch currently supports **one user and one server per instance**.
> Need multiple users/servers? Run **multiple containers** (one per user/server).
Important: Multi-user / multi-server support is in progress.
Track progress here: Issue #73

### CW in a nutshell:
* **One brain for all your media syncs** A single place to configure everything.
* **Multi media-server** and **multi tracker** support, in just one tool.
* **Mobile-friendly overview** that prioritizes only the essentials
* **Flexible sync directions** Between media server and trackers.
* **Simple and advanced scheduling** From standard to more detailed pair schedules
* **Internal CW Tracker** Keeps snapshots/backups from your media servers and trackers.
* **Unified Watchlist across providers** View all watchlist items in one place.
* **Fallback GUID** Revives old items from your Plex library.
* **Watcher** (Plex/Emby/Jellyfin to Trakt/SIMKL/MDBList) 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 your items and add or block items.
* **Player card** Shows what you are currently watching in real time.
* **Snapshosts** Rollback tool for provider watchlist, ratings, and history
Core features
- Sync watchlists (one-/two-way)
- Live scrobble (Plex/Jellyfin/Emby to Trakt/SIMKL/MDBList)
- Sync ratings (one-/two-way)
- Sync history (one-/two-way)
- Keep snapshots with CW tracker
- Auto-remove from watchlist after finish
Tools & modes
- Analyzer: finds broken or missing matches/IDs
- Exporter: CSV files for popular services
- Editor: Edit and adjust your items
- Snapshots: Create and restore snapshots
- Now Playing card, Stats, history, live logs
- Headless scheduled runs
Trackers
Media servers
Others
### Download
[](https://wiki.crosswatch.app/getting-started/container-installation)
[](https://wiki.crosswatch.app/getting-started/docker-setup)
* **Docker:**
```bash
docker pull ghcr.io/cenodude/crosswatch:latest
```
### Run as Container
```bash
docker run -d --name crosswatch -p 8787:8787 -v /path/to/config:/config -e TZ=UTC ghcr.io/cenodude/crosswatch:latest
```
or
```bash
# docker-compose.yml
services:
crosswatch:
image: ghcr.io/cenodude/crosswatch:latest
container_name: crosswatch
ports:
- "8787:8787" # host:container
environment:
- TZ=UTC
volumes:
- /path/to/config:/config
restart: unless-stopped
```
> The container exposes the web UI at:\
> http://localhost:8787
## Sponsors
Huge thanks to our sponsors for keeping this project moving.