{"adoption": {"forks": 345, "observed_at": "2026-08-28T04:09:29.343654+00:00", "stars": 5763}, "canonical_url": "https://ross.abutalabs.com/products/rack-attack", "card": {"archived": false, "artifact_type": "library", "description": "Rack middleware for blocking & throttling", "domain": ["security", "web-development", "backend"], "enriched": true, "function": ["middleware", "rate-limiting", "security", "web-framework"], "health_score": 89, "homepage": null, "language": "Ruby", "license": "MIT", "license_family": "permissive", "maturity": "stable", "member_repos": ["rack/rack-attack"], "name": "rack/rack-attack", "platform": ["ruby", "self-hosted"], "pushed_at": "2026-07-02T20:27:09+00:00", "repo": "rack/rack-attack", "stars": 5763, "tags": ["rack", "rails", "throttling", "blocklist", "safelist", "abuse-protection", "rate-limiting", "web-server"], "topics": ["rack-attack", "ruby", "rack-middleware", "rack"], "urls": [], "use_cases": ["throttle requests per IP in a Rails app", "block abusive clients from my API", "rate limit login endpoints to prevent brute force", "safelist office IPs while blocking others", "ban IPs after repeated failed requests with fail2ban-style rules", "add RateLimit headers to API responses"], "what_it_is": "Rack::Attack is Rack middleware for protecting Ruby and Rails web applications from abusive clients. It lets you define rules to allow, blocklist, safelist, and throttle requests based on request properties.", "when_to_avoid": ["you need network-level or edge protection (use a WAF, CDN, or load balancer instead)", "your app is not Ruby/Rack-based", "you need distributed rate limiting across many datacenters with strict guarantees beyond a shared cache store"], "when_to_choose": ["you run a Rack-based app (Rails, Sinatra) and need request throttling or blocking", "you want simple, configurable middleware-level abuse protection without extra infrastructure", "you need fail2ban/allow2ban-style dynamic banning at the app layer"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/rack-attack", "repo": "rack/rack-attack", "role": "main", "score": 68}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:09:29.343654+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T17:52:57.247278+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e949fed475379bdc6c3f2ef303be24ef4979ccd709d34f1250c9097218e4271e", "fetched_at": "2026-08-28T04:09:29.343654+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rack/rack-attack"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:09:29.343654+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T17:52:57.247278+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e949fed475379bdc6c3f2ef303be24ef4979ccd709d34f1250c9097218e4271e", "fetched_at": "2026-08-28T04:09:29.343654+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rack/rack-attack"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T17:52:57.247278+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e949fed475379bdc6c3f2ef303be24ef4979ccd709d34f1250c9097218e4271e", "fetched_at": "2026-08-28T04:09:29.343654+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rack/rack-attack"}], "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:29.343654+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:09:29.343654+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:09:29.343654+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T17:52:57.247278+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e949fed475379bdc6c3f2ef303be24ef4979ccd709d34f1250c9097218e4271e", "fetched_at": "2026-08-28T04:09:29.343654+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rack/rack-attack"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:09:29.343654+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:09:29.343654+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T17:52:57.247278+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e949fed475379bdc6c3f2ef303be24ef4979ccd709d34f1250c9097218e4271e", "fetched_at": "2026-08-28T04:09:29.343654+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rack/rack-attack"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:09:29.343654+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:09:29.343654+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:09:29.343654+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T17:52:57.247278+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e949fed475379bdc6c3f2ef303be24ef4979ccd709d34f1250c9097218e4271e", "fetched_at": "2026-08-28T04:09:29.343654+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rack/rack-attack"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:09:29.343654+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:09:29.343654+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T17:52:57.247278+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e949fed475379bdc6c3f2ef303be24ef4979ccd709d34f1250c9097218e4271e", "fetched_at": "2026-08-28T04:09:29.343654+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rack/rack-attack"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T17:52:57.247278+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e949fed475379bdc6c3f2ef303be24ef4979ccd709d34f1250c9097218e4271e", "fetched_at": "2026-08-28T04:09:29.343654+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rack/rack-attack"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T17:52:57.247278+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e949fed475379bdc6c3f2ef303be24ef4979ccd709d34f1250c9097218e4271e", "fetched_at": "2026-08-28T04:09:29.343654+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rack/rack-attack"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T17:52:57.247278+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e949fed475379bdc6c3f2ef303be24ef4979ccd709d34f1250c9097218e4271e", "fetched_at": "2026-08-28T04:09:29.343654+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rack/rack-attack"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 90, "longevity": 100, "rhythm": 20}, "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": 5149, "days_push": 62, "days_rel": 323, "gap_med": null, "n_releases_24m": 1}, "score": 68, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}