WatchState
Self-hosted service that syncs per-user play state across Plex, Jellyfin, and Emby media servers.
Platform availability
Available on 2 of 9 platforms
- Unraid
- TrueNAS (not listed)
- Umbrel (not listed)
- ZimaOS (not listed)
- Proxmox
- Helm (not listed)
- Mac (not listed)
- Windows (not listed)
- Linux (not listed)
Health score?A 0-100 score computed nightly from four factors: maintained (40%: recent commits and steady activity), popular (25%: GitHub stars, log scale), easy to install (20%: platforms, install notes, setup guides, Docker image) and light to run (15%: minimum RAM, ARM support). When the source code has been checked, a fifth factor, security check (20%: automated scan for committed secrets, unsafe desktop-app settings, known-vulnerable dependencies and project hygiene; any serious finding caps it at 20), is added. Factors without data are left out and the rest are rescaled.
76/100 Good
- Maintained
- 100last commit 12 days ago
- Popular
- 641,577 GitHub stars
- Easy to install
- 452 install platforms, install notes, Docker image
- Light to run
- No data
Based on 3 of 4 factors.
Availability: platform listings confirmed today, links checked 7 days ago
- GitHub stars
- 1,577
- Open issues
- 0
- Last commit
- 2026-10-03
- Latest release
- v1.10.8
- License
- MIT
- Activity
- declining
Checked 6 days ago - source: GitHub (arabcoders/watchstate)
Resources & Compatibility
ARM (e.g. Raspberry Pi) is supported.
Checked 17 days ago - source: Docker Hub image tags and published docs
First-install notes
- Create the first admin account Before using the app, create the initial WatchState admin account with a username and password. You need this account to log in and manage the app, and you can only create it before one already exists. source
- Check service paths and user If you start WatchState as a background Linux service, confirm it points to the correct PHP program (the tool that runs WatchState) and the actual WatchState folder, and runs as the watchstate user. Wrong paths or permissions make the service fail to start. source
- Preview user matches first Use the identity provisioning preview to see which Plex or Jellyfin users match your WatchState identities (the named people you want to track) and which are unmatched. Fix unmatched users before applying, or their activity won’t be attributed correctly. source
Fetched 17 days ago - each note links to its source
Variants
Alternatives
No alternatives collected yet.
Common questions
How should I mount WatchState data in Docker?
Create a local data directory and mount it to /config in the container, for example ./data:/config. The default compose example maps host port 8080 to container port 8080, and you can set the container user with UID.
What happens to existing records when path matching is enabled?
Path matching is enabled by default and generates guid_path values for new and refreshed movie and episode records unless WS_GUID_PATH_ENABLED is disabled. Existing records require a full import before they can match by path.
How do I create the initial account and connect media server users?
Create the first WatchState admin account with a username and password before one already exists. Use the identity provisioning preview to see which Plex or Jellyfin users match your identities, and fix unmatched users before applying so their activity is attributed correctly.
What should I check if WatchState fails as a systemd service?
Confirm the service points to the correct PHP program and the actual WatchState folder, and runs as the watchstate user. Wrong paths or permissions can make the service fail to start.
How do I audit media record problems in WatchState?
Use Media Health as the central place to audit media record problems, replacing the old parity, duplicate-reference, and file-integrity views. It reports backend metadata coverage, GUID conflicts, duplicate GUIDs, duplicate file references, structural metadata disagreement, path disagreement, weak matches, and optional local file checks.
Where do I get the webhook URL if I use the Docker installation video?
Copy the webhook URL directly from the backends page because the video has a small mistake about the webhook URL.
Answers sourced from github.com, github.com, github.com
Community
- Reddit (reddit)
- r/selfhosted on Reddit: WatchState: sync your watch state between ... (reddit)
- Is there any interest in watch state syncing without using ... - Reddit (reddit)
- Is there any interest in watch state syncing without using ... - Reddit (reddit)
- WatchState: sync your watch state between different media servers. (reddit)
Collected 16 days ago - public community threads