{"adoption": {"forks": 107, "observed_at": "2026-08-28T04:03:56.470802+00:00", "stars": 1193}, "canonical_url": "https://ross.abutalabs.com/products/stream-rec", "card": {"archived": true, "artifact_type": "application", "description": "Automatic streaming record tool.  Live stream and bullet comments recorder. 虎牙/抖音/斗鱼/Twitch/PandaTV/微博直播，弹幕自动录制", "domain": ["media", "self-hosted", "developer-tools"], "enriched": true, "function": ["video-processing", "streaming", "http-server", "cli"], "health_score": 10, "homepage": "https://stream-rec.github.io/docs/", "language": "Kotlin", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["stream-rec/stream-rec"], "name": "stream-rec/stream-rec", "platform": ["self-hosted", "cross-platform"], "pushed_at": "2025-12-18T12:35:15+00:00", "repo": "stream-rec/stream-rec", "stars": 1193, "tags": ["stream-recording", "live-stream", "danmu", "bullet-comments", "twitch", "douyin", "huya", "douyu", "rclone", "ffmpeg", "kotlin", "ktor", "automation", "docker", "web-server"], "topics": ["douyin", "huya", "streaming-recorder", "downloader", "douyu", "twitch"], "urls": [], "use_cases": ["automatically record twitch live streams", "record douyin live stream with danmu", "download huya livestreams automatically", "save bullet comments while recording a stream", "auto-upload recorded streams to cloud storage", "self-hosted live stream recorder with web ui"], "what_it_is": "Stream-rec is an automatic live stream recording tool built with Kotlin, Ktor, and ffmpeg. It records streams and bullet comments (danmu) from platforms like Douyin, Douyu, Huya, Twitch, PandaTV, and Weibo, with a web interface, SQLite persistence, and Rclone cloud upload integration.", "when_to_avoid": ["you need to record YouTube, Bilibili, or Niconico streams (unsupported)", "you only need a simple one-off video downloader without automation", "you want a GUI desktop app rather than a self-hosted service"], "when_to_choose": ["you need automatic recording of Douyin, Douyu, Huya, Twitch, PandaTV, or Weibo live streams", "you want danmu/bullet-comment capture alongside video", "you want scheduled recording with automatic file naming and rclone uploads", "you prefer a Docker-deployable recorder with a web dashboard"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/stream-rec", "repo": "stream-rec/stream-rec", "role": "main", "score": 10}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:56.470802+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:22:26.425805+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8dca863e503fcfbf25d0b7ea0999d41c8ea94cc33a69670d7ac1964d67bd2c21", "fetched_at": "2026-08-28T04:03:56.470802+00:00", "kind": "readme", "missing": false, "url": "https://github.com/stream-rec/stream-rec"}, {"content_hash": "9d5495838966cc8ce1f566ba4658c162c1f1eee1a96bd89a52e32e86a45e3708", "fetched_at": "2026-08-29T12:29:27.543465+00:00", "kind": "homepage", "missing": false, "url": "https://stream-rec.github.io/docs/"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:56.470802+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:22:26.425805+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8dca863e503fcfbf25d0b7ea0999d41c8ea94cc33a69670d7ac1964d67bd2c21", "fetched_at": "2026-08-28T04:03:56.470802+00:00", "kind": "readme", "missing": false, "url": "https://github.com/stream-rec/stream-rec"}, {"content_hash": "9d5495838966cc8ce1f566ba4658c162c1f1eee1a96bd89a52e32e86a45e3708", "fetched_at": "2026-08-29T12:29:27.543465+00:00", "kind": "homepage", "missing": false, "url": "https://stream-rec.github.io/docs/"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:22:26.425805+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8dca863e503fcfbf25d0b7ea0999d41c8ea94cc33a69670d7ac1964d67bd2c21", "fetched_at": "2026-08-28T04:03:56.470802+00:00", "kind": "readme", "missing": false, "url": "https://github.com/stream-rec/stream-rec"}, {"content_hash": "9d5495838966cc8ce1f566ba4658c162c1f1eee1a96bd89a52e32e86a45e3708", "fetched_at": "2026-08-29T12:29:27.543465+00:00", "kind": "homepage", "missing": false, "url": "https://stream-rec.github.io/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:03:56.470802+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:56.470802+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:56.470802+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:22:26.425805+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8dca863e503fcfbf25d0b7ea0999d41c8ea94cc33a69670d7ac1964d67bd2c21", "fetched_at": "2026-08-28T04:03:56.470802+00:00", "kind": "readme", "missing": false, "url": "https://github.com/stream-rec/stream-rec"}, {"content_hash": "9d5495838966cc8ce1f566ba4658c162c1f1eee1a96bd89a52e32e86a45e3708", "fetched_at": "2026-08-29T12:29:27.543465+00:00", "kind": "homepage", "missing": false, "url": "https://stream-rec.github.io/docs/"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:56.470802+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:56.470802+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:22:26.425805+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8dca863e503fcfbf25d0b7ea0999d41c8ea94cc33a69670d7ac1964d67bd2c21", "fetched_at": "2026-08-28T04:03:56.470802+00:00", "kind": "readme", "missing": false, "url": "https://github.com/stream-rec/stream-rec"}, {"content_hash": "9d5495838966cc8ce1f566ba4658c162c1f1eee1a96bd89a52e32e86a45e3708", "fetched_at": "2026-08-29T12:29:27.543465+00:00", "kind": "homepage", "missing": false, "url": "https://stream-rec.github.io/docs/"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:56.470802+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:56.470802+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:56.470802+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:22:26.425805+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8dca863e503fcfbf25d0b7ea0999d41c8ea94cc33a69670d7ac1964d67bd2c21", "fetched_at": "2026-08-28T04:03:56.470802+00:00", "kind": "readme", "missing": false, "url": "https://github.com/stream-rec/stream-rec"}, {"content_hash": "9d5495838966cc8ce1f566ba4658c162c1f1eee1a96bd89a52e32e86a45e3708", "fetched_at": "2026-08-29T12:29:27.543465+00:00", "kind": "homepage", "missing": false, "url": "https://stream-rec.github.io/docs/"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:56.470802+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:56.470802+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:22:26.425805+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8dca863e503fcfbf25d0b7ea0999d41c8ea94cc33a69670d7ac1964d67bd2c21", "fetched_at": "2026-08-28T04:03:56.470802+00:00", "kind": "readme", "missing": false, "url": "https://github.com/stream-rec/stream-rec"}, {"content_hash": "9d5495838966cc8ce1f566ba4658c162c1f1eee1a96bd89a52e32e86a45e3708", "fetched_at": "2026-08-29T12:29:27.543465+00:00", "kind": "homepage", "missing": false, "url": "https://stream-rec.github.io/docs/"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:22:26.425805+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8dca863e503fcfbf25d0b7ea0999d41c8ea94cc33a69670d7ac1964d67bd2c21", "fetched_at": "2026-08-28T04:03:56.470802+00:00", "kind": "readme", "missing": false, "url": "https://github.com/stream-rec/stream-rec"}, {"content_hash": "9d5495838966cc8ce1f566ba4658c162c1f1eee1a96bd89a52e32e86a45e3708", "fetched_at": "2026-08-29T12:29:27.543465+00:00", "kind": "homepage", "missing": false, "url": "https://stream-rec.github.io/docs/"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:22:26.425805+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8dca863e503fcfbf25d0b7ea0999d41c8ea94cc33a69670d7ac1964d67bd2c21", "fetched_at": "2026-08-28T04:03:56.470802+00:00", "kind": "readme", "missing": false, "url": "https://github.com/stream-rec/stream-rec"}, {"content_hash": "9d5495838966cc8ce1f566ba4658c162c1f1eee1a96bd89a52e32e86a45e3708", "fetched_at": "2026-08-29T12:29:27.543465+00:00", "kind": "homepage", "missing": false, "url": "https://stream-rec.github.io/docs/"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:22:26.425805+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8dca863e503fcfbf25d0b7ea0999d41c8ea94cc33a69670d7ac1964d67bd2c21", "fetched_at": "2026-08-28T04:03:56.470802+00:00", "kind": "readme", "missing": false, "url": "https://github.com/stream-rec/stream-rec"}, {"content_hash": "9d5495838966cc8ce1f566ba4658c162c1f1eee1a96bd89a52e32e86a45e3708", "fetched_at": "2026-08-29T12:29:27.543465+00:00", "kind": "homepage", "missing": false, "url": "https://stream-rec.github.io/docs/"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 57, "longevity": 66, "rhythm": 28}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["archived"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 934, "days_push": 258, "days_rel": 683, "gap_med": 46, "n_releases_24m": 2}, "score": 10, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}