{"adoption": {"forks": 111, "observed_at": "2026-08-28T04:05:54.904622+00:00", "stars": 1919}, "canonical_url": "https://ross.abutalabs.com/products/rodauth", "card": {"archived": false, "artifact_type": "library", "description": "Ruby's Most Advanced Authentication Framework", "domain": ["web-development", "backend", "security", "developer-tools"], "enriched": true, "function": ["auth", "authorization", "middleware", "web-framework"], "health_score": 80, "homepage": "http://rodauth.jeremyevans.net", "language": "Ruby", "license": "MIT", "license_family": "permissive", "maturity": "stable", "member_repos": ["jeremyevans/rodauth"], "name": "jeremyevans/rodauth", "platform": ["ruby"], "pushed_at": "2026-08-24T06:32:17+00:00", "repo": "jeremyevans/rodauth", "stars": 1919, "tags": ["authentication", "roda", "rails", "sinatra", "mfa", "webauthn", "jwt", "password-management", "account-management", "web-server"], "topics": [], "urls": [], "use_cases": ["add user login and registration to a Ruby web app", "implement two-factor authentication with OTP and WebAuthn", "build a JSON API with JWT-based authentication", "manage password resets, changes, and account closure flows", "add audit logging for authentication actions", "integrate authentication into Rails or Sinatra via Rack middleware", "enforce session security with active session tracking and single logout"], "what_it_is": "Rodauth is Ruby's most advanced authentication framework, providing a comprehensive set of composable authentication features built on the Roda web toolkit. It supports login, account creation, password management, multifactor authentication (OTP, WebAuthn, recovery codes), JSON/JWT APIs, and works standalone or as middleware in Rack apps.", "when_to_avoid": ["you need authentication in a non-Ruby stack", "you want a zero-configuration hosted auth service instead of a self-managed framework", "your app is trivial and a simple session-based login suffices"], "when_to_choose": ["you need a full-featured, security-hardened authentication system in Ruby", "you want granular control by enabling only the features you need", "you need multifactor authentication, WebAuthn, or JWT support out of the box", "you use Roda, Rails, Sinatra, or any Rack-based application"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/rodauth", "repo": "jeremyevans/rodauth", "role": "main", "score": 77}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:54.904622+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:09:58.386983+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2af88cb2e878b5d79a5629c79d6003d65debd0db6fd987f335de79a5bb1c60e3", "fetched_at": "2026-08-29T10:49:16.057923+00:00", "kind": "homepage", "missing": false, "url": "http://rodauth.jeremyevans.net"}, {"content_hash": "092b90a67133a49daf1a634715903f53bf9986fdbb96ac13c913546bd93122b1", "fetched_at": "2026-08-29T10:49:16.066807+00:00", "kind": "site_page", "missing": false, "url": "http://rodauth.jeremyevans.net/documentation.html"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:54.904622+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:09:58.386983+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2af88cb2e878b5d79a5629c79d6003d65debd0db6fd987f335de79a5bb1c60e3", "fetched_at": "2026-08-29T10:49:16.057923+00:00", "kind": "homepage", "missing": false, "url": "http://rodauth.jeremyevans.net"}, {"content_hash": "092b90a67133a49daf1a634715903f53bf9986fdbb96ac13c913546bd93122b1", "fetched_at": "2026-08-29T10:49:16.066807+00:00", "kind": "site_page", "missing": false, "url": "http://rodauth.jeremyevans.net/documentation.html"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:09:58.386983+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2af88cb2e878b5d79a5629c79d6003d65debd0db6fd987f335de79a5bb1c60e3", "fetched_at": "2026-08-29T10:49:16.057923+00:00", "kind": "homepage", "missing": false, "url": "http://rodauth.jeremyevans.net"}, {"content_hash": "092b90a67133a49daf1a634715903f53bf9986fdbb96ac13c913546bd93122b1", "fetched_at": "2026-08-29T10:49:16.066807+00:00", "kind": "site_page", "missing": false, "url": "http://rodauth.jeremyevans.net/documentation.html"}], "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:54.904622+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:54.904622+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:54.904622+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:09:58.386983+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2af88cb2e878b5d79a5629c79d6003d65debd0db6fd987f335de79a5bb1c60e3", "fetched_at": "2026-08-29T10:49:16.057923+00:00", "kind": "homepage", "missing": false, "url": "http://rodauth.jeremyevans.net"}, {"content_hash": "092b90a67133a49daf1a634715903f53bf9986fdbb96ac13c913546bd93122b1", "fetched_at": "2026-08-29T10:49:16.066807+00:00", "kind": "site_page", "missing": false, "url": "http://rodauth.jeremyevans.net/documentation.html"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:54.904622+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:54.904622+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:09:58.386983+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2af88cb2e878b5d79a5629c79d6003d65debd0db6fd987f335de79a5bb1c60e3", "fetched_at": "2026-08-29T10:49:16.057923+00:00", "kind": "homepage", "missing": false, "url": "http://rodauth.jeremyevans.net"}, {"content_hash": "092b90a67133a49daf1a634715903f53bf9986fdbb96ac13c913546bd93122b1", "fetched_at": "2026-08-29T10:49:16.066807+00:00", "kind": "site_page", "missing": false, "url": "http://rodauth.jeremyevans.net/documentation.html"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:54.904622+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:54.904622+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:54.904622+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:09:58.386983+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2af88cb2e878b5d79a5629c79d6003d65debd0db6fd987f335de79a5bb1c60e3", "fetched_at": "2026-08-29T10:49:16.057923+00:00", "kind": "homepage", "missing": false, "url": "http://rodauth.jeremyevans.net"}, {"content_hash": "092b90a67133a49daf1a634715903f53bf9986fdbb96ac13c913546bd93122b1", "fetched_at": "2026-08-29T10:49:16.066807+00:00", "kind": "site_page", "missing": false, "url": "http://rodauth.jeremyevans.net/documentation.html"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:54.904622+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:54.904622+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:09:58.386983+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2af88cb2e878b5d79a5629c79d6003d65debd0db6fd987f335de79a5bb1c60e3", "fetched_at": "2026-08-29T10:49:16.057923+00:00", "kind": "homepage", "missing": false, "url": "http://rodauth.jeremyevans.net"}, {"content_hash": "092b90a67133a49daf1a634715903f53bf9986fdbb96ac13c913546bd93122b1", "fetched_at": "2026-08-29T10:49:16.066807+00:00", "kind": "site_page", "missing": false, "url": "http://rodauth.jeremyevans.net/documentation.html"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:09:58.386983+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2af88cb2e878b5d79a5629c79d6003d65debd0db6fd987f335de79a5bb1c60e3", "fetched_at": "2026-08-29T10:49:16.057923+00:00", "kind": "homepage", "missing": false, "url": "http://rodauth.jeremyevans.net"}, {"content_hash": "092b90a67133a49daf1a634715903f53bf9986fdbb96ac13c913546bd93122b1", "fetched_at": "2026-08-29T10:49:16.066807+00:00", "kind": "site_page", "missing": false, "url": "http://rodauth.jeremyevans.net/documentation.html"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:09:58.386983+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2af88cb2e878b5d79a5629c79d6003d65debd0db6fd987f335de79a5bb1c60e3", "fetched_at": "2026-08-29T10:49:16.057923+00:00", "kind": "homepage", "missing": false, "url": "http://rodauth.jeremyevans.net"}, {"content_hash": "092b90a67133a49daf1a634715903f53bf9986fdbb96ac13c913546bd93122b1", "fetched_at": "2026-08-29T10:49:16.066807+00:00", "kind": "site_page", "missing": false, "url": "http://rodauth.jeremyevans.net/documentation.html"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:09:58.386983+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2af88cb2e878b5d79a5629c79d6003d65debd0db6fd987f335de79a5bb1c60e3", "fetched_at": "2026-08-29T10:49:16.057923+00:00", "kind": "homepage", "missing": false, "url": "http://rodauth.jeremyevans.net"}, {"content_hash": "092b90a67133a49daf1a634715903f53bf9986fdbb96ac13c913546bd93122b1", "fetched_at": "2026-08-29T10:49:16.066807+00:00", "kind": "site_page", "missing": false, "url": "http://rodauth.jeremyevans.net/documentation.html"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["no_releases", "no_readme"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 4039, "days_push": 9, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 77, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}