{"adoption": {"forks": 298, "observed_at": "2026-08-28T04:09:51.152981+00:00", "stars": 6895}, "canonical_url": "https://ross.abutalabs.com/products/blocky", "card": {"archived": false, "artifact_type": "application", "description": "Fast and lightweight DNS proxy as ad-blocker for local network with many features", "domain": ["networking", "security", "self-hosted", "privacy"], "enriched": true, "function": ["proxy", "caching", "security", "networking", "self-hosted"], "health_score": 100, "homepage": "https://0xERR0R.github.io/blocky/", "language": "Go", "license": "Apache-2.0", "license_family": "permissive", "maturity": "active", "member_repos": ["0xERR0R/blocky"], "name": "0xERR0R/blocky", "platform": ["self-hosted", "go", "cross-platform"], "pushed_at": "2026-08-24T05:07:55+00:00", "repo": "0xERR0R/blocky", "stars": 6895, "tags": ["dns-proxy", "ad-blocker", "dns-over-https", "dns-over-tls", "pihole-alternative", "parental-control", "network-wide-blocking", "linux", "docker"], "topics": ["ad-blocker", "adblocker", "dns", "self-hosted", "golang", "selfhosted", "pihole", "dns-over-https", "dns-server", "parental-control", "adblock"], "urls": [], "use_cases": ["block ads network-wide with a self-hosted dns server", "replace pihole with a lightweight dns ad-blocker", "set up dns-over-https and dns-over-tls for my home network", "filter dns queries per device for parental controls", "cache and prefetch dns queries to speed up resolution", "block malware domains using external blocklists", "forward dns conditionally to different upstream resolvers"], "what_it_is": "Blocky is a fast, lightweight DNS proxy and ad-blocker for local networks, written in Go. It blocks ads and malware via external allow/denylists, supports modern DNS protocols (DoH, DoT, DoQ), and offers caching, prefetching, and per-client DNS configuration.", "when_to_avoid": ["you need a full web UI with dashboards and query logs like Pi-hole or AdGuard Home", "you want DHCP server functionality bundled with your DNS blocker", "you need a GUI-managed solution rather than YAML configuration files"], "when_to_choose": ["you want a fast, low-memory DNS ad-blocker for your whole local network", "you need modern DNS protocols like DoH, DoT, or DoQ with upstream encryption", "you need per-client-group blocking rules, regex lists, or parental controls", "you prefer a single Go binary or Docker container over heavier solutions like Pi-hole"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/blocky", "repo": "0xERR0R/blocky", "role": "main", "score": 98}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:09:51.152981+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T17:41:38.113809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "609a06c7860326cfd8527c5a7b4642001fe79820622cdc6d0f25fe7089820b4f", "fetched_at": "2026-08-28T04:09:51.152981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/0xERR0R/blocky"}, {"content_hash": "36c6c3c2e4f9f7e35fb7fea86ea9bfd1cf7fe7061016698b1a017ae1cc7f4a36", "fetched_at": "2026-08-29T08:37:22.802747+00:00", "kind": "homepage", "missing": false, "url": "https://0xERR0R.github.io/blocky/"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:09:51.152981+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T17:41:38.113809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "609a06c7860326cfd8527c5a7b4642001fe79820622cdc6d0f25fe7089820b4f", "fetched_at": "2026-08-28T04:09:51.152981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/0xERR0R/blocky"}, {"content_hash": "36c6c3c2e4f9f7e35fb7fea86ea9bfd1cf7fe7061016698b1a017ae1cc7f4a36", "fetched_at": "2026-08-29T08:37:22.802747+00:00", "kind": "homepage", "missing": false, "url": "https://0xERR0R.github.io/blocky/"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T17:41:38.113809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "609a06c7860326cfd8527c5a7b4642001fe79820622cdc6d0f25fe7089820b4f", "fetched_at": "2026-08-28T04:09:51.152981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/0xERR0R/blocky"}, {"content_hash": "36c6c3c2e4f9f7e35fb7fea86ea9bfd1cf7fe7061016698b1a017ae1cc7f4a36", "fetched_at": "2026-08-29T08:37:22.802747+00:00", "kind": "homepage", "missing": false, "url": "https://0xERR0R.github.io/blocky/"}], "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:51.152981+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:09:51.152981+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:09:51.152981+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T17:41:38.113809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "609a06c7860326cfd8527c5a7b4642001fe79820622cdc6d0f25fe7089820b4f", "fetched_at": "2026-08-28T04:09:51.152981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/0xERR0R/blocky"}, {"content_hash": "36c6c3c2e4f9f7e35fb7fea86ea9bfd1cf7fe7061016698b1a017ae1cc7f4a36", "fetched_at": "2026-08-29T08:37:22.802747+00:00", "kind": "homepage", "missing": false, "url": "https://0xERR0R.github.io/blocky/"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:09:51.152981+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:09:51.152981+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T17:41:38.113809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "609a06c7860326cfd8527c5a7b4642001fe79820622cdc6d0f25fe7089820b4f", "fetched_at": "2026-08-28T04:09:51.152981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/0xERR0R/blocky"}, {"content_hash": "36c6c3c2e4f9f7e35fb7fea86ea9bfd1cf7fe7061016698b1a017ae1cc7f4a36", "fetched_at": "2026-08-29T08:37:22.802747+00:00", "kind": "homepage", "missing": false, "url": "https://0xERR0R.github.io/blocky/"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:09:51.152981+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:09:51.152981+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:09:51.152981+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T17:41:38.113809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "609a06c7860326cfd8527c5a7b4642001fe79820622cdc6d0f25fe7089820b4f", "fetched_at": "2026-08-28T04:09:51.152981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/0xERR0R/blocky"}, {"content_hash": "36c6c3c2e4f9f7e35fb7fea86ea9bfd1cf7fe7061016698b1a017ae1cc7f4a36", "fetched_at": "2026-08-29T08:37:22.802747+00:00", "kind": "homepage", "missing": false, "url": "https://0xERR0R.github.io/blocky/"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:09:51.152981+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:09:51.152981+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T17:41:38.113809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "609a06c7860326cfd8527c5a7b4642001fe79820622cdc6d0f25fe7089820b4f", "fetched_at": "2026-08-28T04:09:51.152981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/0xERR0R/blocky"}, {"content_hash": "36c6c3c2e4f9f7e35fb7fea86ea9bfd1cf7fe7061016698b1a017ae1cc7f4a36", "fetched_at": "2026-08-29T08:37:22.802747+00:00", "kind": "homepage", "missing": false, "url": "https://0xERR0R.github.io/blocky/"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T17:41:38.113809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "609a06c7860326cfd8527c5a7b4642001fe79820622cdc6d0f25fe7089820b4f", "fetched_at": "2026-08-28T04:09:51.152981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/0xERR0R/blocky"}, {"content_hash": "36c6c3c2e4f9f7e35fb7fea86ea9bfd1cf7fe7061016698b1a017ae1cc7f4a36", "fetched_at": "2026-08-29T08:37:22.802747+00:00", "kind": "homepage", "missing": false, "url": "https://0xERR0R.github.io/blocky/"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T17:41:38.113809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "609a06c7860326cfd8527c5a7b4642001fe79820622cdc6d0f25fe7089820b4f", "fetched_at": "2026-08-28T04:09:51.152981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/0xERR0R/blocky"}, {"content_hash": "36c6c3c2e4f9f7e35fb7fea86ea9bfd1cf7fe7061016698b1a017ae1cc7f4a36", "fetched_at": "2026-08-29T08:37:22.802747+00:00", "kind": "homepage", "missing": false, "url": "https://0xERR0R.github.io/blocky/"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T17:41:38.113809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "609a06c7860326cfd8527c5a7b4642001fe79820622cdc6d0f25fe7089820b4f", "fetched_at": "2026-08-28T04:09:51.152981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/0xERR0R/blocky"}, {"content_hash": "36c6c3c2e4f9f7e35fb7fea86ea9bfd1cf7fe7061016698b1a017ae1cc7f4a36", "fetched_at": "2026-08-29T08:37:22.802747+00:00", "kind": "homepage", "missing": false, "url": "https://0xERR0R.github.io/blocky/"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 100, "rhythm": 95}, "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": 2492, "days_push": 9, "days_rel": 37, "gap_med": 16, "n_releases_24m": 14}, "score": 98, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}