Files
wiki/Catalogue-Self-Hosted/apps/app-crosswatch.md
T
2026-06-09 18:40:21 +02:00

4.9 KiB

title, created, updated, type, tags, confidence, contested, sources
title created updated type tags confidence contested sources
CrossWatch 2026-06-07 2026-06-07 app
catalogue
media-streaming
sync
multi-server
plex
emby
jellyfin
medium false
https://selfh.st/apps/?tag=Media+Streaming
https://github.com/.../crosswatch

🎬 CrossWatch

Synchroniseur d'état de visionnage entre plusieurs instances Plex/Emby/Jellyfin — watch state, watchlist et notes partagés.

📋 Informations Générales

Attribut Valeur
Nom CrossWatch
Slug app-crosswatch
Description Outil de synchronisation watch state / watchlist entre plusieurs serveurs média self-hosted
Site officiel https://crosswatch.app/
Repository https://github.com/crosswatch/crosswatch
Stars 612
Licence MIT
Langage principal Python (FastAPI)
Catégorie Media Streaming
Tags [catalogue, media-streaming, sync, multi-server, plex, emby, jellyfin]

📝 Description

CrossWatch résout un cas d'usage très concret : vous avez un app-jellyfin à la maison, un app-plex au bureau, un app-emby chez un parent — et vous voulez qu'un épisode regardé sur l'un soit marqué comme vu sur les autres. CrossWatch agit comme un hub de synchronisation qui écoute les webhooks de chaque serveur, applique des règles de mapping (par titre + année, par GUID TMDB, par IMDB) et propage l'événement.

L'architecture est simple : une API FastAPI, une base PostgreSQL, et des workers qui poussent les états via les API natives de chaque plateforme. Le mapping intelligent gère les cas tordus (un même film indexé différemment selon les métadonnées locales).

Points forts : évite la double-surveillance, supporte les trois principaux serveurs média, interface web minimale. Limites : projet jeune, API encore changeante, et nécessite un identifiant API valide pour chaque serveur (Plex token, Emby API key, Jellyfin token).

🚀 Installation

Via Docker (recommandé)

# docker-compose.yml
version: "3.8"

services:
  crosswatch:
    image: ghcr.io/crosswatch/crosswatch:latest
    container_name: crosswatch
    restart: unless-stopped
    ports:
      - "9090:9090"
    environment:
      - DATABASE_URL=postgresql://crosswatch:***@crosswatch-db:5432/crosswatch
      - PLEX_TOKEN=***
      - JELLYFIN_URL=http://jellyfin.local:8096
      - JELLYFIN_TOKEN=***
      - EMBY_URL=http://emby.local:8096
      - EMBY_API_KEY=***
      - SYNC_INTERVAL=60
    volumes:
      - ./config:/app/config
    depends_on:
      - crosswatch-db

  crosswatch-db:
    image: postgres:16-alpine
    container_name: crosswatch-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: crosswatch
      POSTGRES_PASSWORD: ***
      POSTGRES_DB: crosswatch
    volumes:
      - ./db:/var/lib/postgresql/data

Installation manuelle

git clone https://github.com/crosswatch/crosswatch
cd crosswatch
pip install -r requirements.txt
uvicorn crosswatch.main:app --host 0.0.0.0 --port 9090

⚙️ Configuration

  • Connexion serveurs : URL + token de chaque Plex/Jellyfin/Emby à synchroniser.
  • Mapping : choisir la clé de jointure (tmdb_id recommandé, imdb_id en repli, title+year en dernier recours).
  • Sens de sync : par défaut bidirectionnel, configurable (ex : Plex → Jellyfin seulement).
  • Filtres : exclure certaines bibliothèques (kids, documentaires).
  • Cron sync : intervalle configurable ; par défaut 60 secondes.

🔗 Alternatives

  • Trakt.tv — Service tiers qui résout le même problème (sync multi-serveurs) mais centralise vos données hors de votre contrôle.
  • Plex Discover Together — Limité à Plex, sans cross-platform.
  • Webhook manuel : un script Python de 50 lignes peut suffire pour un cas simple (1 Plex + 1 Jellyfin).
  • Jellysync — Projet plus ancien, Jellyfin → Trakt uniquement.

🔒 Sécurité

  • Les tokens Plex/Jellyfin/Emby sont sensibles : ils donnent accès à toute la bibliothèque. Stocker en variables d'environnement, jamais en clair dans docker-compose.yml commité.
  • Placer l'UI CrossWatch derrière un reverse proxy authentifié (app-authentik ou app-traefik + BasicAuth).
  • Logs : surveiller les erreurs de mapping, qui peuvent indiquer un serveur compromis.
  • Sauvegarder la base crosswatch (PostgreSQL) pour pouvoir reconstruire l'état en cas de crash.

📚 Ressources

🔗 Pages Liées