{"adoption": {"forks": 226, "observed_at": "2026-08-28T04:04:50.641998+00:00", "stars": 1480}, "canonical_url": "https://ross.abutalabs.com/products/nodecast-tv", "card": {"archived": false, "artifact_type": "application", "description": "A self-hosted web application that lets you stream Live TV, Movies, and Series from your Xtream Codes or M3U provider directly in your browser. It's built with performance in mind and handles large libraries smoothly.", "domain": ["media", "self-hosted", "web-development"], "enriched": true, "function": ["http-server", "streaming", "auth", "video-processing", "web-framework"], "health_score": 79, "homepage": null, "language": "JavaScript", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["technomancer702/nodecast-tv"], "name": "technomancer702/nodecast-tv", "platform": ["self-hosted", "cross-platform"], "pushed_at": "2026-03-02T23:10:21+00:00", "repo": "technomancer702/nodecast-tv", "stars": 1480, "tags": ["iptv", "xtream-codes", "m3u", "epg", "vod", "live-tv", "transcoding", "media-server", "oidc-sso", "video", "nodejs", "web-server", "docker"], "topics": [], "urls": [], "use_cases": ["stream my IPTV provider's live channels in a browser", "self-host a web player for my Xtream Codes subscription", "watch M3U playlist movies and series with metadata and posters", "view an interactive EPG TV guide for my channels", "transcode streams with GPU acceleration for smooth playback", "share IPTV access with family using user accounts and SSO", "handle a playlist with thousands of channels without lag"], "what_it_is": "nodecast-tv is a self-hosted web-based IPTV player that streams Live TV, Movies, and Series from Xtream Codes or M3U providers directly in the browser. It includes an EPG guide, favorites, user authentication with OIDC SSO, and GPU-accelerated transcoding, optimized for very large playlists.", "when_to_avoid": ["you need a native TV or mobile app rather than a web interface", "you want a full media server that manages your own local files like Jellyfin or Plex", "you don't have an IPTV provider or M3U playlist to consume", "you need DVR/recording functionality"], "when_to_choose": ["you want a browser-based self-hosted IPTV frontend for Xtream Codes or M3U sources", "you need EPG, VOD, and series support in one app", "you have a very large playlist and need virtual scrolling performance", "you want hardware-accelerated transcoding and Docker deployment"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/nodecast-tv", "repo": "technomancer702/nodecast-tv", "role": "main", "score": 58}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:50.641998+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:34:16.265021+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7795dba3fe697e802496f2d9693d3bed352f241d72b715c77bc8ea6e57b355e7", "fetched_at": "2026-08-28T04:04:50.641998+00:00", "kind": "readme", "missing": false, "url": "https://github.com/technomancer702/nodecast-tv"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:50.641998+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:34:16.265021+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7795dba3fe697e802496f2d9693d3bed352f241d72b715c77bc8ea6e57b355e7", "fetched_at": "2026-08-28T04:04:50.641998+00:00", "kind": "readme", "missing": false, "url": "https://github.com/technomancer702/nodecast-tv"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:34:16.265021+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7795dba3fe697e802496f2d9693d3bed352f241d72b715c77bc8ea6e57b355e7", "fetched_at": "2026-08-28T04:04:50.641998+00:00", "kind": "readme", "missing": false, "url": "https://github.com/technomancer702/nodecast-tv"}], "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:50.641998+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:50.641998+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:50.641998+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:34:16.265021+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7795dba3fe697e802496f2d9693d3bed352f241d72b715c77bc8ea6e57b355e7", "fetched_at": "2026-08-28T04:04:50.641998+00:00", "kind": "readme", "missing": false, "url": "https://github.com/technomancer702/nodecast-tv"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:50.641998+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:50.641998+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:34:16.265021+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7795dba3fe697e802496f2d9693d3bed352f241d72b715c77bc8ea6e57b355e7", "fetched_at": "2026-08-28T04:04:50.641998+00:00", "kind": "readme", "missing": false, "url": "https://github.com/technomancer702/nodecast-tv"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:50.641998+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:50.641998+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:50.641998+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:34:16.265021+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7795dba3fe697e802496f2d9693d3bed352f241d72b715c77bc8ea6e57b355e7", "fetched_at": "2026-08-28T04:04:50.641998+00:00", "kind": "readme", "missing": false, "url": "https://github.com/technomancer702/nodecast-tv"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:50.641998+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:50.641998+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:34:16.265021+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7795dba3fe697e802496f2d9693d3bed352f241d72b715c77bc8ea6e57b355e7", "fetched_at": "2026-08-28T04:04:50.641998+00:00", "kind": "readme", "missing": false, "url": "https://github.com/technomancer702/nodecast-tv"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:34:16.265021+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7795dba3fe697e802496f2d9693d3bed352f241d72b715c77bc8ea6e57b355e7", "fetched_at": "2026-08-28T04:04:50.641998+00:00", "kind": "readme", "missing": false, "url": "https://github.com/technomancer702/nodecast-tv"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:34:16.265021+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7795dba3fe697e802496f2d9693d3bed352f241d72b715c77bc8ea6e57b355e7", "fetched_at": "2026-08-28T04:04:50.641998+00:00", "kind": "readme", "missing": false, "url": "https://github.com/technomancer702/nodecast-tv"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:34:16.265021+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "7795dba3fe697e802496f2d9693d3bed352f241d72b715c77bc8ea6e57b355e7", "fetched_at": "2026-08-28T04:04:50.641998+00:00", "kind": "readme", "missing": false, "url": "https://github.com/technomancer702/nodecast-tv"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 70, "longevity": 17, "rhythm": 66}, "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": 249, "days_push": 184, "days_rel": 226, "gap_med": 0, "n_releases_24m": 14}, "score": 58, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}