---
title: CrossWatch
created: 2026-06-07
updated: 2026-06-07
type: app
tags: [catalogue, media-streaming, sync, multi-server, plex, emby, jellyfin]
confidence: medium
contested: false
sources:
  - 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é)

```yaml
# 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

```bash
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

- Repository : https://github.com/crosswatch/crosswatch
- Site : https://crosswatch.app/
- API Plex : https://www.plexopedia.com/plex-media-server/api/
- API Jellyfin : https://api.jellyfin.org/

## 🔗 Pages Liées

- [[cat-media-streaming]] (catégorie parente)
- [[app-plex]] — Serveur média #1 supporté
- [[app-jellyfin]] — Serveur média #2 supporté
- [[app-emby]] — Serveur média #3 supporté
- [[app-traefik]] — Reverse proxy HTTPS
- [[securisation-home-lab]] — Bonnes pratiques
- [[recettes-docker-compose]] — Templates
