{"adoption": {"forks": 217, "observed_at": "2026-08-28T04:05:22.360665+00:00", "stars": 1688}, "canonical_url": "https://ross.abutalabs.com/products/planout", "card": {"archived": true, "artifact_type": "library", "description": "PlanOut is a library and interpreter for designing online experiments.", "domain": ["analytics", "developer-tools", "data-science"], "enriched": true, "function": ["testing", "sdk", "developer-tools"], "health_score": 10, "homepage": "http://facebook.github.io/planout", "language": "JavaScript", "license": "NOASSERTION", "license_family": "other", "maturity": "maintenance", "member_repos": ["facebookarchive/planout"], "name": "facebookarchive/planout", "platform": ["python", "jvm", "php", "cross-platform"], "pushed_at": "2021-03-19T22:24:45+00:00", "repo": "facebookarchive/planout", "stars": 1688, "tags": ["a-b-testing", "experimentation", "field-experiments", "randomized-assignment", "deterministic-hashing", "abandoned", "nodejs"], "topics": [], "urls": [], "use_cases": ["run A/B tests on button colors and text", "randomly assign users to experiment variants deterministically", "manage multiple mutually exclusive experiments with namespaces", "log experiment assignment data for analysis", "execute serialized experiment scripts written in the PlanOut DSL", "run controlled online field experiments at scale"], "what_it_is": "PlanOut is a framework and domain-specific language for online field experimentation, letting developers define how units (e.g., users) are deterministically mapped to experiment conditions via hashing. It ships a Python reference implementation plus interpreters and SDKs for Java, JavaScript, and PHP, along with a web-based editor and compiler.", "when_to_avoid": ["you need a maintained project with active support and updates", "you want a full-featured hosted experimentation platform with dashboards and statistical analysis", "you require multi-armed bandit or adaptive experimentation out of the box", "your stack has no PlanOut SDK available"], "when_to_choose": ["you need deterministic, hash-based random assignment of users to experiment conditions", "you want a lightweight self-hosted alternative to hosted A/B testing platforms", "you are a researcher or small business running online experiments", "you need cross-language experiment assignment (Python, Java, JavaScript, PHP)"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/planout", "repo": "facebookarchive/planout", "role": "main", "score": 10}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.360665+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:38:43.231243+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8bf57770242208ea2283b36ba6c19e8fdf4a5e68379e772a71f4ac353e2ab6d", "fetched_at": "2026-08-28T04:05:22.360665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/facebookarchive/planout"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.360665+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:38:43.231243+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8bf57770242208ea2283b36ba6c19e8fdf4a5e68379e772a71f4ac353e2ab6d", "fetched_at": "2026-08-28T04:05:22.360665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/facebookarchive/planout"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:38:43.231243+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8bf57770242208ea2283b36ba6c19e8fdf4a5e68379e772a71f4ac353e2ab6d", "fetched_at": "2026-08-28T04:05:22.360665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/facebookarchive/planout"}], "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:22.360665+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.360665+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.360665+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:38:43.231243+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8bf57770242208ea2283b36ba6c19e8fdf4a5e68379e772a71f4ac353e2ab6d", "fetched_at": "2026-08-28T04:05:22.360665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/facebookarchive/planout"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.360665+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.360665+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:38:43.231243+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8bf57770242208ea2283b36ba6c19e8fdf4a5e68379e772a71f4ac353e2ab6d", "fetched_at": "2026-08-28T04:05:22.360665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/facebookarchive/planout"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.360665+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.360665+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.360665+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:38:43.231243+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8bf57770242208ea2283b36ba6c19e8fdf4a5e68379e772a71f4ac353e2ab6d", "fetched_at": "2026-08-28T04:05:22.360665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/facebookarchive/planout"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.360665+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:22.360665+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:38:43.231243+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8bf57770242208ea2283b36ba6c19e8fdf4a5e68379e772a71f4ac353e2ab6d", "fetched_at": "2026-08-28T04:05:22.360665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/facebookarchive/planout"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:38:43.231243+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8bf57770242208ea2283b36ba6c19e8fdf4a5e68379e772a71f4ac353e2ab6d", "fetched_at": "2026-08-28T04:05:22.360665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/facebookarchive/planout"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:38:43.231243+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8bf57770242208ea2283b36ba6c19e8fdf4a5e68379e772a71f4ac353e2ab6d", "fetched_at": "2026-08-28T04:05:22.360665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/facebookarchive/planout"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:38:43.231243+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "c8bf57770242208ea2283b36ba6c19e8fdf4a5e68379e772a71f4ac353e2ab6d", "fetched_at": "2026-08-28T04:05:22.360665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/facebookarchive/planout"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases", "archived", "no_license"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 4603, "days_push": 1993, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 10, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}