{"adoption": {"forks": 130, "observed_at": "2026-08-28T04:04:19.952101+00:00", "stars": 1310}, "canonical_url": "https://ross.abutalabs.com/products/plumhound", "card": {"archived": false, "artifact_type": "cli-tool", "description": "Bloodhound Reporting for Blue and Purple Teams", "domain": ["security", "penetration-testing", "developer-tools"], "enriched": true, "function": ["security", "search-engine", "developer-tools"], "health_score": 67, "homepage": null, "language": "Python", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["PlumHound/PlumHound"], "name": "PlumHound/PlumHound", "platform": ["python", "cli", "cross-platform"], "pushed_at": "2025-11-15T11:44:12+00:00", "repo": "PlumHound/PlumHound", "stars": 1310, "tags": ["bloodhound", "active-directory", "neo4j", "cypher", "blue-team", "purple-team", "red-team", "attack-paths", "infosec", "reporting", "linux"], "topics": ["active", "directory", "blueteam", "purpleteam", "bloodhound", "bloodhoundad", "infosec", "active-directory", "bloodhoundad-cypher-queries", "purple-teams", "plumhound-tasks", "bloodhoundad-pathfinding-engine", "neo4j", "bluehound", "attack-paths", "activedirectory", "cypher-query", "redteam", "reporting-tool", "penetration-testing"], "urls": [], "use_cases": ["generate Active Directory security reports from BloodHound data", "find attack paths to Domain Admin in Active Directory", "run scheduled BloodHound Cypher queries for continuous AD auditing", "harden common Active Directory misconfigurations", "analyze busiest paths to Domain Admin with BlueHound module", "produce HTML reports for blue and purple team exercises", "audit AD privilege escalation paths from Neo4j"], "what_it_is": "PlumHound is a Python CLI reporting engine that wraps BloodHoundAD's Neo4j Cypher queries into consumable security reports for Blue and Purple teams. It identifies Active Directory vulnerabilities and attack paths resulting from business operations, policies, and legacy configurations.", "when_to_avoid": ["you have no BloodHound/Neo4j data collection pipeline in place", "you need a general-purpose vulnerability scanner rather than AD-specific path analysis", "you want a GUI-driven tool instead of a command-line workflow"], "when_to_choose": ["you already collect BloodHound data and need repeatable, operations-friendly reports", "your blue or purple team wants continual AD security lifecycle assessment rather than one-off red team use", "you need task-list-driven or single-query Cypher reporting against a Neo4j backend"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/plumhound", "repo": "PlumHound/PlumHound", "role": "main", "score": 63}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:19.952101+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:49:53.896179+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dcc9a645092c596925ab3256f2861056b109fdedea4c1d4f109254745fd6c9c0", "fetched_at": "2026-08-28T04:04:19.952101+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PlumHound/PlumHound"}, {"content_hash": "d68a66af4c61cea11d7b6841c6467284b9499f173d2cc9c37115a7b0661c96ba", "fetched_at": "2026-08-29T12:07:55.207260+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/plumhound/json"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:19.952101+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:49:53.896179+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dcc9a645092c596925ab3256f2861056b109fdedea4c1d4f109254745fd6c9c0", "fetched_at": "2026-08-28T04:04:19.952101+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PlumHound/PlumHound"}, {"content_hash": "d68a66af4c61cea11d7b6841c6467284b9499f173d2cc9c37115a7b0661c96ba", "fetched_at": "2026-08-29T12:07:55.207260+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/plumhound/json"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:49:53.896179+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dcc9a645092c596925ab3256f2861056b109fdedea4c1d4f109254745fd6c9c0", "fetched_at": "2026-08-28T04:04:19.952101+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PlumHound/PlumHound"}, {"content_hash": "d68a66af4c61cea11d7b6841c6467284b9499f173d2cc9c37115a7b0661c96ba", "fetched_at": "2026-08-29T12:07:55.207260+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/plumhound/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:04:19.952101+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:19.952101+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:19.952101+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:49:53.896179+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dcc9a645092c596925ab3256f2861056b109fdedea4c1d4f109254745fd6c9c0", "fetched_at": "2026-08-28T04:04:19.952101+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PlumHound/PlumHound"}, {"content_hash": "d68a66af4c61cea11d7b6841c6467284b9499f173d2cc9c37115a7b0661c96ba", "fetched_at": "2026-08-29T12:07:55.207260+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/plumhound/json"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:19.952101+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:19.952101+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:49:53.896179+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dcc9a645092c596925ab3256f2861056b109fdedea4c1d4f109254745fd6c9c0", "fetched_at": "2026-08-28T04:04:19.952101+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PlumHound/PlumHound"}, {"content_hash": "d68a66af4c61cea11d7b6841c6467284b9499f173d2cc9c37115a7b0661c96ba", "fetched_at": "2026-08-29T12:07:55.207260+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/plumhound/json"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:19.952101+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:19.952101+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:19.952101+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:49:53.896179+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dcc9a645092c596925ab3256f2861056b109fdedea4c1d4f109254745fd6c9c0", "fetched_at": "2026-08-28T04:04:19.952101+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PlumHound/PlumHound"}, {"content_hash": "d68a66af4c61cea11d7b6841c6467284b9499f173d2cc9c37115a7b0661c96ba", "fetched_at": "2026-08-29T12:07:55.207260+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/plumhound/json"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:19.952101+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:19.952101+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:49:53.896179+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dcc9a645092c596925ab3256f2861056b109fdedea4c1d4f109254745fd6c9c0", "fetched_at": "2026-08-28T04:04:19.952101+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PlumHound/PlumHound"}, {"content_hash": "d68a66af4c61cea11d7b6841c6467284b9499f173d2cc9c37115a7b0661c96ba", "fetched_at": "2026-08-29T12:07:55.207260+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/plumhound/json"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:49:53.896179+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dcc9a645092c596925ab3256f2861056b109fdedea4c1d4f109254745fd6c9c0", "fetched_at": "2026-08-28T04:04:19.952101+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PlumHound/PlumHound"}, {"content_hash": "d68a66af4c61cea11d7b6841c6467284b9499f173d2cc9c37115a7b0661c96ba", "fetched_at": "2026-08-29T12:07:55.207260+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/plumhound/json"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:49:53.896179+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dcc9a645092c596925ab3256f2861056b109fdedea4c1d4f109254745fd6c9c0", "fetched_at": "2026-08-28T04:04:19.952101+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PlumHound/PlumHound"}, {"content_hash": "d68a66af4c61cea11d7b6841c6467284b9499f173d2cc9c37115a7b0661c96ba", "fetched_at": "2026-08-29T12:07:55.207260+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/plumhound/json"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:49:53.896179+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dcc9a645092c596925ab3256f2861056b109fdedea4c1d4f109254745fd6c9c0", "fetched_at": "2026-08-28T04:04:19.952101+00:00", "kind": "readme", "missing": false, "url": "https://github.com/PlumHound/PlumHound"}, {"content_hash": "d68a66af4c61cea11d7b6841c6467284b9499f173d2cc9c37115a7b0661c96ba", "fetched_at": "2026-08-29T12:07:55.207260+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/plumhound/json"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 52, "longevity": 100, "rhythm": 57}, "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": 2315, "days_push": 291, "days_rel": 291, "gap_med": 0, "n_releases_24m": 6}, "score": 63, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}