{"adoption": {"forks": 174, "observed_at": "2026-08-28T04:04:38.162444+00:00", "stars": 1405}, "canonical_url": "https://ross.abutalabs.com/products/firewall", "card": {"archived": false, "artifact_type": "library", "description": "Firewall package for Laravel applications", "domain": ["security", "web-development", "backend"], "enriched": true, "function": ["security", "middleware", "rate-limiting", "routing"], "health_score": 20, "homepage": null, "language": "PHP", "license": "BSD-3-Clause", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["antonioribeiro/firewall"], "name": "antonioribeiro/firewall", "platform": ["php", "self-hosted"], "pushed_at": "2023-02-17T12:06:34+00:00", "repo": "antonioribeiro/firewall", "stars": 1405, "tags": ["laravel", "ip-blocking", "whitelist", "blacklist", "attack-detection", "soft-firewall", "web-server"], "topics": ["firewall", "attack-prevention", "laravel", "php", "attack-detection"], "urls": [], "use_cases": ["block requests from specific IP addresses or countries in Laravel", "whitelist my office IP and redirect everyone else to a coming soon page", "detect and block too many requests from a single IP", "protect admin routes with an IP blacklist middleware", "whitelist a developer machine with a dynamic DNS hostname", "get Slack alerts when an attack is detected"], "what_it_is": "A Laravel package acting as a soft-firewall that controls route access by IP address, country, or host via blacklists and whitelists. It also detects and blocks attacks such as excessive requests from single IPs or countries, with optional Slack notifications.", "when_to_avoid": ["you need network-level firewalling or DDoS protection - use a real firewall or WAF", "your project is not Laravel/PHP", "you need actively maintained security tooling - the latest release is from 2023"], "when_to_choose": ["you run a Laravel app and need application-level IP-based access control", "you want simple attack detection and blocking at the HTTP request layer", "you need country- or range-based whitelisting/blacklisting with middleware"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/firewall", "repo": "antonioribeiro/firewall", "role": "main", "score": 32}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:38.162444+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:38:46.575699+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "95f8cfca3b8264a6b8209b3982f107a05618c8f44cabe714aff96a7a325d956c", "fetched_at": "2026-08-28T04:04:38.162444+00:00", "kind": "readme", "missing": false, "url": "https://github.com/antonioribeiro/firewall"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:38.162444+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:38:46.575699+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "95f8cfca3b8264a6b8209b3982f107a05618c8f44cabe714aff96a7a325d956c", "fetched_at": "2026-08-28T04:04:38.162444+00:00", "kind": "readme", "missing": false, "url": "https://github.com/antonioribeiro/firewall"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:38:46.575699+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "95f8cfca3b8264a6b8209b3982f107a05618c8f44cabe714aff96a7a325d956c", "fetched_at": "2026-08-28T04:04:38.162444+00:00", "kind": "readme", "missing": false, "url": "https://github.com/antonioribeiro/firewall"}], "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:38.162444+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:38.162444+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:38.162444+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:38:46.575699+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "95f8cfca3b8264a6b8209b3982f107a05618c8f44cabe714aff96a7a325d956c", "fetched_at": "2026-08-28T04:04:38.162444+00:00", "kind": "readme", "missing": false, "url": "https://github.com/antonioribeiro/firewall"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:38.162444+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:38.162444+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:38:46.575699+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "95f8cfca3b8264a6b8209b3982f107a05618c8f44cabe714aff96a7a325d956c", "fetched_at": "2026-08-28T04:04:38.162444+00:00", "kind": "readme", "missing": false, "url": "https://github.com/antonioribeiro/firewall"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:38.162444+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:38.162444+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:38.162444+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:38:46.575699+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "95f8cfca3b8264a6b8209b3982f107a05618c8f44cabe714aff96a7a325d956c", "fetched_at": "2026-08-28T04:04:38.162444+00:00", "kind": "readme", "missing": false, "url": "https://github.com/antonioribeiro/firewall"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:38.162444+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:38.162444+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:38:46.575699+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "95f8cfca3b8264a6b8209b3982f107a05618c8f44cabe714aff96a7a325d956c", "fetched_at": "2026-08-28T04:04:38.162444+00:00", "kind": "readme", "missing": false, "url": "https://github.com/antonioribeiro/firewall"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:38:46.575699+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "95f8cfca3b8264a6b8209b3982f107a05618c8f44cabe714aff96a7a325d956c", "fetched_at": "2026-08-28T04:04:38.162444+00:00", "kind": "readme", "missing": false, "url": "https://github.com/antonioribeiro/firewall"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:38:46.575699+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "95f8cfca3b8264a6b8209b3982f107a05618c8f44cabe714aff96a7a325d956c", "fetched_at": "2026-08-28T04:04:38.162444+00:00", "kind": "readme", "missing": false, "url": "https://github.com/antonioribeiro/firewall"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:38:46.575699+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "95f8cfca3b8264a6b8209b3982f107a05618c8f44cabe714aff96a7a325d956c", "fetched_at": "2026-08-28T04:04:38.162444+00:00", "kind": "readme", "missing": false, "url": "https://github.com/antonioribeiro/firewall"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 4641, "days_push": 1293, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 32, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}