{"adoption": {"forks": 342, "observed_at": "2026-08-28T04:05:26.036474+00:00", "stars": 1713}, "canonical_url": "https://ross.abutalabs.com/products/androidviewclient", "card": {"archived": false, "artifact_type": "library", "description": "Android ViewServer and ADB client", "domain": ["mobile-development", "testing", "developer-tools"], "enriched": true, "function": ["testing", "e2e-testing", "workflow-automation", "cli", "mcp"], "health_score": 71, "homepage": null, "language": "Python", "license": "Apache-2.0", "license_family": "permissive", "maturity": "active", "member_repos": ["dtmilano/AndroidViewClient"], "name": "dtmilano/AndroidViewClient", "platform": ["python", "cli", "cross-platform"], "pushed_at": "2025-12-24T02:50:59+00:00", "repo": "dtmilano/AndroidViewClient", "stars": 1713, "tags": ["android-ui-automation", "adb-client", "uiautomator", "monkeyrunner", "culebra", "test-script-generation", "multi-device", "automation", "android"], "topics": ["android", "monkeyrunner", "python", "testing", "androidviewclient", "ui", "automation", "adb", "culebra"], "urls": [], "use_cases": ["automate android app ui testing", "generate android test scripts automatically", "control android device from python via adb", "run ui tests on multiple android devices concurrently", "compare android screens logically instead of screenshots", "let an ai assistant drive an android device via mcp", "automate android app navigation and activity starts"], "what_it_is": "AndroidViewClient/culebra is a pure Python library and toolset for Android UI test automation, acting as a ViewServer and ADB client that enables device-independent, view-based interaction with Android applications. It can generate reusable test scripts, control multiple devices concurrently, and now exposes an MCP server so AI assistants can drive Android devices via natural language.", "when_to_avoid": ["you only need simple screenshot-based visual testing", "you are testing iOS or non-Android platforms", "you need a record-and-playback IDE like Espresso or Appium's full ecosystem"], "when_to_choose": ["you need device-independent Android UI automation in pure Python without image comparison", "you want to script interactions across many Android devices or APIs", "you want AI assistants to control Android devices through MCP"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/androidviewclient", "repo": "dtmilano/AndroidViewClient", "role": "main", "score": 68}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.036474+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:34:42.010030+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "02f470a62fa91444e49c993a2aeff0337e823acb667dd33f5b3904175905383f", "fetched_at": "2026-08-28T04:05:26.036474+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dtmilano/AndroidViewClient"}, {"content_hash": "081ff7d93833d85f5d6cf24a2d184d085a0aa73d008dcf5803aea5eaedd1c10d", "fetched_at": "2026-08-29T11:10:38.643969+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/androidviewclient/json"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.036474+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:34:42.010030+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "02f470a62fa91444e49c993a2aeff0337e823acb667dd33f5b3904175905383f", "fetched_at": "2026-08-28T04:05:26.036474+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dtmilano/AndroidViewClient"}, {"content_hash": "081ff7d93833d85f5d6cf24a2d184d085a0aa73d008dcf5803aea5eaedd1c10d", "fetched_at": "2026-08-29T11:10:38.643969+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/androidviewclient/json"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:34:42.010030+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "02f470a62fa91444e49c993a2aeff0337e823acb667dd33f5b3904175905383f", "fetched_at": "2026-08-28T04:05:26.036474+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dtmilano/AndroidViewClient"}, {"content_hash": "081ff7d93833d85f5d6cf24a2d184d085a0aa73d008dcf5803aea5eaedd1c10d", "fetched_at": "2026-08-29T11:10:38.643969+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/androidviewclient/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:05:26.036474+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.036474+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.036474+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:34:42.010030+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "02f470a62fa91444e49c993a2aeff0337e823acb667dd33f5b3904175905383f", "fetched_at": "2026-08-28T04:05:26.036474+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dtmilano/AndroidViewClient"}, {"content_hash": "081ff7d93833d85f5d6cf24a2d184d085a0aa73d008dcf5803aea5eaedd1c10d", "fetched_at": "2026-08-29T11:10:38.643969+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/androidviewclient/json"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.036474+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.036474+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:34:42.010030+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "02f470a62fa91444e49c993a2aeff0337e823acb667dd33f5b3904175905383f", "fetched_at": "2026-08-28T04:05:26.036474+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dtmilano/AndroidViewClient"}, {"content_hash": "081ff7d93833d85f5d6cf24a2d184d085a0aa73d008dcf5803aea5eaedd1c10d", "fetched_at": "2026-08-29T11:10:38.643969+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/androidviewclient/json"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.036474+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.036474+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.036474+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:34:42.010030+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "02f470a62fa91444e49c993a2aeff0337e823acb667dd33f5b3904175905383f", "fetched_at": "2026-08-28T04:05:26.036474+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dtmilano/AndroidViewClient"}, {"content_hash": "081ff7d93833d85f5d6cf24a2d184d085a0aa73d008dcf5803aea5eaedd1c10d", "fetched_at": "2026-08-29T11:10:38.643969+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/androidviewclient/json"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.036474+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:26.036474+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:34:42.010030+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "02f470a62fa91444e49c993a2aeff0337e823acb667dd33f5b3904175905383f", "fetched_at": "2026-08-28T04:05:26.036474+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dtmilano/AndroidViewClient"}, {"content_hash": "081ff7d93833d85f5d6cf24a2d184d085a0aa73d008dcf5803aea5eaedd1c10d", "fetched_at": "2026-08-29T11:10:38.643969+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/androidviewclient/json"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:34:42.010030+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "02f470a62fa91444e49c993a2aeff0337e823acb667dd33f5b3904175905383f", "fetched_at": "2026-08-28T04:05:26.036474+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dtmilano/AndroidViewClient"}, {"content_hash": "081ff7d93833d85f5d6cf24a2d184d085a0aa73d008dcf5803aea5eaedd1c10d", "fetched_at": "2026-08-29T11:10:38.643969+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/androidviewclient/json"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:34:42.010030+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "02f470a62fa91444e49c993a2aeff0337e823acb667dd33f5b3904175905383f", "fetched_at": "2026-08-28T04:05:26.036474+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dtmilano/AndroidViewClient"}, {"content_hash": "081ff7d93833d85f5d6cf24a2d184d085a0aa73d008dcf5803aea5eaedd1c10d", "fetched_at": "2026-08-29T11:10:38.643969+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/androidviewclient/json"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:34:42.010030+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "02f470a62fa91444e49c993a2aeff0337e823acb667dd33f5b3904175905383f", "fetched_at": "2026-08-28T04:05:26.036474+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dtmilano/AndroidViewClient"}, {"content_hash": "081ff7d93833d85f5d6cf24a2d184d085a0aa73d008dcf5803aea5eaedd1c10d", "fetched_at": "2026-08-29T11:10:38.643969+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/androidviewclient/json"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 58, "longevity": 100, "rhythm": 62}, "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": 5326, "days_push": 252, "days_rel": 253, "gap_med": 8.0, "n_releases_24m": 5}, "score": 68, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}