{"adoption": {"forks": 212, "observed_at": "2026-08-28T04:07:30.035943+00:00", "stars": 2917}, "canonical_url": "https://ross.abutalabs.com/products/legacy", "card": {"archived": false, "artifact_type": "application", "description": "Open-source platform that transforms your personal media library into live, custom TV channels.", "domain": ["media", "self-hosted"], "enriched": true, "function": ["streaming", "video-processing", "scheduling", "self-hosted"], "health_score": 99, "homepage": "https://ersatztv.org/", "language": "C#", "license": "Zlib", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["ErsatzTV/legacy"], "name": "ErsatzTV/legacy", "platform": ["windows", "self-hosted"], "pushed_at": "2026-08-20T16:14:29+00:00", "repo": "ErsatzTV/legacy", "stars": 2917, "tags": ["iptv", "epg", "live-tv", "media-server", "plex", "jellyfin", "emby", "ffmpeg", "transcoding", "pseudotv", "video", "linux", "macos", "docker"], "topics": [], "urls": [], "use_cases": ["turn my plex library into live tv channels", "self-hosted iptv server with epg", "create custom tv channel schedules from my media", "stream my movie collection as a live tv channel", "generate electronic program guide for custom channels", "hardware accelerated transcoding for iptv streaming", "dizquetv alternative for custom live channels"], "what_it_is": "ErsatzTV (legacy) is an open-source, self-hosted IPTV server that turns a personal media library into custom live TV channels with EPG and scheduling. It streams via IPTV with hardware-accelerated transcoding and integrates with Plex, Jellyfin, and Emby.", "when_to_avoid": ["you want a lightweight transcoding-only server paired with third-party schedulers (consider ErsatzTV Next instead)", "you need on-demand streaming rather than scheduled live channels", "you require a project under heavy active feature development, since legacy is in maintenance mode"], "when_to_choose": ["you want an all-in-one self-hosted IPTV server with scheduling, EPG, and transcoding built in", "you use Plex, Jellyfin, or Emby and want to broadcast your library as live TV", "you need hardware-accelerated transcoding (NVENC, QSV, VAAPI, AMF, VideoToolbox)"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/legacy", "repo": "ErsatzTV/legacy", "role": "main", "score": 98}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:30.035943+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T07:34:04.169984+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ccb10688f399e0848f86b2e2aa8a433f6e2159a8923ceb7d0b178947075b6334", "fetched_at": "2026-08-28T04:07:30.035943+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ErsatzTV/legacy"}, {"content_hash": "e0e89271b67b7f6d6c486e0b4674198e27b94b3f2ea4a6719ad22e22cdd20571", "fetched_at": "2026-08-29T09:49:15.644184+00:00", "kind": "homepage", "missing": false, "url": "https://ersatztv.org/"}, {"content_hash": "f70d22e1e3f032cb03a7258558f61fcd0b0729ee8e0cd73569801bac520b4942", "fetched_at": "2026-08-29T09:49:15.653200+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/next-docs"}, {"content_hash": "edbc5677b988b94dc48749ce8f4c38b60576f45d893ee759d8a169bd768ca631", "fetched_at": "2026-08-29T09:49:15.654860+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/docs"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:30.035943+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T07:34:04.169984+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ccb10688f399e0848f86b2e2aa8a433f6e2159a8923ceb7d0b178947075b6334", "fetched_at": "2026-08-28T04:07:30.035943+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ErsatzTV/legacy"}, {"content_hash": "e0e89271b67b7f6d6c486e0b4674198e27b94b3f2ea4a6719ad22e22cdd20571", "fetched_at": "2026-08-29T09:49:15.644184+00:00", "kind": "homepage", "missing": false, "url": "https://ersatztv.org/"}, {"content_hash": "f70d22e1e3f032cb03a7258558f61fcd0b0729ee8e0cd73569801bac520b4942", "fetched_at": "2026-08-29T09:49:15.653200+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/next-docs"}, {"content_hash": "edbc5677b988b94dc48749ce8f4c38b60576f45d893ee759d8a169bd768ca631", "fetched_at": "2026-08-29T09:49:15.654860+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/docs"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T07:34:04.169984+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ccb10688f399e0848f86b2e2aa8a433f6e2159a8923ceb7d0b178947075b6334", "fetched_at": "2026-08-28T04:07:30.035943+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ErsatzTV/legacy"}, {"content_hash": "e0e89271b67b7f6d6c486e0b4674198e27b94b3f2ea4a6719ad22e22cdd20571", "fetched_at": "2026-08-29T09:49:15.644184+00:00", "kind": "homepage", "missing": false, "url": "https://ersatztv.org/"}, {"content_hash": "f70d22e1e3f032cb03a7258558f61fcd0b0729ee8e0cd73569801bac520b4942", "fetched_at": "2026-08-29T09:49:15.653200+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/next-docs"}, {"content_hash": "edbc5677b988b94dc48749ce8f4c38b60576f45d893ee759d8a169bd768ca631", "fetched_at": "2026-08-29T09:49:15.654860+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/docs"}], "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:07:30.035943+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:30.035943+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:30.035943+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T07:34:04.169984+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ccb10688f399e0848f86b2e2aa8a433f6e2159a8923ceb7d0b178947075b6334", "fetched_at": "2026-08-28T04:07:30.035943+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ErsatzTV/legacy"}, {"content_hash": "e0e89271b67b7f6d6c486e0b4674198e27b94b3f2ea4a6719ad22e22cdd20571", "fetched_at": "2026-08-29T09:49:15.644184+00:00", "kind": "homepage", "missing": false, "url": "https://ersatztv.org/"}, {"content_hash": "f70d22e1e3f032cb03a7258558f61fcd0b0729ee8e0cd73569801bac520b4942", "fetched_at": "2026-08-29T09:49:15.653200+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/next-docs"}, {"content_hash": "edbc5677b988b94dc48749ce8f4c38b60576f45d893ee759d8a169bd768ca631", "fetched_at": "2026-08-29T09:49:15.654860+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/docs"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:30.035943+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:30.035943+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T07:34:04.169984+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ccb10688f399e0848f86b2e2aa8a433f6e2159a8923ceb7d0b178947075b6334", "fetched_at": "2026-08-28T04:07:30.035943+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ErsatzTV/legacy"}, {"content_hash": "e0e89271b67b7f6d6c486e0b4674198e27b94b3f2ea4a6719ad22e22cdd20571", "fetched_at": "2026-08-29T09:49:15.644184+00:00", "kind": "homepage", "missing": false, "url": "https://ersatztv.org/"}, {"content_hash": "f70d22e1e3f032cb03a7258558f61fcd0b0729ee8e0cd73569801bac520b4942", "fetched_at": "2026-08-29T09:49:15.653200+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/next-docs"}, {"content_hash": "edbc5677b988b94dc48749ce8f4c38b60576f45d893ee759d8a169bd768ca631", "fetched_at": "2026-08-29T09:49:15.654860+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/docs"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:30.035943+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:30.035943+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:30.035943+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T07:34:04.169984+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ccb10688f399e0848f86b2e2aa8a433f6e2159a8923ceb7d0b178947075b6334", "fetched_at": "2026-08-28T04:07:30.035943+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ErsatzTV/legacy"}, {"content_hash": "e0e89271b67b7f6d6c486e0b4674198e27b94b3f2ea4a6719ad22e22cdd20571", "fetched_at": "2026-08-29T09:49:15.644184+00:00", "kind": "homepage", "missing": false, "url": "https://ersatztv.org/"}, {"content_hash": "f70d22e1e3f032cb03a7258558f61fcd0b0729ee8e0cd73569801bac520b4942", "fetched_at": "2026-08-29T09:49:15.653200+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/next-docs"}, {"content_hash": "edbc5677b988b94dc48749ce8f4c38b60576f45d893ee759d8a169bd768ca631", "fetched_at": "2026-08-29T09:49:15.654860+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/docs"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:30.035943+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:30.035943+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T07:34:04.169984+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ccb10688f399e0848f86b2e2aa8a433f6e2159a8923ceb7d0b178947075b6334", "fetched_at": "2026-08-28T04:07:30.035943+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ErsatzTV/legacy"}, {"content_hash": "e0e89271b67b7f6d6c486e0b4674198e27b94b3f2ea4a6719ad22e22cdd20571", "fetched_at": "2026-08-29T09:49:15.644184+00:00", "kind": "homepage", "missing": false, "url": "https://ersatztv.org/"}, {"content_hash": "f70d22e1e3f032cb03a7258558f61fcd0b0729ee8e0cd73569801bac520b4942", "fetched_at": "2026-08-29T09:49:15.653200+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/next-docs"}, {"content_hash": "edbc5677b988b94dc48749ce8f4c38b60576f45d893ee759d8a169bd768ca631", "fetched_at": "2026-08-29T09:49:15.654860+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/docs"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T07:34:04.169984+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ccb10688f399e0848f86b2e2aa8a433f6e2159a8923ceb7d0b178947075b6334", "fetched_at": "2026-08-28T04:07:30.035943+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ErsatzTV/legacy"}, {"content_hash": "e0e89271b67b7f6d6c486e0b4674198e27b94b3f2ea4a6719ad22e22cdd20571", "fetched_at": "2026-08-29T09:49:15.644184+00:00", "kind": "homepage", "missing": false, "url": "https://ersatztv.org/"}, {"content_hash": "f70d22e1e3f032cb03a7258558f61fcd0b0729ee8e0cd73569801bac520b4942", "fetched_at": "2026-08-29T09:49:15.653200+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/next-docs"}, {"content_hash": "edbc5677b988b94dc48749ce8f4c38b60576f45d893ee759d8a169bd768ca631", "fetched_at": "2026-08-29T09:49:15.654860+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/docs"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T07:34:04.169984+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ccb10688f399e0848f86b2e2aa8a433f6e2159a8923ceb7d0b178947075b6334", "fetched_at": "2026-08-28T04:07:30.035943+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ErsatzTV/legacy"}, {"content_hash": "e0e89271b67b7f6d6c486e0b4674198e27b94b3f2ea4a6719ad22e22cdd20571", "fetched_at": "2026-08-29T09:49:15.644184+00:00", "kind": "homepage", "missing": false, "url": "https://ersatztv.org/"}, {"content_hash": "f70d22e1e3f032cb03a7258558f61fcd0b0729ee8e0cd73569801bac520b4942", "fetched_at": "2026-08-29T09:49:15.653200+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/next-docs"}, {"content_hash": "edbc5677b988b94dc48749ce8f4c38b60576f45d893ee759d8a169bd768ca631", "fetched_at": "2026-08-29T09:49:15.654860+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/docs"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T07:34:04.169984+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ccb10688f399e0848f86b2e2aa8a433f6e2159a8923ceb7d0b178947075b6334", "fetched_at": "2026-08-28T04:07:30.035943+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ErsatzTV/legacy"}, {"content_hash": "e0e89271b67b7f6d6c486e0b4674198e27b94b3f2ea4a6719ad22e22cdd20571", "fetched_at": "2026-08-29T09:49:15.644184+00:00", "kind": "homepage", "missing": false, "url": "https://ersatztv.org/"}, {"content_hash": "f70d22e1e3f032cb03a7258558f61fcd0b0729ee8e0cd73569801bac520b4942", "fetched_at": "2026-08-29T09:49:15.653200+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/next-docs"}, {"content_hash": "edbc5677b988b94dc48749ce8f4c38b60576f45d893ee759d8a169bd768ca631", "fetched_at": "2026-08-29T09:49:15.654860+00:00", "kind": "site_page", "missing": false, "url": "https://ersatztv.org/docs"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 98, "longevity": 100, "rhythm": 98}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2031, "days_push": 13, "days_rel": 13, "gap_med": 19, "n_releases_24m": 22}, "score": 98, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}