{"adoption": {"forks": 208, "observed_at": "2026-08-28T04:07:45.576755+00:00", "stars": 3133}, "canonical_url": "https://ross.abutalabs.com/products/browser-control", "card": {"archived": false, "artifact_type": "cli-tool", "description": "A tiny, fast Rust CLI that drives a real browser over the Chrome DevTools Protocol — built for coding agents.", "domain": ["developer-tools", "web-development"], "enriched": true, "function": ["cli", "web-scraping", "developer-tools", "workflow-automation"], "health_score": 92, "homepage": null, "language": "Rust", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["keon/browser-control"], "name": "keon/browser-control", "platform": ["cli", "rust", "cross-platform", "windows"], "pushed_at": "2026-06-21T03:49:08+00:00", "repo": "keon/browser-control", "stars": 3133, "tags": ["browser-automation", "chrome-devtools-protocol", "cdp", "coding-agents", "llm-tools", "shell-native", "headless-browser", "command-line", "automation", "ai-agents", "linux", "macos"], "topics": ["rust", "agent", "browser-automation", "llm"], "urls": [], "use_cases": ["automate a browser from shell commands for a coding agent", "click and interact with page elements using stable refs instead of brittle selectors", "scrape or snapshot web page content as text or JSON", "run raw CDP commands or JavaScript in a live browser", "drive remote cloud browser sessions from one CLI", "debug browser automation failures with event and console traces"], "what_it_is": "A small, fast Rust CLI that drives a real browser over the Chrome DevTools Protocol, designed for coding agents and shell pipelines. It exposes page snapshots with stable element refs, raw CDP access, and event/network/console tracing as composable subcommands.", "when_to_avoid": ["you need a full end-to-end testing framework with assertions and fixtures", "you prefer a high-level SDK in a specific language like Playwright or Selenium", "you need to automate non-Chromium browsers like Firefox or Safari", "you want a GUI for recording browser interactions"], "when_to_choose": ["your agent or script can run shell commands and needs browser control without an SDK or MCP server", "you want a single static binary with no language lock-in", "you need LLM-friendly element refs and self-diagnosing traces", "you want to switch between local Chrome and cloud browser providers with the same commands"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/browser-control", "repo": "keon/browser-control", "role": "main", "score": 91}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.576755+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T07:26:07.770854+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "293679ed6ed31179f6deb25539dbfc87f7c1f7f052841929a72d9e1f522df0ec", "fetched_at": "2026-08-28T04:07:45.576755+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keon/browser-control"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.576755+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T07:26:07.770854+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "293679ed6ed31179f6deb25539dbfc87f7c1f7f052841929a72d9e1f522df0ec", "fetched_at": "2026-08-28T04:07:45.576755+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keon/browser-control"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T07:26:07.770854+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "293679ed6ed31179f6deb25539dbfc87f7c1f7f052841929a72d9e1f522df0ec", "fetched_at": "2026-08-28T04:07:45.576755+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keon/browser-control"}], "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:07:45.576755+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.576755+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.576755+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T07:26:07.770854+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "293679ed6ed31179f6deb25539dbfc87f7c1f7f052841929a72d9e1f522df0ec", "fetched_at": "2026-08-28T04:07:45.576755+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keon/browser-control"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.576755+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.576755+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T07:26:07.770854+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "293679ed6ed31179f6deb25539dbfc87f7c1f7f052841929a72d9e1f522df0ec", "fetched_at": "2026-08-28T04:07:45.576755+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keon/browser-control"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.576755+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.576755+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.576755+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T07:26:07.770854+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "293679ed6ed31179f6deb25539dbfc87f7c1f7f052841929a72d9e1f522df0ec", "fetched_at": "2026-08-28T04:07:45.576755+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keon/browser-control"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.576755+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:45.576755+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T07:26:07.770854+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "293679ed6ed31179f6deb25539dbfc87f7c1f7f052841929a72d9e1f522df0ec", "fetched_at": "2026-08-28T04:07:45.576755+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keon/browser-control"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T07:26:07.770854+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "293679ed6ed31179f6deb25539dbfc87f7c1f7f052841929a72d9e1f522df0ec", "fetched_at": "2026-08-28T04:07:45.576755+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keon/browser-control"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T07:26:07.770854+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "293679ed6ed31179f6deb25539dbfc87f7c1f7f052841929a72d9e1f522df0ec", "fetched_at": "2026-08-28T04:07:45.576755+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keon/browser-control"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T07:26:07.770854+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "293679ed6ed31179f6deb25539dbfc87f7c1f7f052841929a72d9e1f522df0ec", "fetched_at": "2026-08-28T04:07:45.576755+00:00", "kind": "readme", "missing": false, "url": "https://github.com/keon/browser-control"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 88, "longevity": 100, "rhythm": 89}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 3542, "days_push": 73, "days_rel": 73, "gap_med": 1, "n_releases_24m": 2}, "score": 91, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}