PlexToJellyfinSync
Cyclically reads the watch state from a Plex server and writes it into the NFO files Jellyfin imports, for movies and series. No Plex Pass needed, with a web dashboard.

Overview
Anyone running Plex and Jellyfin side by side knows the problem: what is marked as watched in Plex is unknown to Jellyfin. PlexToJellyfinSync closes that gap by reading the watch state from Plex on a schedule and writing it into the NFO files next to the media files, which is where Jellyfin imports user data from.
The application runs as a small container and works purely by polling: it needs no Plex Pass and therefore also picks up items that were marked as watched by hand. A fast incremental pass checks the history, and a periodic full reconcile catches up on anything missed. Existing NFO files stay untouched except for the watched, playcount and lastplayed fields; missing files can be generated from the Plex metadata.
The most important setup step is the path mappings. Plex reports file paths as the Plex server sees them, while this container finds the same files under its own mount point. A mapping rewrites the Plex prefix into the local one. What matters is the path Plex returns through its API, not the folder you see in the interface. Without a matching mapping an item is skipped and logged as such, rather than written to a wrong path.
One limitation sits on the Jellyfin side: Jellyfin can only import NFO user data for exactly one user. The tool therefore works with the Plex server owner. In the Jellyfin library settings the NFO metadata reader has to be enabled, with the target user set to the one corresponding to the Plex owner.
Features
Installation
docker run -d \
--name plextojellyfinsync \
-e PLEXSYNC__Plex__BaseUrl="http://plex:32400" \
-e PLEXSYNC__Plex__Token="<your-plex-token>" \
-e PLEXSYNC__PathMappings__0__Plex="/data/Movies" \
-e PLEXSYNC__PathMappings__0__Local="/media/Movies" \
-v /path/to/media:/media \
-v /path/to/config:/config \
-p 8080:8080 \
networlddev/plextojellyfinsync:latestThe media volume has to be mounted writable. At least one matching path mapping is mandatory, otherwise items are skipped.
Releases
v1.4.0 · 18/09/2026
- [Security] Harden dashboard auth, cookies, and container user
v1.3.3 · 17/09/2026
Dependencies updated
v1.3.2 · 10/09/2026
Dependencies updated
v1.3.1 · 23/08/2026
- Bump the actions group with 2 updates
- Update Reihitsu.Analyzer, suppress RH5201, fix indentation
v1.3.0 · 16/08/2026
- Bump the actions group with 2 updates
- Refactor code organization and update dependencies
![[ e-networld.de ]](/img/logo.png)