{"adoption": {"forks": 342, "observed_at": "2026-08-28T04:09:04.003418+00:00", "stars": 4968}, "canonical_url": "https://ross.abutalabs.com/products/wirehole", "card": {"archived": false, "artifact_type": "infra-config", "description": "WireHole is a combination of WireGuard, Pi-hole, and Unbound in a docker-compose project with the intent of enabling users to quickly and easily create a personally managed full or split-tunnel WireGuard VPN with ad blocking capabilities thanks to Pi-hole, and DNS caching, additional privacy options, and upstream providers via Unbound.", "domain": ["networking", "privacy", "self-hosted", "security"], "enriched": true, "function": ["vpn", "caching", "security", "self-hosted", "networking", "deployment"], "health_score": 80, "homepage": "https://iamstoxe.com", "language": "Shell", "license": "NOASSERTION", "license_family": "other", "maturity": "active", "member_repos": ["IAmStoxe/wirehole"], "name": "IAmStoxe/wirehole", "platform": ["self-hosted", "cloud"], "pushed_at": "2026-08-25T03:05:23+00:00", "repo": "IAmStoxe/wirehole", "stars": 4968, "tags": ["wireguard", "pi-hole", "unbound", "ad-blocking", "dns", "docker-compose", "split-tunnel", "dnssec", "devops", "docker", "linux"], "topics": ["pihole", "wireguard", "docker", "adblock", "dns", "vpn", "ad-blocking", "unbound", "pi-hole", "dns-provider"], "urls": [], "use_cases": ["set up my own wireguard vpn server with ad blocking", "self-host a vpn with pihole and unbound", "block ads on all devices through a vpn tunnel", "run a private dns resolver instead of google or cloudflare", "deploy a split tunnel vpn with docker compose", "encrypt my traffic on public wifi with my own server", "get dnssec validating dns for my vpn clients"], "what_it_is": "WireHole is a docker-compose project that combines WireGuard, Pi-hole, and Unbound into a single self-hosted VPN stack. It provides a personal full or split-tunnel VPN with network-wide ad blocking, private recursive DNS resolution, and DNSSEC validation.", "when_to_avoid": ["you need a managed VPN with many server locations and no server maintenance", "you cannot open ports or run a publicly reachable server", "you need obfuscation to evade deep packet inspection or censorship, which plain WireGuard does not provide", "you want a one-click consumer product rather than a self-managed stack"], "when_to_choose": ["you want a personal VPN you fully control instead of a commercial provider", "you want network-wide ad and tracker blocking for every connected device", "you want DNS queries resolved directly by authoritative servers with DNSSEC validation", "you want a quick, pre-configured docker-compose deployment of WireGuard, Pi-hole, and Unbound"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/wirehole", "repo": "IAmStoxe/wirehole", "role": "main", "score": 77}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:09:04.003418+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:17:45.853138+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b7218dea0d5d48a8a37df9222833443e0c06b3408f5c895ef594d6cdc1130fa3", "fetched_at": "2026-08-28T04:09:04.003418+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IAmStoxe/wirehole"}, {"content_hash": "b1011b0513bb8b097871a52a38260f5f1602c22966cf1dd0714044984249b85b", "fetched_at": "2026-08-29T08:59:02.950852+00:00", "kind": "homepage", "missing": false, "url": "https://iamstoxe.com"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:09:04.003418+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:17:45.853138+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b7218dea0d5d48a8a37df9222833443e0c06b3408f5c895ef594d6cdc1130fa3", "fetched_at": "2026-08-28T04:09:04.003418+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IAmStoxe/wirehole"}, {"content_hash": "b1011b0513bb8b097871a52a38260f5f1602c22966cf1dd0714044984249b85b", "fetched_at": "2026-08-29T08:59:02.950852+00:00", "kind": "homepage", "missing": false, "url": "https://iamstoxe.com"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:17:45.853138+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b7218dea0d5d48a8a37df9222833443e0c06b3408f5c895ef594d6cdc1130fa3", "fetched_at": "2026-08-28T04:09:04.003418+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IAmStoxe/wirehole"}, {"content_hash": "b1011b0513bb8b097871a52a38260f5f1602c22966cf1dd0714044984249b85b", "fetched_at": "2026-08-29T08:59:02.950852+00:00", "kind": "homepage", "missing": false, "url": "https://iamstoxe.com"}], "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:04.003418+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:09:04.003418+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:09:04.003418+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:17:45.853138+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b7218dea0d5d48a8a37df9222833443e0c06b3408f5c895ef594d6cdc1130fa3", "fetched_at": "2026-08-28T04:09:04.003418+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IAmStoxe/wirehole"}, {"content_hash": "b1011b0513bb8b097871a52a38260f5f1602c22966cf1dd0714044984249b85b", "fetched_at": "2026-08-29T08:59:02.950852+00:00", "kind": "homepage", "missing": false, "url": "https://iamstoxe.com"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:09:04.003418+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:09:04.003418+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:17:45.853138+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b7218dea0d5d48a8a37df9222833443e0c06b3408f5c895ef594d6cdc1130fa3", "fetched_at": "2026-08-28T04:09:04.003418+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IAmStoxe/wirehole"}, {"content_hash": "b1011b0513bb8b097871a52a38260f5f1602c22966cf1dd0714044984249b85b", "fetched_at": "2026-08-29T08:59:02.950852+00:00", "kind": "homepage", "missing": false, "url": "https://iamstoxe.com"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:09:04.003418+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:09:04.003418+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:09:04.003418+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:17:45.853138+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b7218dea0d5d48a8a37df9222833443e0c06b3408f5c895ef594d6cdc1130fa3", "fetched_at": "2026-08-28T04:09:04.003418+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IAmStoxe/wirehole"}, {"content_hash": "b1011b0513bb8b097871a52a38260f5f1602c22966cf1dd0714044984249b85b", "fetched_at": "2026-08-29T08:59:02.950852+00:00", "kind": "homepage", "missing": false, "url": "https://iamstoxe.com"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:09:04.003418+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:09:04.003418+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:17:45.853138+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b7218dea0d5d48a8a37df9222833443e0c06b3408f5c895ef594d6cdc1130fa3", "fetched_at": "2026-08-28T04:09:04.003418+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IAmStoxe/wirehole"}, {"content_hash": "b1011b0513bb8b097871a52a38260f5f1602c22966cf1dd0714044984249b85b", "fetched_at": "2026-08-29T08:59:02.950852+00:00", "kind": "homepage", "missing": false, "url": "https://iamstoxe.com"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:17:45.853138+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b7218dea0d5d48a8a37df9222833443e0c06b3408f5c895ef594d6cdc1130fa3", "fetched_at": "2026-08-28T04:09:04.003418+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IAmStoxe/wirehole"}, {"content_hash": "b1011b0513bb8b097871a52a38260f5f1602c22966cf1dd0714044984249b85b", "fetched_at": "2026-08-29T08:59:02.950852+00:00", "kind": "homepage", "missing": false, "url": "https://iamstoxe.com"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:17:45.853138+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b7218dea0d5d48a8a37df9222833443e0c06b3408f5c895ef594d6cdc1130fa3", "fetched_at": "2026-08-28T04:09:04.003418+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IAmStoxe/wirehole"}, {"content_hash": "b1011b0513bb8b097871a52a38260f5f1602c22966cf1dd0714044984249b85b", "fetched_at": "2026-08-29T08:59:02.950852+00:00", "kind": "homepage", "missing": false, "url": "https://iamstoxe.com"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:17:45.853138+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "b7218dea0d5d48a8a37df9222833443e0c06b3408f5c895ef594d6cdc1130fa3", "fetched_at": "2026-08-28T04:09:04.003418+00:00", "kind": "readme", "missing": false, "url": "https://github.com/IAmStoxe/wirehole"}, {"content_hash": "b1011b0513bb8b097871a52a38260f5f1602c22966cf1dd0714044984249b85b", "fetched_at": "2026-08-29T08:59:02.950852+00:00", "kind": "homepage", "missing": false, "url": "https://iamstoxe.com"}], "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_license"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2190, "days_push": 8, "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}}