{"adoption": {"forks": 123, "observed_at": "2026-08-28T04:05:23.899689+00:00", "stars": 1696}, "canonical_url": "https://ross.abutalabs.com/products/threadfin", "card": {"archived": false, "artifact_type": "service", "description": "an M3U proxy for Kernel/Plex/Jellyfin/Emby based on xTeVe", "domain": ["media", "self-hosted", "web-development"], "enriched": true, "function": ["proxy", "streaming", "http-server"], "health_score": 62, "homepage": null, "language": "Go", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["Threadfin/Threadfin"], "name": "Threadfin/Threadfin", "platform": ["self-hosted", "cross-platform", "go"], "pushed_at": "2025-10-03T15:28:35+00:00", "repo": "Threadfin/Threadfin", "stars": 1696, "tags": ["m3u-proxy", "iptv", "xmltv", "plex", "jellyfin", "emby", "live-tv", "epg", "xteve-fork", "docker", "linux"], "topics": ["hacktoberfest"], "urls": [], "use_cases": ["proxy m3u playlists into plex dvr", "use iptv m3u streams with jellyfin live tv", "merge multiple m3u and xmltv files into one playlist", "filter and map iptv channels for emby live tv", "self-host an xteve replacement with docker", "renumber and reorder iptv channels with logos and categories"], "what_it_is": "Threadfin is an M3U proxy server for Plex DVR and Emby/Jellyfin Live TV, forked from xTeVe. It merges and filters external M3U playlists and XMLTV EPG files, manages channel mapping, and re-streams channels with an adjustable number of tuners.", "when_to_avoid": ["you need a general-purpose video streaming or transcoding server rather than an M3U proxy", "you want a turnkey IPTV player rather than middleware between playlists and a DVR/media server", "you require guaranteed production stability from the beta branch features"], "when_to_choose": ["you use Plex, Emby, or Jellyfin and want to consume IPTV M3U streams as live TV", "you need to merge, filter, or renumber multiple M3U/XMLTV sources", "you want a maintained fork of xTeVe with a modern UI and RAM-based buffering"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/threadfin", "repo": "Threadfin/Threadfin", "role": "main", "score": 57}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:23.899689+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:37:53.037311+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "07d17c39673dabc9c2d5ef36f2617f07513fb836f250b2096d0f3196f4c0cfb3", "fetched_at": "2026-08-28T04:05:23.899689+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Threadfin/Threadfin"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:23.899689+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:37:53.037311+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "07d17c39673dabc9c2d5ef36f2617f07513fb836f250b2096d0f3196f4c0cfb3", "fetched_at": "2026-08-28T04:05:23.899689+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Threadfin/Threadfin"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:37:53.037311+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "07d17c39673dabc9c2d5ef36f2617f07513fb836f250b2096d0f3196f4c0cfb3", "fetched_at": "2026-08-28T04:05:23.899689+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Threadfin/Threadfin"}], "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:05:23.899689+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:23.899689+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:23.899689+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:37:53.037311+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "07d17c39673dabc9c2d5ef36f2617f07513fb836f250b2096d0f3196f4c0cfb3", "fetched_at": "2026-08-28T04:05:23.899689+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Threadfin/Threadfin"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:23.899689+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:23.899689+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:37:53.037311+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "07d17c39673dabc9c2d5ef36f2617f07513fb836f250b2096d0f3196f4c0cfb3", "fetched_at": "2026-08-28T04:05:23.899689+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Threadfin/Threadfin"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:23.899689+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:23.899689+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:23.899689+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:37:53.037311+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "07d17c39673dabc9c2d5ef36f2617f07513fb836f250b2096d0f3196f4c0cfb3", "fetched_at": "2026-08-28T04:05:23.899689+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Threadfin/Threadfin"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:23.899689+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:23.899689+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:37:53.037311+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "07d17c39673dabc9c2d5ef36f2617f07513fb836f250b2096d0f3196f4c0cfb3", "fetched_at": "2026-08-28T04:05:23.899689+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Threadfin/Threadfin"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:37:53.037311+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "07d17c39673dabc9c2d5ef36f2617f07513fb836f250b2096d0f3196f4c0cfb3", "fetched_at": "2026-08-28T04:05:23.899689+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Threadfin/Threadfin"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:37:53.037311+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "07d17c39673dabc9c2d5ef36f2617f07513fb836f250b2096d0f3196f4c0cfb3", "fetched_at": "2026-08-28T04:05:23.899689+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Threadfin/Threadfin"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:37:53.037311+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "07d17c39673dabc9c2d5ef36f2617f07513fb836f250b2096d0f3196f4c0cfb3", "fetched_at": "2026-08-28T04:05:23.899689+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Threadfin/Threadfin"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 45, "longevity": 100, "rhythm": 47}, "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": 1574, "days_push": 334, "days_rel": 356, "gap_med": 6, "n_releases_24m": 30}, "score": 57, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}