{"adoption": {"forks": 564, "observed_at": "2026-08-28T04:06:59.414988+00:00", "stars": 2541}, "canonical_url": "https://ross.abutalabs.com/products/ws-scrcpy", "card": {"archived": false, "artifact_type": "application", "description": "Web client prototype for scrcpy.", "domain": ["android-tools", "web-development", "developer-tools", "cross-platform"], "enriched": true, "function": ["websocket", "http-server", "video-processing"], "health_score": 85, "homepage": null, "language": "TypeScript", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["NetrisTV/ws-scrcpy"], "name": "NetrisTV/ws-scrcpy", "platform": ["browser", "cross-platform"], "pushed_at": "2026-08-24T14:07:56+00:00", "repo": "NetrisTV/ws-scrcpy", "stars": 2541, "tags": ["scrcpy", "screen-mirroring", "adb", "h264", "webcodecs", "remote-control", "android-debugging", "device-control", "nodejs", "web-server", "android"], "topics": ["android", "websocket", "screen", "mirroring", "typescript", "javascript", "scrcpy", "remote-control", "remote", "control", "browser", "mobile", "phone"], "urls": [], "use_cases": ["mirror and control an android phone from a browser", "screen cast android device over websocket", "remotely control android phone with mouse and keyboard", "test android app on device without usb screen", "push apk to android device from browser", "access android device shell remotely"], "what_it_is": "A web-based client for scrcpy that streams an Android device's screen to a browser over WebSockets and allows remote control from the browser. It bundles multiple H264 decoders (MSE, Broadway, TinyH264, WebCodecs) plus touch, keyboard, clipboard, file push, and remote shell features.", "when_to_avoid": ["you need a native desktop scrcpy client with lowest latency", "your browser lacks WebSockets, MSE/WebAssembly, or WebCodecs support", "your Android device is below API 21 or lacks adb debugging"], "when_to_choose": ["you need to view and control an Android device from any machine with just a browser", "you want multiple decoders to handle different browser capabilities", "you need remote shell, clipboard, and APK push alongside screen mirroring"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/ws-scrcpy", "repo": "NetrisTV/ws-scrcpy", "role": "main", "score": 67}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:59.414988+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:25:07.476101+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2bd79b64b8c1a2661d01d235ddf1e821f16187e1a6f6d5692ed5eb62cca02082", "fetched_at": "2026-08-28T04:06:59.414988+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetrisTV/ws-scrcpy"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:59.414988+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:25:07.476101+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2bd79b64b8c1a2661d01d235ddf1e821f16187e1a6f6d5692ed5eb62cca02082", "fetched_at": "2026-08-28T04:06:59.414988+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetrisTV/ws-scrcpy"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:25:07.476101+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2bd79b64b8c1a2661d01d235ddf1e821f16187e1a6f6d5692ed5eb62cca02082", "fetched_at": "2026-08-28T04:06:59.414988+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetrisTV/ws-scrcpy"}], "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:06:59.414988+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:59.414988+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:59.414988+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:25:07.476101+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2bd79b64b8c1a2661d01d235ddf1e821f16187e1a6f6d5692ed5eb62cca02082", "fetched_at": "2026-08-28T04:06:59.414988+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetrisTV/ws-scrcpy"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:59.414988+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:59.414988+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:25:07.476101+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2bd79b64b8c1a2661d01d235ddf1e821f16187e1a6f6d5692ed5eb62cca02082", "fetched_at": "2026-08-28T04:06:59.414988+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetrisTV/ws-scrcpy"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:59.414988+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:59.414988+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:59.414988+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:25:07.476101+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2bd79b64b8c1a2661d01d235ddf1e821f16187e1a6f6d5692ed5eb62cca02082", "fetched_at": "2026-08-28T04:06:59.414988+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetrisTV/ws-scrcpy"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:59.414988+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:59.414988+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:25:07.476101+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2bd79b64b8c1a2661d01d235ddf1e821f16187e1a6f6d5692ed5eb62cca02082", "fetched_at": "2026-08-28T04:06:59.414988+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetrisTV/ws-scrcpy"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:25:07.476101+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2bd79b64b8c1a2661d01d235ddf1e821f16187e1a6f6d5692ed5eb62cca02082", "fetched_at": "2026-08-28T04:06:59.414988+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetrisTV/ws-scrcpy"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:25:07.476101+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2bd79b64b8c1a2661d01d235ddf1e821f16187e1a6f6d5692ed5eb62cca02082", "fetched_at": "2026-08-28T04:06:59.414988+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetrisTV/ws-scrcpy"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:25:07.476101+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2bd79b64b8c1a2661d01d235ddf1e821f16187e1a6f6d5692ed5eb62cca02082", "fetched_at": "2026-08-28T04:06:59.414988+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetrisTV/ws-scrcpy"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 100, "rhythm": 8}, "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": 2644, "days_push": 9, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 67, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}