Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Synchronize your data across Plex, Jellyfin, SIMKL, Trakt, and more. Keep your movies and shows in sync, no matter where you watch.

License

Notifications You must be signed in to change notification settings

cenodude/CrossWatch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CrossWatch

CrossWatch — Screenshot 1 CrossWatch — Screenshot 2 CrossWatch — Screenshot 3 CrossWatch — Screenshot 4

Click any screenshot to view it full size.

⚠️ EARLY DEVELOPMENT
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.


🚀 Features

  • Sync watchlists (one-/two-way)
  • Live scrobbling (Plex → Trakt)
  • Sync ratings (one-/two-way)
  • Sync watch history (one-/two-way)
  • Sync playlists (one-/two-way — disabled)
  • Simple web UI — JSON state
  • TMDb metadata & posters
  • Stats, history, live logs
  • Headless scheduled runs
  • Trackers: SIMKL  Trakt
  • Media servers: Plex  Jellyfin

🐳 Run as Container

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.


🧩 Architecture

  • FastAPI backend (crosswatch.py) at port 8787
  • 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

📋 Usage

  1. Open the web UI
  2. Connect at least two Authentication providers, Plex, Jellyfin, SIMKL and/or TRakt under
  3. Create one or more Sync Pairs (e.g. Plex → SIMKL or two-way) or/and use Scrobble
  4. Click Synchronize to start, or enable scheduling in Settings
  5. Track stats, logs, and history from the UI

🛠 Troubleshooting

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

🎬 Live Scrobbling (Plex → Trakt)

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.

How it works

  • 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.

⚖️ License

MIT © cenodude

About

Synchronize your data across Plex, Jellyfin, SIMKL, Trakt, and more. Keep your movies and shows in sync, no matter where you watch.

Resources

License

Stars

Watchers

Forks

Packages