{"adoption": {"forks": 26, "observed_at": "2026-08-28T04:04:59.864719+00:00", "stars": 1535}, "canonical_url": "https://ross.abutalabs.com/products/watchstate", "card": {"archived": false, "artifact_type": "service", "description": "Self-hosted service to sync your plex, jellyfin and emby play state. without relying on 3rd-party external services.", "domain": ["media", "self-hosted"], "enriched": true, "function": ["self-hosted", "webhook", "backup", "scheduling", "developer-tools"], "health_score": 99, "homepage": null, "language": "PHP", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["arabcoders/watchstate"], "name": "arabcoders/watchstate", "platform": ["self-hosted"], "pushed_at": "2026-08-21T15:25:08+00:00", "repo": "arabcoders/watchstate", "stars": 1535, "tags": ["plex", "jellyfin", "emby", "watch-state-sync", "media-servers", "php", "automation", "docker", "web-server", "linux"], "topics": ["emby", "plex", "jellyfin", "watchstate", "webhook", "matched", "mismatched", "misidentified", "backup", "docker"], "urls": [], "use_cases": ["sync watch progress between plex and jellyfin", "keep emby and plex play state in sync", "backup my media server watch history", "sync watched status across multiple media servers without trakt", "receive webhooks from plex to update other backends", "find mismatched or misidentified media across backends", "multi-user watch state sync for family accounts"], "what_it_is": "WatchState is a self-hosted PHP service that synchronizes watch/play state between Plex, Jellyfin, and Emby media servers without third-party services. It supports multi-user identities, webhook ingestion, portable backups, and media metadata health auditing.", "when_to_avoid": ["you only use a single media server", "you need cloud-based or third-party sync services", "you don't want to self-host a Docker service"], "when_to_choose": ["you run multiple media servers (Plex, Jellyfin, Emby) and want their play states consistent", "you want sync without relying on external services like Trakt", "you need portable backups of watch state", "you want to audit metadata/GUID issues across backends"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/watchstate", "repo": "arabcoders/watchstate", "role": "main", "score": 94}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:59.864719+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:31:08.001901+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "840a59dc71c35042925e1f516b30f34193e885b54c7e91fc41693ed6fefcc6fc", "fetched_at": "2026-08-28T04:04:59.864719+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arabcoders/watchstate"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:59.864719+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:31:08.001901+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "840a59dc71c35042925e1f516b30f34193e885b54c7e91fc41693ed6fefcc6fc", "fetched_at": "2026-08-28T04:04:59.864719+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arabcoders/watchstate"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:31:08.001901+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "840a59dc71c35042925e1f516b30f34193e885b54c7e91fc41693ed6fefcc6fc", "fetched_at": "2026-08-28T04:04:59.864719+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arabcoders/watchstate"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:04:59.864719+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:59.864719+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:59.864719+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:31:08.001901+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "840a59dc71c35042925e1f516b30f34193e885b54c7e91fc41693ed6fefcc6fc", "fetched_at": "2026-08-28T04:04:59.864719+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arabcoders/watchstate"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:59.864719+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:59.864719+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:31:08.001901+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "840a59dc71c35042925e1f516b30f34193e885b54c7e91fc41693ed6fefcc6fc", "fetched_at": "2026-08-28T04:04:59.864719+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arabcoders/watchstate"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:59.864719+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:59.864719+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:59.864719+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:31:08.001901+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "840a59dc71c35042925e1f516b30f34193e885b54c7e91fc41693ed6fefcc6fc", "fetched_at": "2026-08-28T04:04:59.864719+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arabcoders/watchstate"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:59.864719+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:59.864719+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:31:08.001901+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "840a59dc71c35042925e1f516b30f34193e885b54c7e91fc41693ed6fefcc6fc", "fetched_at": "2026-08-28T04:04:59.864719+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arabcoders/watchstate"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:31:08.001901+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "840a59dc71c35042925e1f516b30f34193e885b54c7e91fc41693ed6fefcc6fc", "fetched_at": "2026-08-28T04:04:59.864719+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arabcoders/watchstate"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:31:08.001901+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "840a59dc71c35042925e1f516b30f34193e885b54c7e91fc41693ed6fefcc6fc", "fetched_at": "2026-08-28T04:04:59.864719+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arabcoders/watchstate"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:31:08.001901+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "840a59dc71c35042925e1f516b30f34193e885b54c7e91fc41693ed6fefcc6fc", "fetched_at": "2026-08-28T04:04:59.864719+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arabcoders/watchstate"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 98, "longevity": 100, "rhythm": 86}, "computed_at": "2026-09-03T02:39:23.370411+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 1665, "days_push": 12, "days_rel": 13, "gap_med": 3.0, "n_releases_24m": 89}, "score": 94, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}