JellyMark adds a personal watchlist to Jellyfin Web and can optionally sync that watchlist between two Jellyfin servers. Save movies, series, and seasons, track viewing progress and history, and keep paired users' Watchlists synchronized across separate Jellyfin instances. The Watchlist works on its own—no sync service or KefinTweaks required.
- Save movies, series, and seasons with a bookmark button.
- Browse Series Progress, movie/season Watch History, and Statistics.
- Use your current Jellyfin theme, including GlassFin.
- Import/export your Watchlist or copy it to a playlist.
Based on KefinTweaks Watchlist by ranaldsgift. JellyMark reuses and adapts substantial Watchlist code, with a standalone interface and optional cross-server sync. Thanks to the original author and contributors. MIT license and credits.
Download the latest release · What's changed
Trying to add a Watchlist to Jellyfin or sync a Jellyfin Watchlist between two servers? See Jellyfin Watchlist and cross-server sync.
Part of JellyPi, a larger project bringing together Jellyfin tools for a smoother TV experience. This Watchlist can also be used independently.
You need Jellyfin web and the JavaScript Injector plugin.
This keeps a small loader in JavaScript Injector and downloads the current stable JellyMark UI from this repository's main branch whenever Jellyfin Web loads.
- In Jellyfin, open Dashboard → JavaScript Injector → Add Script.
- Name it JellyMark Loader.
- Copy the full contents of
install/remote-loader.js. - Paste it as JavaScript, enable it, and save.
- Disable/remove any older full JellyMark UI script entry.
- If you use KefinTweaks, disable its Watchlist module to avoid duplicate controls.
- Fully reload Jellyfin.
After future stable JellyMark UI changes are pushed to main, reload Jellyfin Web to receive them. The loader stores the last successfully downloaded UI build in browser storage as a fallback if GitHub is temporarily unreachable.
Raw stable loader:
https://raw.githubusercontent.com/isaacAmejia/jellymark/main/install/remote-loader.js
If you prefer a pinned/manual copy:
- Download jellymark.js from the release, or open the script and click Raw.
- Add a JavaScript Injector entry named JellyMark.
- Paste the entire file as JavaScript, enable it, and save.
- Fully reload Jellyfin.
An outlined bookmark adds an item; a filled bookmark removes it. Bookmarking an episode saves its season. Watched items are automatically removed from the Watchlist.
This adds the UI to Jellyfin web, not native apps such as Roku. TV remote navigation is handled by your separate navigation script.
Install the Watchlist on both servers first. Run one sync container on a machine that can reach both Jellyfin servers. Each Watchlist keeps working when sync is stopped.
Requirements: Docker and Bash, plus OpenSSL or Python 3 to generate the admin token.
-
Download and extract jellymark-v3.2.1.zip from the release. Open a terminal in the extracted
jellymarkfolder and run:bash run-docker.sh
-
Open
http://YOUR-SERVER-HOST:8788. Read the admin token locally withcat data/admin-token, paste it into the page, and click Unlock. Keep this token private. -
On each Jellyfin server, create an API key under Dashboard → API Keys. In the sync page, enter each server's address and its own key. Use the server address without
/web;localhostinside Docker refers to the sync container. -
Click Save connections, Test connections, then Load users.
-
Click Add pair, choose one user from each server, and set Direction to Two-way. For Initial bootstrap (the first sync), choose Merge to combine both existing lists. Use Make B match A only if A should replace B's matched Watchlist entries.
-
Review Auto-remove watched and Conflict winner, then click Save pairs. Enabled pairs start syncing immediately. Click Sync now to test an unwatched movie available on both servers.
Sync runs about every 15 seconds by default; change Poll seconds and save connections to adjust it. Use Refresh Watchlist if a change has not appeared yet. Only paired users are synced, and uncertain media matches are skipped.
Sync shares Watchlist membership. It does not copy media files, playback progress, watched status, or requests between servers.
- Watchlist UI: if you use the recommended JellyMark Loader, just reload Jellyfin Web after a stable update is pushed to
main. If you installed the full UI script manually, replace it with the new file and reload. - Sync service: back up your data, extract the new release, then run
DATA_DIR=/absolute/path/to/existing/data bash run-docker.sh. If upgrading an existing container with a different name, also setCONTAINER_NAMEto that name. Keep using the same data folder; it contains your settings, admin token, and sync history. - Trouble connecting or syncing? See setup options and troubleshooting.
- Found a bug? Open an issue with your Jellyfin/browser versions and steps to reproduce. Remove API keys, tokens, and personal details from screenshots or logs.
JellyMark v3.2.1 includes Watchlist UI 3.2.1 and JellyMark Sync 3.0.1. Licensed under MIT.