{"adoption": {"forks": 41, "observed_at": "2026-08-28T04:03:19.315824+00:00", "stars": 1036}, "canonical_url": "https://ross.abutalabs.com/products/jellyplex-watched", "card": {"archived": false, "artifact_type": "application", "description": "Sync watched status between jellyfin, plex and emby locally", "domain": ["media", "self-hosted"], "enriched": true, "function": ["workflow-automation", "developer-tools"], "health_score": 90, "homepage": null, "language": "Python", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["luigi311/JellyPlex-Watched"], "name": "luigi311/JellyPlex-Watched", "platform": ["self-hosted", "python", "cross-platform"], "pushed_at": "2026-06-04T16:41:54+00:00", "repo": "luigi311/JellyPlex-Watched", "stars": 1036, "tags": ["jellyfin", "plex", "emby", "watched-status-sync", "media-servers", "home-server", "automation", "docker"], "topics": [], "urls": [], "use_cases": ["sync watched status between plex and jellyfin", "keep emby and jellyfin watch history in sync", "migrate watched history from plex to jellyfin", "sync in-progress playback position across media servers", "sync watched status for multiple users between media servers", "run scheduled watched sync between self-hosted media servers"], "what_it_is": "A self-hosted Python application that synchronizes watched status and watch history between Jellyfin, Plex, and Emby media servers. It matches content via filenames and provider IDs, supports multiple servers and user mapping, and runs via Docker or directly with uv.", "when_to_avoid": ["you only use a single media server", "you need to sync view dates on Plex (not yet supported)", "your libraries have inconsistent filenames and lack provider IDs, since matching may fail"], "when_to_choose": ["you run two or more of Plex, Jellyfin, or Emby and want watched states consistent", "you want a local, self-hosted sync without relying on cloud services", "you need per-user watched sync with username mapping"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/jellyplex-watched", "repo": "luigi311/JellyPlex-Watched", "role": "main", "score": 84}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:19.315824+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T07:04:41.572523+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8db387f2515e3455d5d39db8fe41eacebf73802cdfade1b896ca4a7aa72b549", "fetched_at": "2026-08-28T04:03:19.315824+00:00", "kind": "readme", "missing": false, "url": "https://github.com/luigi311/JellyPlex-Watched"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:19.315824+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T07:04:41.572523+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8db387f2515e3455d5d39db8fe41eacebf73802cdfade1b896ca4a7aa72b549", "fetched_at": "2026-08-28T04:03:19.315824+00:00", "kind": "readme", "missing": false, "url": "https://github.com/luigi311/JellyPlex-Watched"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T07:04:41.572523+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8db387f2515e3455d5d39db8fe41eacebf73802cdfade1b896ca4a7aa72b549", "fetched_at": "2026-08-28T04:03:19.315824+00:00", "kind": "readme", "missing": false, "url": "https://github.com/luigi311/JellyPlex-Watched"}], "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:03:19.315824+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:19.315824+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:19.315824+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T07:04:41.572523+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8db387f2515e3455d5d39db8fe41eacebf73802cdfade1b896ca4a7aa72b549", "fetched_at": "2026-08-28T04:03:19.315824+00:00", "kind": "readme", "missing": false, "url": "https://github.com/luigi311/JellyPlex-Watched"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:19.315824+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:19.315824+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T07:04:41.572523+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8db387f2515e3455d5d39db8fe41eacebf73802cdfade1b896ca4a7aa72b549", "fetched_at": "2026-08-28T04:03:19.315824+00:00", "kind": "readme", "missing": false, "url": "https://github.com/luigi311/JellyPlex-Watched"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:19.315824+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:19.315824+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:19.315824+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T07:04:41.572523+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8db387f2515e3455d5d39db8fe41eacebf73802cdfade1b896ca4a7aa72b549", "fetched_at": "2026-08-28T04:03:19.315824+00:00", "kind": "readme", "missing": false, "url": "https://github.com/luigi311/JellyPlex-Watched"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:19.315824+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:19.315824+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T07:04:41.572523+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8db387f2515e3455d5d39db8fe41eacebf73802cdfade1b896ca4a7aa72b549", "fetched_at": "2026-08-28T04:03:19.315824+00:00", "kind": "readme", "missing": false, "url": "https://github.com/luigi311/JellyPlex-Watched"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T07:04:41.572523+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8db387f2515e3455d5d39db8fe41eacebf73802cdfade1b896ca4a7aa72b549", "fetched_at": "2026-08-28T04:03:19.315824+00:00", "kind": "readme", "missing": false, "url": "https://github.com/luigi311/JellyPlex-Watched"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T07:04:41.572523+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8db387f2515e3455d5d39db8fe41eacebf73802cdfade1b896ca4a7aa72b549", "fetched_at": "2026-08-28T04:03:19.315824+00:00", "kind": "readme", "missing": false, "url": "https://github.com/luigi311/JellyPlex-Watched"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T07:04:41.572523+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8db387f2515e3455d5d39db8fe41eacebf73802cdfade1b896ca4a7aa72b549", "fetched_at": "2026-08-28T04:03:19.315824+00:00", "kind": "readme", "missing": false, "url": "https://github.com/luigi311/JellyPlex-Watched"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 85, "longevity": 100, "rhythm": 74}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 1565, "days_push": 90, "days_rel": 97, "gap_med": 38.5, "n_releases_24m": 17}, "score": 84, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}