{"adoption": {"forks": 631, "observed_at": "2026-08-28T04:09:27.915992+00:00", "stars": 5686}, "canonical_url": "https://ross.abutalabs.com/products/cancancan", "card": {"archived": false, "artifact_type": "library", "description": "The authorization Gem for Ruby on Rails.", "domain": ["web-development", "backend", "security"], "enriched": true, "function": ["authorization", "middleware"], "health_score": 78, "homepage": null, "language": "Ruby", "license": "MIT", "license_family": "permissive", "maturity": "stable", "member_repos": ["CanCanCommunity/cancancan"], "name": "CanCanCommunity/cancancan", "platform": ["ruby"], "pushed_at": "2026-08-09T13:29:52+00:00", "repo": "CanCanCommunity/cancancan", "stars": 5686, "tags": ["ruby-on-rails", "gem", "permissions", "access-control", "ability-rules", "web-server"], "topics": ["authorization", "cancancan", "rails"], "urls": [], "use_cases": ["restrict which records a user can read or edit in a Rails app", "define role-based permissions in one Ability file", "authorize controller actions automatically in Rails", "scope database queries to only permitted records", "check permissions in views with can? and cannot?", "handle guest vs logged-in vs admin access rules"], "what_it_is": "CanCanCan is an authorization library for Ruby and Ruby on Rails that restricts which resources a user can access. Permissions are defined in centralized Ability classes and checked via helpers in controllers and views, with automatic record loading and permission scoping for Rails controllers.", "when_to_avoid": ["you need authentication (login/password handling) rather than authorization", "you are not using Ruby or Rails", "you need fine-grained, dynamically administered permissions managed at runtime in a database-driven policy engine"], "when_to_choose": ["you are building a Ruby on Rails application and need centralized authorization logic", "you want permissions defined once and reused across controllers, views, and queries", "you need role-based or attribute-based access control without duplicating checks"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/cancancan", "repo": "CanCanCommunity/cancancan", "role": "main", "score": 66}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:09:27.915992+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T17:54:13.680795+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "edc240be390f943b3d87d3ff735b58695d1e5d45d37d1724d176420e6d747599", "fetched_at": "2026-08-28T04:09:27.915992+00:00", "kind": "readme", "missing": false, "url": "https://github.com/CanCanCommunity/cancancan"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:09:27.915992+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T17:54:13.680795+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "edc240be390f943b3d87d3ff735b58695d1e5d45d37d1724d176420e6d747599", "fetched_at": "2026-08-28T04:09:27.915992+00:00", "kind": "readme", "missing": false, "url": "https://github.com/CanCanCommunity/cancancan"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T17:54:13.680795+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "edc240be390f943b3d87d3ff735b58695d1e5d45d37d1724d176420e6d747599", "fetched_at": "2026-08-28T04:09:27.915992+00:00", "kind": "readme", "missing": false, "url": "https://github.com/CanCanCommunity/cancancan"}], "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:09:27.915992+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:09:27.915992+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:09:27.915992+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T17:54:13.680795+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "edc240be390f943b3d87d3ff735b58695d1e5d45d37d1724d176420e6d747599", "fetched_at": "2026-08-28T04:09:27.915992+00:00", "kind": "readme", "missing": false, "url": "https://github.com/CanCanCommunity/cancancan"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:09:27.915992+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:09:27.915992+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T17:54:13.680795+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "edc240be390f943b3d87d3ff735b58695d1e5d45d37d1724d176420e6d747599", "fetched_at": "2026-08-28T04:09:27.915992+00:00", "kind": "readme", "missing": false, "url": "https://github.com/CanCanCommunity/cancancan"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:09:27.915992+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:09:27.915992+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:09:27.915992+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T17:54:13.680795+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "edc240be390f943b3d87d3ff735b58695d1e5d45d37d1724d176420e6d747599", "fetched_at": "2026-08-28T04:09:27.915992+00:00", "kind": "readme", "missing": false, "url": "https://github.com/CanCanCommunity/cancancan"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:09:27.915992+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:09:27.915992+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T17:54:13.680795+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "edc240be390f943b3d87d3ff735b58695d1e5d45d37d1724d176420e6d747599", "fetched_at": "2026-08-28T04:09:27.915992+00:00", "kind": "readme", "missing": false, "url": "https://github.com/CanCanCommunity/cancancan"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T17:54:13.680795+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "edc240be390f943b3d87d3ff735b58695d1e5d45d37d1724d176420e6d747599", "fetched_at": "2026-08-28T04:09:27.915992+00:00", "kind": "readme", "missing": false, "url": "https://github.com/CanCanCommunity/cancancan"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T17:54:13.680795+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "edc240be390f943b3d87d3ff735b58695d1e5d45d37d1724d176420e6d747599", "fetched_at": "2026-08-28T04:09:27.915992+00:00", "kind": "readme", "missing": false, "url": "https://github.com/CanCanCommunity/cancancan"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T17:54:13.680795+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "edc240be390f943b3d87d3ff735b58695d1e5d45d37d1724d176420e6d747599", "fetched_at": "2026-08-28T04:09:27.915992+00:00", "kind": "readme", "missing": false, "url": "https://github.com/CanCanCommunity/cancancan"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 96, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 4578, "days_push": 24, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 66, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}