{"adoption": {"forks": 85, "observed_at": "2026-08-28T04:04:23.746291+00:00", "stars": 1328}, "canonical_url": "https://ross.abutalabs.com/products/ratgdo", "card": {"archived": false, "artifact_type": "application", "description": null, "domain": ["iot", "hardware", "self-hosted"], "enriched": true, "function": ["iot", "workflow-automation", "middleware"], "health_score": 77, "homepage": "https://paulwieland.github.io/ratgdo", "language": null, "license": "GPL-2.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["PaulWieland/ratgdo"], "name": "PaulWieland/ratgdo", "platform": ["iot", "embedded", "self-hosted"], "pushed_at": "2026-07-21T22:06:45+00:00", "repo": "PaulWieland/ratgdo", "stars": 1328, "tags": ["garage-door-opener", "mqtt", "esphome", "homekit", "home-assistant", "security-plus-2.0", "chamberlain", "liftmaster", "firmware", "local-control", "home-automation"], "topics": [], "urls": [], "use_cases": ["control my garage door opener locally with home assistant", "integrate chamberlain security+ 2.0 garage door with mqtt", "replace myq cloud subscription with local garage door control", "add garage door status feedback to node-red", "control garage door with apple homekit without a hub", "wire dry contact control to a liftmaster opener", "monitor whether my garage door is open or closed locally"], "what_it_is": "ratgdo is an open-source WiFi control board and firmware for residential Chamberlain/LiftMaster/Merlin garage door openers, including Security+ 2.0 models. It provides local MQTT, ESPHome, and HomeKit control with door status feedback, without any cloud dependency or subscription.", "when_to_avoid": ["you need a purely software solution without wiring a physical board to the opener", "your opener is a commercial model or an unsupported brand with neither Security+ nor dry-contact terminals", "you prefer cloud-based control from outside the network without setting up remote access yourself", "you are unwilling to solder or wire terminals on your garage door opener"], "when_to_choose": ["you have a Chamberlain/LiftMaster/Merlin opener, especially a Security+ 2.0 'yellow learn button' model that resists dry-contact relays", "you want fully local control and status feedback with no cloud or subscription", "you use Home Assistant, ESPHome, HomeKit, or NodeRED and want direct integration", "you also want obstruction sensors, light control, and motion sensing on supported openers"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/ratgdo", "repo": "PaulWieland/ratgdo", "role": "main", "score": 65}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:23.746291+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:45:48.290023+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cd4c74a1a8ead4005af15b302a0725967b482405b66ec86f40c183ec778fffd2", "fetched_at": "2026-08-28T04:04:23.746291+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PaulWieland/ratgdo"}, {"content_hash": "b1e606061dcfd3a0f33af1223f12acbb2799b5d56dd4288fa3f751c36e0e4262", "fetched_at": "2026-08-29T12:05:12.168779+00:00", "kind": "homepage", "missing": false, "url": "https://paulwieland.github.io/ratgdo"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:23.746291+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:45:48.290023+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cd4c74a1a8ead4005af15b302a0725967b482405b66ec86f40c183ec778fffd2", "fetched_at": "2026-08-28T04:04:23.746291+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PaulWieland/ratgdo"}, {"content_hash": "b1e606061dcfd3a0f33af1223f12acbb2799b5d56dd4288fa3f751c36e0e4262", "fetched_at": "2026-08-29T12:05:12.168779+00:00", "kind": "homepage", "missing": false, "url": "https://paulwieland.github.io/ratgdo"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:45:48.290023+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cd4c74a1a8ead4005af15b302a0725967b482405b66ec86f40c183ec778fffd2", "fetched_at": "2026-08-28T04:04:23.746291+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PaulWieland/ratgdo"}, {"content_hash": "b1e606061dcfd3a0f33af1223f12acbb2799b5d56dd4288fa3f751c36e0e4262", "fetched_at": "2026-08-29T12:05:12.168779+00:00", "kind": "homepage", "missing": false, "url": "https://paulwieland.github.io/ratgdo"}], "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:23.746291+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:23.746291+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:23.746291+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:45:48.290023+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cd4c74a1a8ead4005af15b302a0725967b482405b66ec86f40c183ec778fffd2", "fetched_at": "2026-08-28T04:04:23.746291+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PaulWieland/ratgdo"}, {"content_hash": "b1e606061dcfd3a0f33af1223f12acbb2799b5d56dd4288fa3f751c36e0e4262", "fetched_at": "2026-08-29T12:05:12.168779+00:00", "kind": "homepage", "missing": false, "url": "https://paulwieland.github.io/ratgdo"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:23.746291+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:23.746291+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:45:48.290023+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cd4c74a1a8ead4005af15b302a0725967b482405b66ec86f40c183ec778fffd2", "fetched_at": "2026-08-28T04:04:23.746291+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PaulWieland/ratgdo"}, {"content_hash": "b1e606061dcfd3a0f33af1223f12acbb2799b5d56dd4288fa3f751c36e0e4262", "fetched_at": "2026-08-29T12:05:12.168779+00:00", "kind": "homepage", "missing": false, "url": "https://paulwieland.github.io/ratgdo"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:23.746291+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:23.746291+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:23.746291+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:45:48.290023+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cd4c74a1a8ead4005af15b302a0725967b482405b66ec86f40c183ec778fffd2", "fetched_at": "2026-08-28T04:04:23.746291+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PaulWieland/ratgdo"}, {"content_hash": "b1e606061dcfd3a0f33af1223f12acbb2799b5d56dd4288fa3f751c36e0e4262", "fetched_at": "2026-08-29T12:05:12.168779+00:00", "kind": "homepage", "missing": false, "url": "https://paulwieland.github.io/ratgdo"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:23.746291+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:23.746291+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:45:48.290023+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cd4c74a1a8ead4005af15b302a0725967b482405b66ec86f40c183ec778fffd2", "fetched_at": "2026-08-28T04:04:23.746291+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PaulWieland/ratgdo"}, {"content_hash": "b1e606061dcfd3a0f33af1223f12acbb2799b5d56dd4288fa3f751c36e0e4262", "fetched_at": "2026-08-29T12:05:12.168779+00:00", "kind": "homepage", "missing": false, "url": "https://paulwieland.github.io/ratgdo"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:45:48.290023+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cd4c74a1a8ead4005af15b302a0725967b482405b66ec86f40c183ec778fffd2", "fetched_at": "2026-08-28T04:04:23.746291+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PaulWieland/ratgdo"}, {"content_hash": "b1e606061dcfd3a0f33af1223f12acbb2799b5d56dd4288fa3f751c36e0e4262", "fetched_at": "2026-08-29T12:05:12.168779+00:00", "kind": "homepage", "missing": false, "url": "https://paulwieland.github.io/ratgdo"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:45:48.290023+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cd4c74a1a8ead4005af15b302a0725967b482405b66ec86f40c183ec778fffd2", "fetched_at": "2026-08-28T04:04:23.746291+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PaulWieland/ratgdo"}, {"content_hash": "b1e606061dcfd3a0f33af1223f12acbb2799b5d56dd4288fa3f751c36e0e4262", "fetched_at": "2026-08-29T12:05:12.168779+00:00", "kind": "homepage", "missing": false, "url": "https://paulwieland.github.io/ratgdo"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:45:48.290023+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "cd4c74a1a8ead4005af15b302a0725967b482405b66ec86f40c183ec778fffd2", "fetched_at": "2026-08-28T04:04:23.746291+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PaulWieland/ratgdo"}, {"content_hash": "b1e606061dcfd3a0f33af1223f12acbb2799b5d56dd4288fa3f751c36e0e4262", "fetched_at": "2026-08-29T12:05:12.168779+00:00", "kind": "homepage", "missing": false, "url": "https://paulwieland.github.io/ratgdo"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 93, "longevity": 100, "rhythm": 8}, "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": 1602, "days_push": 43, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 65, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}