Self-hosted service to sync your plex, jellyfin and emby play state. without relying on 3rd-party external services.
1.5k
Stars
24
Forks
0
Open issues
6
Contributors
AI Analysis
WatchState is a self-hosted service that synchronizes play state and watch progress across Plex, Jellyfin, and Emby media servers without relying on third-party external services. It is purpose-built for multi-user media server environments where administrators need centralized cross-backend synchronization, metadata matching, and backup capabilities. This tool benefits media server operators managing multiple backends; it is not for casual single-server users or those comfortable with vendor...
Inferred from signals mentioned in the README (tests, CI, type safety) — not a review of the actual code.
AI's overall editorial judgment — not an average of the bars above, can weigh other factors too.
Self-hosted play-state sync bridge for Plex, Jellyfin, and Emby — no third-party accounts required
WatchState solves a specific, recurring pain point for self-hosted media server users: keeping watch history and play states synchronized across Plex, Jellyfin, and Emby without routing data through external cloud services. It targets privacy-conscious home lab operators and media enthusiasts running multiple servers who find manual sync cumbersome. The tool supports webhooks, scheduled polling, multi-user identities, backup/restore, parity checks, and path-based matching. Active Docker adoption (badge visible in README) and community video coverage on Unraid suggest meaningful organic traction within the self-hosted media community.
Created in February 2022, likely as a personal tool to fill a gap left by Trakt.tv-dependent sync workflows. Has matured through multiple schema versions, most recently a versioned v02 database migration in 2026, indicating sustained development over four years.
Growth appears driven by word-of-mouth within the Jellyfin/Plex/Emby self-hosting community, Unraid Community Applications inclusion, and YouTube tutorial coverage. At 1,449 stars with only 22 forks, the user base consumes rather than extends the tool, consistent with an appliance-style niche project. Recent star gain is modest (3 in 7 days), suggesting a stable rather than accelerating audience.
Docker pull badge and GHCR pull badge are present but counts are not quoted in the README excerpt. Unraid Community Applications listing and at least one third-party YouTube tutorial confirm community-level real-world deployment. Adoption appears limited primarily to self-hosted home lab users; no evidence of enterprise or organizational deployment.
Likely a containerized PHP application with a web UI (accessible at port 8080), a scheduled task system, and a webhook listener. Appears to use a local SQLite or file-based database given the described migration of .migrated backup files on schema upgrade. The rootless container design and UID/GID mapping suggest security-conscious architecture choices.
not documented in README
Last push was 2026-06-18 — one day before the evaluation date — indicating very active, ongoing maintenance. Recent changelog entries (May and April 2026) show feature additions and schema migrations, not just bug fixes. The project appears in sustained active development, not merely kept alive.
ADOPT IF: you run two or more of Plex, Jellyfin, or Emby and want watch state kept in sync without depending on Trakt or any external service, and you are comfortable managing a Docker container. AVOID IF: you use only one media server, have no interest in self-hosting additional services, or require enterprise-grade support SLAs. MONITOR IF: you are evaluating whether to migrate away from Trakt-based sync workflows and want to see how path-matching and multi-user features mature before committing.
Independent dimensions
Mainstream potential
3/10
Technical importance
7/10
Adoption evidence
4/10
- Single maintainer dependency — the project appears to be driven primarily by one developer, creating a bus-factor risk for long-term continuity.
- Low fork count (22) means community contributions are limited; feature direction and bug fixes depend heavily on the original author.
- Schema migrations (e.g., v02 upgrade) can cause startup disruption; users on automated update pipelines may encounter unexpected downtime.
- PHP runtime dependency may be a friction point for users already managing Python or Node-based self-hosted stacks.
- Upstream API changes from Plex, Jellyfin, or Emby could break sync functionality with no guaranteed timeline for fixes.
Likely to remain a well-maintained niche tool with a loyal self-hosted media community base. Mainstream potential is limited by the specificity of the use case, but within its niche it appears durable and improving.
Explore similar
Newsletter
Get analyses like this every Monday
Free weekly digest of the most interesting open-source discoveries.
Languages
Information
- Language
- PHP
- License
- MIT
- Last updated
- 1d ago
- Created
- 54mo ago
- Analyzed with
- anthropic/claude-haiku-4-5
Stars over time
Contributors over time
Top 100 contributors only — repos with more will plateau at 100.
Open issues
No open issues — clean slate.
Open pull requests
No open pull requests.
Top contributors
Recent releases
Similar repos
connorgallopo/Tracearr
Tracearr is a real-time monitoring dashboard for Plex, Jellyfin, and Emby media...
| Repository | Stars | Week Δ | Language | Score | Updated |
|---|---|---|---|---|---|
|
|
1.5k | +15 | PHP | 8/10 | 1d ago |
|
|
2.1k | — | TypeScript | 8/10 | 14h ago |
|
|
1.4k | — | Go | 7/10 | 5d ago |
|
|
2.8k | — | Python | 7/10 | 3d ago |
|
|
4.1k | — | C# | 7/10 | 2w ago |
|
|
11.8k | — | TypeScript | 8/10 | 21h ago |
Trakt-based sync requires an external account and depends on a third-party service's uptime and API. WatchState eliminates that dependency but requires self-hosting infrastructure the user must manage.
Jellyfin has no native cross-backend sync with Plex or Emby. WatchState fills a gap that upstream projects have not addressed.
Maintainerr focuses on media lifecycle management and cleanup rules, not play-state sync. Different problem space, different audience, though both target self-hosted Plex/Jellyfin operators.
Much smaller project (124 stars) with overlapping territory but appears Go-based and less documented. WatchState has a longer track record and more visible community adoption.
