{"adoption": {"forks": 105, "observed_at": "2026-08-28T04:03:45.804304+00:00", "stars": 1146}, "canonical_url": "https://ross.abutalabs.com/products/repokid", "card": {"archived": false, "artifact_type": "cli-tool", "description": "AWS Least Privilege for Distributed, High-Velocity Deployment", "domain": ["security", "cloud-computing"], "enriched": true, "function": ["security", "cli", "monitoring"], "health_score": 52, "homepage": null, "language": "Python", "license": "Apache-2.0", "license_family": "permissive", "maturity": "active", "member_repos": ["Netflix/repokid"], "name": "Netflix/repokid", "platform": ["python", "cloud", "cli"], "pushed_at": "2025-11-24T21:16:12+00:00", "repo": "Netflix/repokid", "stars": 1146, "tags": ["aws-iam", "least-privilege", "access-advisor", "aardvark", "dynamodb", "policy-remediation", "devops", "docker"], "topics": ["security", "aws"], "urls": [], "use_cases": ["automatically remove unused permissions from AWS IAM role policies", "enforce least privilege across many AWS accounts", "right-size IAM inline policies based on access advisor usage data", "periodically revoke stale IAM permissions in a multi-account AWS setup", "audit and remediate over-privileged IAM roles"], "what_it_is": "Repokid is a Python tool from Netflix that enforces least privilege on AWS IAM roles by removing permissions for unused services from inline policies. It uses access advisor data provided by Aardvark and stores role state in DynamoDB.", "when_to_avoid": ["you only need one-off IAM policy audits rather than continuous remediation", "your IAM permissions are managed exclusively through customer-managed policies rather than inline policies", "you cannot deploy the Aardvark data-collection dependency or DynamoDB storage"], "when_to_choose": ["you manage IAM roles at scale across multiple AWS accounts", "you already run Netflix Aardvark to collect CloudTrail access advisor data", "you want automated, scheduled least-privilege remediation of inline policies"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/repokid", "repo": "Netflix/repokid", "role": "main", "score": 47}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:45.804304+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:34:05.185587+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5c0de3f6aee6cd3620d7ff3dead01405ca0126d1c2b5fbf38747a1404e80a1b1", "fetched_at": "2026-08-28T04:03:45.804304+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Netflix/repokid"}, {"content_hash": "81ed3e4773afb479ee1b8cf6ee3d4bdeb3274cc262fdabda3e493aa067b2a680", "fetched_at": "2026-08-29T12:39:22.757360+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/repokid/json"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:45.804304+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:34:05.185587+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5c0de3f6aee6cd3620d7ff3dead01405ca0126d1c2b5fbf38747a1404e80a1b1", "fetched_at": "2026-08-28T04:03:45.804304+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Netflix/repokid"}, {"content_hash": "81ed3e4773afb479ee1b8cf6ee3d4bdeb3274cc262fdabda3e493aa067b2a680", "fetched_at": "2026-08-29T12:39:22.757360+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/repokid/json"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:34:05.185587+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5c0de3f6aee6cd3620d7ff3dead01405ca0126d1c2b5fbf38747a1404e80a1b1", "fetched_at": "2026-08-28T04:03:45.804304+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Netflix/repokid"}, {"content_hash": "81ed3e4773afb479ee1b8cf6ee3d4bdeb3274cc262fdabda3e493aa067b2a680", "fetched_at": "2026-08-29T12:39:22.757360+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/repokid/json"}], "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:45.804304+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:45.804304+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:45.804304+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:34:05.185587+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5c0de3f6aee6cd3620d7ff3dead01405ca0126d1c2b5fbf38747a1404e80a1b1", "fetched_at": "2026-08-28T04:03:45.804304+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Netflix/repokid"}, {"content_hash": "81ed3e4773afb479ee1b8cf6ee3d4bdeb3274cc262fdabda3e493aa067b2a680", "fetched_at": "2026-08-29T12:39:22.757360+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/repokid/json"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:45.804304+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:45.804304+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:34:05.185587+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5c0de3f6aee6cd3620d7ff3dead01405ca0126d1c2b5fbf38747a1404e80a1b1", "fetched_at": "2026-08-28T04:03:45.804304+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Netflix/repokid"}, {"content_hash": "81ed3e4773afb479ee1b8cf6ee3d4bdeb3274cc262fdabda3e493aa067b2a680", "fetched_at": "2026-08-29T12:39:22.757360+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/repokid/json"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:45.804304+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:45.804304+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:45.804304+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:34:05.185587+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5c0de3f6aee6cd3620d7ff3dead01405ca0126d1c2b5fbf38747a1404e80a1b1", "fetched_at": "2026-08-28T04:03:45.804304+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Netflix/repokid"}, {"content_hash": "81ed3e4773afb479ee1b8cf6ee3d4bdeb3274cc262fdabda3e493aa067b2a680", "fetched_at": "2026-08-29T12:39:22.757360+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/repokid/json"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:45.804304+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:45.804304+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:34:05.185587+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5c0de3f6aee6cd3620d7ff3dead01405ca0126d1c2b5fbf38747a1404e80a1b1", "fetched_at": "2026-08-28T04:03:45.804304+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Netflix/repokid"}, {"content_hash": "81ed3e4773afb479ee1b8cf6ee3d4bdeb3274cc262fdabda3e493aa067b2a680", "fetched_at": "2026-08-29T12:39:22.757360+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/repokid/json"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:34:05.185587+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5c0de3f6aee6cd3620d7ff3dead01405ca0126d1c2b5fbf38747a1404e80a1b1", "fetched_at": "2026-08-28T04:03:45.804304+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Netflix/repokid"}, {"content_hash": "81ed3e4773afb479ee1b8cf6ee3d4bdeb3274cc262fdabda3e493aa067b2a680", "fetched_at": "2026-08-29T12:39:22.757360+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/repokid/json"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:34:05.185587+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5c0de3f6aee6cd3620d7ff3dead01405ca0126d1c2b5fbf38747a1404e80a1b1", "fetched_at": "2026-08-28T04:03:45.804304+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Netflix/repokid"}, {"content_hash": "81ed3e4773afb479ee1b8cf6ee3d4bdeb3274cc262fdabda3e493aa067b2a680", "fetched_at": "2026-08-29T12:39:22.757360+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/repokid/json"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:34:05.185587+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5c0de3f6aee6cd3620d7ff3dead01405ca0126d1c2b5fbf38747a1404e80a1b1", "fetched_at": "2026-08-28T04:03:45.804304+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Netflix/repokid"}, {"content_hash": "81ed3e4773afb479ee1b8cf6ee3d4bdeb3274cc262fdabda3e493aa067b2a680", "fetched_at": "2026-08-29T12:39:22.757360+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/repokid/json"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 53, "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": 3387, "days_push": 282, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 47, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}