{"adoption": {"forks": 103, "observed_at": "2026-08-28T04:05:48.992159+00:00", "stars": 1887}, "canonical_url": "https://ross.abutalabs.com/products/tuya-cloudcutter", "card": {"archived": false, "artifact_type": "cli-tool", "description": "A tool that disconnects Tuya IoT devices from the cloud, allowing them to run completely locally.", "domain": ["iot", "security", "embedded-systems", "self-hosted"], "enriched": true, "function": ["security", "iot", "networking", "cli"], "health_score": 71, "homepage": null, "language": "Python", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["tuya-cloudcutter/tuya-cloudcutter"], "name": "tuya-cloudcutter/tuya-cloudcutter", "platform": ["cli"], "pushed_at": "2026-06-04T02:17:58+00:00", "repo": "tuya-cloudcutter/tuya-cloudcutter", "stars": 1887, "tags": ["tuya", "firmware-flashing", "iot-exploit", "local-control", "beken", "wireless-exploit", "smart-home", "linux", "docker"], "topics": ["bk7231n", "bk7231t", "hacktoberfest", "tuya-convert", "iot"], "urls": [], "use_cases": ["disconnect tuya smart devices from the cloud so they run locally", "flash custom firmware to tuya devices over the air", "jailbreak bk7231t or bk7231n smart plugs and bulbs", "cut tuya devices off from tuya servers and apps", "run smart home devices without any cloud dependency", "exploit wireless vulnerability in tuya iot devices"], "what_it_is": "Tuya Cloudcutter is a Python-based toolchain that exploits a wireless vulnerability in Tuya smart devices using Beken BK7231 and Realtek chipsets to detach them from Tuya's cloud. It also supports flashing custom firmware over-the-air, enabling fully local operation of smart home devices.", "when_to_avoid": ["you still want to use Tuya's official apps or cloud services, since detaching is irreversible", "your device has a patched firmware version that fixes the exploited vulnerability", "you need a supported chipset outside BK7231T/BK7231N/RTL8710BN or an SDK 2.0.0 RTL8710BN device", "you cannot run Docker or lack a dedicated Wi-Fi adapter and elevated privileges"], "when_to_choose": ["you own unpatched Tuya devices with BK7231T, BK7231N, or RTL8710BN chipsets and want permanent local control", "you are willing to abandon Tuya's apps and cloud servers entirely", "you want to flash open-source firmware like Tasmota or ESPHome over-the-air without opening the device", "you have a Linux machine with a spare Wi-Fi adapter, NetworkManager, and Docker"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/tuya-cloudcutter", "repo": "tuya-cloudcutter/tuya-cloudcutter", "role": "main", "score": 70}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:48.992159+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:13:33.738635+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f1166bf8a313c9238404e13e6e4eec21550a6ab8971c19aacc797bee0d2db051", "fetched_at": "2026-08-28T04:05:48.992159+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tuya-cloudcutter/tuya-cloudcutter"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:48.992159+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:13:33.738635+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f1166bf8a313c9238404e13e6e4eec21550a6ab8971c19aacc797bee0d2db051", "fetched_at": "2026-08-28T04:05:48.992159+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tuya-cloudcutter/tuya-cloudcutter"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:13:33.738635+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f1166bf8a313c9238404e13e6e4eec21550a6ab8971c19aacc797bee0d2db051", "fetched_at": "2026-08-28T04:05:48.992159+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tuya-cloudcutter/tuya-cloudcutter"}], "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:48.992159+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:48.992159+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:48.992159+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:13:33.738635+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f1166bf8a313c9238404e13e6e4eec21550a6ab8971c19aacc797bee0d2db051", "fetched_at": "2026-08-28T04:05:48.992159+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tuya-cloudcutter/tuya-cloudcutter"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:48.992159+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:48.992159+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:13:33.738635+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f1166bf8a313c9238404e13e6e4eec21550a6ab8971c19aacc797bee0d2db051", "fetched_at": "2026-08-28T04:05:48.992159+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tuya-cloudcutter/tuya-cloudcutter"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:48.992159+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:48.992159+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:48.992159+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:13:33.738635+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f1166bf8a313c9238404e13e6e4eec21550a6ab8971c19aacc797bee0d2db051", "fetched_at": "2026-08-28T04:05:48.992159+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tuya-cloudcutter/tuya-cloudcutter"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:48.992159+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:48.992159+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:13:33.738635+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f1166bf8a313c9238404e13e6e4eec21550a6ab8971c19aacc797bee0d2db051", "fetched_at": "2026-08-28T04:05:48.992159+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tuya-cloudcutter/tuya-cloudcutter"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:13:33.738635+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f1166bf8a313c9238404e13e6e4eec21550a6ab8971c19aacc797bee0d2db051", "fetched_at": "2026-08-28T04:05:48.992159+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tuya-cloudcutter/tuya-cloudcutter"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:13:33.738635+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f1166bf8a313c9238404e13e6e4eec21550a6ab8971c19aacc797bee0d2db051", "fetched_at": "2026-08-28T04:05:48.992159+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tuya-cloudcutter/tuya-cloudcutter"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:13:33.738635+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f1166bf8a313c9238404e13e6e4eec21550a6ab8971c19aacc797bee0d2db051", "fetched_at": "2026-08-28T04:05:48.992159+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tuya-cloudcutter/tuya-cloudcutter"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 85, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 1658, "days_push": 91, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 70, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}