{"adoption": {"forks": 390, "observed_at": "2026-08-28T04:07:11.564947+00:00", "stars": 2704}, "canonical_url": "https://ross.abutalabs.com/products/roadtools", "card": {"archived": false, "artifact_type": "framework", "description": "A collection of Azure AD/Entra tools for offensive and defensive security purposes", "domain": ["security", "cloud-computing", "developer-tools", "penetration-testing"], "enriched": true, "function": ["security", "http-client", "database", "cli", "developer-tools"], "health_score": 78, "homepage": null, "language": "Python", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["dirkjanm/ROADtools"], "name": "dirkjanm/ROADtools", "platform": ["python", "cli", "cross-platform"], "pushed_at": "2026-08-05T13:43:22+00:00", "repo": "dirkjanm/ROADtools", "stars": 2704, "tags": ["azure-ad", "entra-id", "red-team", "offensive-security", "microsoft-graph", "token-exchange", "roadrecon", "roadtx"], "topics": ["azure-active-directory", "azuread", "microsoft-graph", "python"], "urls": [], "use_cases": ["enumerate Azure AD tenant information for security assessment", "dump Azure AD data into an offline database for analysis", "authenticate to Azure AD and request tokens programmatically", "audit Azure AD permissions and roles from a blue team perspective", "perform token exchange and device code phishing simulations", "explore Azure AD graph data offline via a web GUI"], "what_it_is": "ROADtools is a Python framework for interacting with Azure AD/Entra ID, comprising the roadlib authentication library, the ROADrecon exploration tool that dumps tenant data into a local database with an Angular GUI, and the roadtx token exchange tool. It is designed for both offensive (red team) and defensive (blue team) security analysis of Azure AD environments.", "when_to_avoid": ["you need general-purpose Azure resource management rather than Azure AD specifics", "you want a passive monitoring or logging tool rather than an enumeration framework", "your environment does not permit Azure AD graph API access", "you need a GUI-first commercial product with vendor support"], "when_to_choose": ["you need to enumerate or audit an Azure AD/Entra tenant during a security assessment", "you want a scriptable Python library for Azure AD authentication and token handling", "you need offline analysis of Azure AD data with a rich GUI", "you are red or blue teaming Microsoft cloud environments"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/roadtools", "repo": "dirkjanm/ROADtools", "role": "main", "score": 75}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:11.564947+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:15:51.680353+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "37375ff61ab732771c234af09622189be4823a150194545e469f43c9407b7491", "fetched_at": "2026-08-28T04:07:11.564947+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dirkjanm/ROADtools"}, {"content_hash": "d8d02959193e9d527e7a95953119ea2f2c4d83fc4a7f58d60fb723c06a4c42f9", "fetched_at": "2026-08-29T09:58:50.831213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/roadtools/json"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:11.564947+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:15:51.680353+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "37375ff61ab732771c234af09622189be4823a150194545e469f43c9407b7491", "fetched_at": "2026-08-28T04:07:11.564947+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dirkjanm/ROADtools"}, {"content_hash": "d8d02959193e9d527e7a95953119ea2f2c4d83fc4a7f58d60fb723c06a4c42f9", "fetched_at": "2026-08-29T09:58:50.831213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/roadtools/json"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:15:51.680353+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "37375ff61ab732771c234af09622189be4823a150194545e469f43c9407b7491", "fetched_at": "2026-08-28T04:07:11.564947+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dirkjanm/ROADtools"}, {"content_hash": "d8d02959193e9d527e7a95953119ea2f2c4d83fc4a7f58d60fb723c06a4c42f9", "fetched_at": "2026-08-29T09:58:50.831213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/roadtools/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:07:11.564947+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:11.564947+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:11.564947+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:15:51.680353+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "37375ff61ab732771c234af09622189be4823a150194545e469f43c9407b7491", "fetched_at": "2026-08-28T04:07:11.564947+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dirkjanm/ROADtools"}, {"content_hash": "d8d02959193e9d527e7a95953119ea2f2c4d83fc4a7f58d60fb723c06a4c42f9", "fetched_at": "2026-08-29T09:58:50.831213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/roadtools/json"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:11.564947+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:11.564947+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:15:51.680353+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "37375ff61ab732771c234af09622189be4823a150194545e469f43c9407b7491", "fetched_at": "2026-08-28T04:07:11.564947+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dirkjanm/ROADtools"}, {"content_hash": "d8d02959193e9d527e7a95953119ea2f2c4d83fc4a7f58d60fb723c06a4c42f9", "fetched_at": "2026-08-29T09:58:50.831213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/roadtools/json"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:11.564947+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:11.564947+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:11.564947+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:15:51.680353+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "37375ff61ab732771c234af09622189be4823a150194545e469f43c9407b7491", "fetched_at": "2026-08-28T04:07:11.564947+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dirkjanm/ROADtools"}, {"content_hash": "d8d02959193e9d527e7a95953119ea2f2c4d83fc4a7f58d60fb723c06a4c42f9", "fetched_at": "2026-08-29T09:58:50.831213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/roadtools/json"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:11.564947+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:11.564947+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:15:51.680353+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "37375ff61ab732771c234af09622189be4823a150194545e469f43c9407b7491", "fetched_at": "2026-08-28T04:07:11.564947+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dirkjanm/ROADtools"}, {"content_hash": "d8d02959193e9d527e7a95953119ea2f2c4d83fc4a7f58d60fb723c06a4c42f9", "fetched_at": "2026-08-29T09:58:50.831213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/roadtools/json"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:15:51.680353+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "37375ff61ab732771c234af09622189be4823a150194545e469f43c9407b7491", "fetched_at": "2026-08-28T04:07:11.564947+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dirkjanm/ROADtools"}, {"content_hash": "d8d02959193e9d527e7a95953119ea2f2c4d83fc4a7f58d60fb723c06a4c42f9", "fetched_at": "2026-08-29T09:58:50.831213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/roadtools/json"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:15:51.680353+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "37375ff61ab732771c234af09622189be4823a150194545e469f43c9407b7491", "fetched_at": "2026-08-28T04:07:11.564947+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dirkjanm/ROADtools"}, {"content_hash": "d8d02959193e9d527e7a95953119ea2f2c4d83fc4a7f58d60fb723c06a4c42f9", "fetched_at": "2026-08-29T09:58:50.831213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/roadtools/json"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:15:51.680353+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "37375ff61ab732771c234af09622189be4823a150194545e469f43c9407b7491", "fetched_at": "2026-08-28T04:07:11.564947+00:00", "kind": "readme", "missing": false, "url": "https://github.com/dirkjanm/ROADtools"}, {"content_hash": "d8d02959193e9d527e7a95953119ea2f2c4d83fc4a7f58d60fb723c06a4c42f9", "fetched_at": "2026-08-29T09:58:50.831213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/roadtools/json"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 96, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2349, "days_push": 28, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 75, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}