{"adoption": {"forks": 200, "observed_at": "2026-08-28T04:04:32.948099+00:00", "stars": 1374}, "canonical_url": "https://ross.abutalabs.com/products/chinadns-ng", "card": {"archived": false, "artifact_type": "cli-tool", "description": "chinadns 重构增强版，支持域名分流、ipset/nftset、UDP/TCP/DoT", "domain": ["networking", "privacy", "censorship-circumvention", "self-hosted"], "enriched": true, "function": ["networking", "proxy", "security", "caching"], "health_score": 56, "homepage": null, "language": "Zig", "license": "AGPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["zfl9/chinadns-ng"], "name": "zfl9/chinadns-ng", "platform": ["cli", "embedded"], "pushed_at": "2025-08-09T09:22:44+00:00", "repo": "zfl9/chinadns-ng", "stars": 1374, "tags": ["dns-splitting", "gfwlist", "chnlist", "ipset", "nftables", "dns-over-tls", "transparent-proxy", "openwrt", "anti-dns-poisoning", "command-line", "linux"], "topics": ["chinadns", "chinadns-ng", "ipset", "netlink", "ss-tproxy", "dns", "gfwlist", "dnsmasq", "nftables", "dot", "dns-over-tls", "iptables"], "urls": [], "use_cases": ["split DNS queries between Chinese and foreign DNS servers", "avoid DNS poisoning when resolving blocked domains", "populate ipset or nftables sets with resolved IPs for transparent proxying", "prevent DNS leaks when using a VPN or proxy", "run a lightweight DNS forwarder on an OpenWrt router", "resolve Chinese domains via domestic DNS for CDN-friendly results"], "what_it_is": "ChinaDNS-NG is a rewritten and enhanced version of ChinaDNS that splits DNS queries between domestic (China) and trusted upstream DNS servers based on domain lists like chnlist and gfwlist. It supports UDP/TCP/DoT upstreams, dynamic ipset/nftset population, DNS caching, and fine-grained IPv6 filtering to support transparent proxy and anti-censorship routing setups.", "when_to_avoid": ["you need a general-purpose full-featured DNS server like dnsmasq or AdGuard Home", "you are not in a censorship/DNS-pollution scenario and just need a simple DNS resolver", "you need DNS-over-HTTPS upstreams, which are not supported", "you need a GUI-managed DNS solution"], "when_to_choose": ["you need DNS-based traffic splitting for transparent proxy setups like ss-tproxy", "you want gfwlist/chnlist-based domain routing with ipset/nftset integration", "you run a Linux router or embedded device and need a fast, low-memory DNS splitter", "you need DoT support and DNS caching with stale-cache and pre-refresh features"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/chinadns-ng", "repo": "zfl9/chinadns-ng", "role": "main", "score": 47}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:32.948099+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:40:39.563769+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3792c5285c957f631826e8b8c3dff9e01335799ef8077e58699ae62e254a974", "fetched_at": "2026-08-28T04:04:32.948099+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zfl9/chinadns-ng"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:32.948099+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:40:39.563769+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3792c5285c957f631826e8b8c3dff9e01335799ef8077e58699ae62e254a974", "fetched_at": "2026-08-28T04:04:32.948099+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zfl9/chinadns-ng"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:40:39.563769+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3792c5285c957f631826e8b8c3dff9e01335799ef8077e58699ae62e254a974", "fetched_at": "2026-08-28T04:04:32.948099+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zfl9/chinadns-ng"}], "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:32.948099+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:32.948099+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:32.948099+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:40:39.563769+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3792c5285c957f631826e8b8c3dff9e01335799ef8077e58699ae62e254a974", "fetched_at": "2026-08-28T04:04:32.948099+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zfl9/chinadns-ng"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:32.948099+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:32.948099+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:40:39.563769+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3792c5285c957f631826e8b8c3dff9e01335799ef8077e58699ae62e254a974", "fetched_at": "2026-08-28T04:04:32.948099+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zfl9/chinadns-ng"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:32.948099+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:32.948099+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:32.948099+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:40:39.563769+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3792c5285c957f631826e8b8c3dff9e01335799ef8077e58699ae62e254a974", "fetched_at": "2026-08-28T04:04:32.948099+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zfl9/chinadns-ng"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:32.948099+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:32.948099+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:40:39.563769+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3792c5285c957f631826e8b8c3dff9e01335799ef8077e58699ae62e254a974", "fetched_at": "2026-08-28T04:04:32.948099+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zfl9/chinadns-ng"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:40:39.563769+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3792c5285c957f631826e8b8c3dff9e01335799ef8077e58699ae62e254a974", "fetched_at": "2026-08-28T04:04:32.948099+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zfl9/chinadns-ng"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:40:39.563769+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3792c5285c957f631826e8b8c3dff9e01335799ef8077e58699ae62e254a974", "fetched_at": "2026-08-28T04:04:32.948099+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zfl9/chinadns-ng"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:40:39.563769+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "f3792c5285c957f631826e8b8c3dff9e01335799ef8077e58699ae62e254a974", "fetched_at": "2026-08-28T04:04:32.948099+00:00", "kind": "readme", "missing": false, "url": "https://github.com/zfl9/chinadns-ng"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 36, "longevity": 100, "rhythm": 30}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2599, "days_push": 389, "days_rel": 389, "gap_med": 43.0, "n_releases_24m": 7}, "score": 47, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}