{"adoption": {"forks": 94, "observed_at": "2026-08-28T04:03:21.243880+00:00", "stars": 1044}, "canonical_url": "https://ross.abutalabs.com/products/test-butler", "card": {"archived": false, "artifact_type": "library", "description": "Reliable Android Testing, at your service", "domain": ["testing", "mobile-development", "developer-tools"], "enriched": true, "function": ["testing", "e2e-testing"], "health_score": 57, "homepage": null, "language": "Java", "license": "Apache-2.0", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["linkedin/test-butler"], "name": "linkedin/test-butler", "platform": ["jvm", "cli"], "pushed_at": "2026-01-07T23:33:05+00:00", "repo": "linkedin/test-butler", "stars": 1044, "tags": ["android-emulator", "espresso", "ui-testing", "test-stability", "android-library", "android"], "topics": ["android", "test-butler", "android-emulator", "testing", "android-library", "linkedin"], "urls": [], "use_cases": ["run espresso tests without emulator animations breaking them", "prevent ANR and crash dialogs from failing android ui tests", "simulate no wifi connectivity during android tests", "change device orientation from test code", "grant runtime permissions programmatically in tests", "set app locale to test localization", "keep emulator cpu and wifi awake during test runs"], "what_it_is": "Test Butler is an Android testing library plus companion emulator app that stabilizes the Android emulator for automated UI tests. It disables animations, crash/ANR dialogs, and sleep behaviors, and lets tests toggle WiFi, orientation, locale, location modes, and runtime permissions.", "when_to_avoid": ["you test only on physical devices, since the companion app requires the emulator system keystore", "your tests are pure JVM unit tests with no emulator involvement", "you need a solution actively maintained for the latest android versions"], "when_to_choose": ["you run android instrumentation or espresso tests on emulators in CI", "you need to toggle emulator settings like wifi, orientation, or locale from tests", "flaky emulator behavior like animations or system dialogs is causing test failures"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/test-butler", "repo": "linkedin/test-butler", "role": "main", "score": 50}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.243880+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T07:02:14.437358+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a8fcc7890d13a7c4f455f6859a06f332ccad711903539166a30974ce052f8569", "fetched_at": "2026-08-28T04:03:21.243880+00:00", "kind": "readme", "missing": false, "url": "https://github.com/linkedin/test-butler"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.243880+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T07:02:14.437358+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a8fcc7890d13a7c4f455f6859a06f332ccad711903539166a30974ce052f8569", "fetched_at": "2026-08-28T04:03:21.243880+00:00", "kind": "readme", "missing": false, "url": "https://github.com/linkedin/test-butler"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T07:02:14.437358+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a8fcc7890d13a7c4f455f6859a06f332ccad711903539166a30974ce052f8569", "fetched_at": "2026-08-28T04:03:21.243880+00:00", "kind": "readme", "missing": false, "url": "https://github.com/linkedin/test-butler"}], "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:21.243880+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.243880+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.243880+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T07:02:14.437358+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a8fcc7890d13a7c4f455f6859a06f332ccad711903539166a30974ce052f8569", "fetched_at": "2026-08-28T04:03:21.243880+00:00", "kind": "readme", "missing": false, "url": "https://github.com/linkedin/test-butler"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.243880+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.243880+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T07:02:14.437358+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a8fcc7890d13a7c4f455f6859a06f332ccad711903539166a30974ce052f8569", "fetched_at": "2026-08-28T04:03:21.243880+00:00", "kind": "readme", "missing": false, "url": "https://github.com/linkedin/test-butler"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.243880+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.243880+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.243880+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T07:02:14.437358+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a8fcc7890d13a7c4f455f6859a06f332ccad711903539166a30974ce052f8569", "fetched_at": "2026-08-28T04:03:21.243880+00:00", "kind": "readme", "missing": false, "url": "https://github.com/linkedin/test-butler"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.243880+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.243880+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T07:02:14.437358+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a8fcc7890d13a7c4f455f6859a06f332ccad711903539166a30974ce052f8569", "fetched_at": "2026-08-28T04:03:21.243880+00:00", "kind": "readme", "missing": false, "url": "https://github.com/linkedin/test-butler"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T07:02:14.437358+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a8fcc7890d13a7c4f455f6859a06f332ccad711903539166a30974ce052f8569", "fetched_at": "2026-08-28T04:03:21.243880+00:00", "kind": "readme", "missing": false, "url": "https://github.com/linkedin/test-butler"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T07:02:14.437358+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a8fcc7890d13a7c4f455f6859a06f332ccad711903539166a30974ce052f8569", "fetched_at": "2026-08-28T04:03:21.243880+00:00", "kind": "readme", "missing": false, "url": "https://github.com/linkedin/test-butler"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T07:02:14.437358+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "a8fcc7890d13a7c4f455f6859a06f332ccad711903539166a30974ce052f8569", "fetched_at": "2026-08-28T04:03:21.243880+00:00", "kind": "readme", "missing": false, "url": "https://github.com/linkedin/test-butler"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 61, "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": 3688, "days_push": 238, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 50, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}