CrossWatch

CrossWatch

Docker app from Cenodude's Repository

Overview

CrossWatch synchronizes media activity between Plex, Jellyfin, Emby and supported tracking services, with scheduled syncs, realtime monitoring, webhooks, captures and management tools.
crosswatch_overview

⭐ Star this repository to get updates

Latest Release GHCR Pulls Must-read: Quick Start
Docker Pulls Image Size Docker Version

Website Wiki Reddit

CrossWatch (CW) is a synchronization engine that act as a bridge and keeps your Plex, Jellyfin, Emby, SIMKL, Floppy, FlickList, Trakt, WeTrakr, AniList, TMDb, MDBList, PublicMetaDB, PunchPlay, BingeBase, Scrob, Tautulli, Tracearr, Kodi, Nuvio, Stremio and CW local tracker in sync. It runs locally with a web UI or/and Command-Line Interface (CLI) 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. With Profiles, you can manage separate sync setups for yourself and for friends or family too, with their own servers and/or tracker API's.

CW in a nutshell:

  • One brain for all your media syncs A single place to configure everything.
  • Be your own Sync Hub Create profiles for seperate media servers/users/trackers.
    • Managed user support (multi-users)
  • Web User Interface and/or Command Line Interface (CLI)
  • Multi media-server and multi tracker support with profiles.
  • Synchronization
    • Watchlists, Ratings, History, Progress and Collections
    • Rewatches: keep separate plays in sync for supported trackers.
    • Anime ID mapping (powered by AniBridge and animeApi) for AniList, SIMKL and CW tracker pairs, with custom mappings.
  • Interactive Sync
    • Review additions, updates and removals before applying them.
    • Resolve conflicts and correct titles, IDs, seasons and episodes.
  • Scrobble (tracks your activity)
    • Watcher (Plex/Emby/Jellyfin/Kodi/Scrob to supported trackers)
      • Does not require Plex Pass or Emby Premiere. Yay!
    • Webhooks (Plex/Emby/Jellyfin to supported trackers)
    • Anime ID mapping for watcher and webhooks for supported providers.
  • Tools
    • Analyzer: Find missing items and correct mappings for pending retries.
    • Sync topology advisor: Visualize your sync routes and identify overlapping paths.
    • Playback Progress Manager: View and edit unfinished playback sessions across providers.
    • Editor: Inspect, add or block items, and review or edit saved mappings.
    • Import and Export: Import your tracker files and export your data.
    • Events: Search sync history, inspect problems and open the logs for a run.
    • Logs: Search live and saved logs, filter by sync pair or run, highlight errors and keep logs for later.
    • Captures: Rollback tool for provider watchlist, ratings, and history.

And much more...such as:

  • Notifications: Access sync progress, pending reviews, reports and release updates from the bell beside your profile.
  • Simple and advanced scheduling: From standard to more detailed pair schedules
  • CW Tracker Keeps snapshots/backups from your media servers and trackers.
  • Unified Watchlist: View all watchlist items in one place.
  • Player card: Shows what you are currently watching in real time.
  • Recover Plex history: Import history for removed Plex items into your CW tracker.

Download

Guide: Installation

  • Docker:

    docker pull ghcr.io/cenodude/crosswatch:latest
    

Run as Container

docker run -d \
  --name crosswatch \
  -p 8787:8787 \
  -v crosswatch_config:/config \
  -e TZ=Europe/Amsterdam \
  --restart unless-stopped \
  ghcr.io/cenodude/crosswatch:latest

or

services:
  crosswatch:
    image: ghcr.io/cenodude/crosswatch:latest
    container_name: crosswatch
    ports:
      - "8787:8787"
    environment:
      TZ: Europe/Amsterdam
    volumes:
      - type: volume
        source: crosswatch_config
        target: /config
    restart: unless-stopped

volumes:
  crosswatch_config:

The container exposes the web UI at:
http://localhost:8787

Want no web UI? Add -e CW_CLI_ONLY=1 or CW_CLI_ONLY: "1" in Compose. The API, CLI, webhooks and auth callbacks keep working.

Run Once and Exit

For cron, Kubernetes CronJobs or other external schedulers, run the container as a one-shot sync job:

docker run --rm \
  -v crosswatch_config:/config \
  -e TZ=Europe/Amsterdam \
  ghcr.io/cenodude/crosswatch:latest \
  run-once

Run selected pairs by id, number or unique prefix:

docker run --rm \
  -v crosswatch_config:/config \
  ghcr.io/cenodude/crosswatch:latest \
  run-once --pair pair_07c3 --pair pair_91ab

The one-shot command exits 0 on success and 1 when the sync reports errors or cancellation. Add --fail-on-unresolved if unmatched items should fail the job.

Sponsors

Buy Me a Coffee
Every cent goes directly to the ALS Foundation in the Netherlands

GitBook

Huge thanks to our sponsors for keeping this project moving.

Requirements

At least one supported media server or tracking service account.

Download Statistics

29,808
Total Downloads
4,976
This Month
6,627
Avg / Month

Total Downloads Over Time

Loading chart...

Related apps

Details

Repository
ghcr.io/cenodude/crosswatch:latest
Last Updated2026-09-11
First Seen2026-06-29

Runtime arguments

Web UI
http://[IP]:[PORT:8787]
Network
bridge
Shell
bash
Privileged
false

Template configuration

WebUI PortPorttcp

HTTP port used to access the CrossWatch web interface.

Target
8787
Default
8787
AppdataPathrw

Persistent CrossWatch configuration and application data, mounted inside the container at /config.

Target
/config
Default
/mnt/user/appdata/crosswatch
TimezoneVariable

Timezone used for scheduling and displayed timestamps.

Target
TZ
Default
Europe/Amsterdam
User IDVariable

Numeric user ID used to run CrossWatch. The Unraid default is 99.

Target
APP_UID
Default
99
Group IDVariable

Numeric group ID used to run CrossWatch. The Unraid default is 100.

Target
APP_GID
Default
100