{"adoption": {"forks": 105, "observed_at": "2026-08-28T04:04:33.871902+00:00", "stars": 1380}, "canonical_url": "https://ross.abutalabs.com/products/compose-rules", "card": {"archived": false, "artifact_type": "library", "description": "Static checks to aid with a healthy adoption of Compose", "domain": ["developer-tools", "mobile-development", "android-tools"], "enriched": true, "function": ["linter", "code-review"], "health_score": 20, "homepage": "https://twitter.github.io/compose-rules", "language": "Kotlin", "license": "NOASSERTION", "license_family": "other", "maturity": "active", "member_repos": ["twitter/compose-rules"], "name": "twitter/compose-rules", "platform": ["jvm"], "pushed_at": "2023-12-30T22:41:41+00:00", "repo": "twitter/compose-rules", "stars": 1380, "tags": ["jetpack-compose", "ktlint", "detekt", "static-analysis", "kotlin", "code-quality", "composables", "android"], "topics": ["android", "jetpack-compose", "ktlint", "static-code-analysis"], "urls": [], "use_cases": ["lint jetpack compose code for common pitfalls", "catch compose recomposition performance issues early", "enforce compose best practices across an android team", "add compose rules to ktlint", "run compose checks with detekt", "flag composable antipatterns before human code review"], "what_it_is": "A collection of static analysis rules for Jetpack Compose, shipped as custom ktlint rules and a Detekt plugin, that detect common Compose pitfalls before code review. Built by Twitter to help large teams adopt Compose with consistent, healthy patterns.", "when_to_avoid": ["Your project does not use Jetpack Compose, e.g. view-based Android or non-UI Kotlin code", "You need rules for Android's own lint system rather than ktlint or Detekt", "You need runtime fixes or behavior changes - these are purely static checks"], "when_to_choose": ["Your Android team is adopting Jetpack Compose and wants automated enforcement of composable best practices", "You already use ktlint or Detekt and want Compose-specific rules integrated into your existing setup", "You want Compose issues surfaced in the build pipeline rather than relying on reviewers to catch them"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/compose-rules", "repo": "twitter/compose-rules", "role": "main", "score": 23}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.871902+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:40:16.589461+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ee0abbd2da16efd8f15fff6606d0b12a39854f84a4650d3c44e1929b95a2b6ae", "fetched_at": "2026-08-28T04:04:33.871902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twitter/compose-rules"}, {"content_hash": "8b9715f42eb32abf7703bc65e35e742e251224d947446fb0a4ea97103f79fa6e", "fetched_at": "2026-08-29T11:56:12.093827+00:00", "kind": "homepage", "missing": false, "url": "https://twitter.github.io/compose-rules"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.871902+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:40:16.589461+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ee0abbd2da16efd8f15fff6606d0b12a39854f84a4650d3c44e1929b95a2b6ae", "fetched_at": "2026-08-28T04:04:33.871902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twitter/compose-rules"}, {"content_hash": "8b9715f42eb32abf7703bc65e35e742e251224d947446fb0a4ea97103f79fa6e", "fetched_at": "2026-08-29T11:56:12.093827+00:00", "kind": "homepage", "missing": false, "url": "https://twitter.github.io/compose-rules"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:40:16.589461+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ee0abbd2da16efd8f15fff6606d0b12a39854f84a4650d3c44e1929b95a2b6ae", "fetched_at": "2026-08-28T04:04:33.871902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twitter/compose-rules"}, {"content_hash": "8b9715f42eb32abf7703bc65e35e742e251224d947446fb0a4ea97103f79fa6e", "fetched_at": "2026-08-29T11:56:12.093827+00:00", "kind": "homepage", "missing": false, "url": "https://twitter.github.io/compose-rules"}], "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:33.871902+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.871902+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.871902+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:40:16.589461+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ee0abbd2da16efd8f15fff6606d0b12a39854f84a4650d3c44e1929b95a2b6ae", "fetched_at": "2026-08-28T04:04:33.871902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twitter/compose-rules"}, {"content_hash": "8b9715f42eb32abf7703bc65e35e742e251224d947446fb0a4ea97103f79fa6e", "fetched_at": "2026-08-29T11:56:12.093827+00:00", "kind": "homepage", "missing": false, "url": "https://twitter.github.io/compose-rules"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.871902+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.871902+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:40:16.589461+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ee0abbd2da16efd8f15fff6606d0b12a39854f84a4650d3c44e1929b95a2b6ae", "fetched_at": "2026-08-28T04:04:33.871902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twitter/compose-rules"}, {"content_hash": "8b9715f42eb32abf7703bc65e35e742e251224d947446fb0a4ea97103f79fa6e", "fetched_at": "2026-08-29T11:56:12.093827+00:00", "kind": "homepage", "missing": false, "url": "https://twitter.github.io/compose-rules"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.871902+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.871902+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.871902+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:40:16.589461+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ee0abbd2da16efd8f15fff6606d0b12a39854f84a4650d3c44e1929b95a2b6ae", "fetched_at": "2026-08-28T04:04:33.871902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twitter/compose-rules"}, {"content_hash": "8b9715f42eb32abf7703bc65e35e742e251224d947446fb0a4ea97103f79fa6e", "fetched_at": "2026-08-29T11:56:12.093827+00:00", "kind": "homepage", "missing": false, "url": "https://twitter.github.io/compose-rules"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.871902+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.871902+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:40:16.589461+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ee0abbd2da16efd8f15fff6606d0b12a39854f84a4650d3c44e1929b95a2b6ae", "fetched_at": "2026-08-28T04:04:33.871902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twitter/compose-rules"}, {"content_hash": "8b9715f42eb32abf7703bc65e35e742e251224d947446fb0a4ea97103f79fa6e", "fetched_at": "2026-08-29T11:56:12.093827+00:00", "kind": "homepage", "missing": false, "url": "https://twitter.github.io/compose-rules"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:40:16.589461+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ee0abbd2da16efd8f15fff6606d0b12a39854f84a4650d3c44e1929b95a2b6ae", "fetched_at": "2026-08-28T04:04:33.871902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twitter/compose-rules"}, {"content_hash": "8b9715f42eb32abf7703bc65e35e742e251224d947446fb0a4ea97103f79fa6e", "fetched_at": "2026-08-29T11:56:12.093827+00:00", "kind": "homepage", "missing": false, "url": "https://twitter.github.io/compose-rules"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:40:16.589461+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ee0abbd2da16efd8f15fff6606d0b12a39854f84a4650d3c44e1929b95a2b6ae", "fetched_at": "2026-08-28T04:04:33.871902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twitter/compose-rules"}, {"content_hash": "8b9715f42eb32abf7703bc65e35e742e251224d947446fb0a4ea97103f79fa6e", "fetched_at": "2026-08-29T11:56:12.093827+00:00", "kind": "homepage", "missing": false, "url": "https://twitter.github.io/compose-rules"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:40:16.589461+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "ee0abbd2da16efd8f15fff6606d0b12a39854f84a4650d3c44e1929b95a2b6ae", "fetched_at": "2026-08-28T04:04:33.871902+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twitter/compose-rules"}, {"content_hash": "8b9715f42eb32abf7703bc65e35e742e251224d947446fb0a4ea97103f79fa6e", "fetched_at": "2026-08-29T11:56:12.093827+00:00", "kind": "homepage", "missing": false, "url": "https://twitter.github.io/compose-rules"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_license"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 1561, "days_push": 977, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 23, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}