arabcoders

arabcoders/watchstate

PHP MIT Media

Self-hosted service to sync your plex, jellyfin and emby play state. without relying on 3rd-party external services.

1.5k stars
24 forks
active
GitHub +15 / week

1.5k

Stars

24

Forks

0

Open issues

6

Contributors

v1.9.1 25 Jun 2026

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...

Media Application Discovery value: 6/10
Documentation 8/10
Activity 9/10
Community 7/10
Code quality 5/10

Inferred from signals mentioned in the README (tests, CI, type safety) — not a review of the actual code.

Overall score 8/10

AI's overall editorial judgment — not an average of the bars above, can weigh other factors too.

media-server-sync self-hosted multi-backend playstate-tracking docker-native
Actively maintained Well documented MIT licensed Niche/specialized use case Production ready
Deep Analysis · Based on README and public signals
3w ago

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.

Origin

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

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.

In production

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.

Code analysis
Architecture

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.

Tests

not documented in README

Maintenance

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.

Honest verdict

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

Risks
  • 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.
Prediction

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.

0 found this helpful

Newsletter

Get analyses like this every Monday

Free weekly digest of the most interesting open-source discoveries.

Languages

PHP
74.3%
Vue
22.5%
TypeScript
2.7%
CSS
0.2%
HTML
0.1%
Dockerfile
0.1%
Shell
0.1%
JavaScript
0%

Information

Language
PHP
License
MIT
Last updated
1d ago
Created
54mo ago
Analyzed with
anthropic/claude-haiku-4-5

Stars over time

Loading…

Contributors over time

Top 100 contributors only — repos with more will plateau at 100.

Loading…

Open issues

No open issues — clean slate.

Open pull requests

No open pull requests.

Similar repos

connorgallopo

connorgallopo/Tracearr

Tracearr is a real-time monitoring dashboard for Plex, Jellyfin, and Emby media...

2.1k TypeScript Media
sbondCo

sbondCo/Watcharr

Watcharr is a self-hosted content tracking application that lets users maintain...

1.4k Go Media
meeb

meeb/tubesync

TubeSync is a self-hosted PVR (personal video recorder) for YouTube that...

2.8k Python Media
Ombi-app

Ombi-app/Ombi

Ombi is a self-hosted media request management tool that integrates with Plex,...

4.1k C# Media
seerr-team

seerr-team/seerr

Seerr is a free, open-source media request and discovery manager that...

11.8k TypeScript Media
vs. alternatives
Trakt.tv sync (via Jellyfin/Plex plugins)

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 native sync

Jellyfin has no native cross-backend sync with Plex or Emby. WatchState fills a gap that upstream projects have not addressed.

Maintainerr

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.

MediaStationGo

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.