Cross-Platform DNS Protocol Benchmarker, Privacy Probe & One-Click Switcher
Download Binaries · Screenshots · Capabilities · Resolvers · Build from Source
Resolv is a native, standalone cross-platform desktop utility for Windows, macOS, and Linux built with Go, github.com/miekg/dns, and Wails v2 (OS-native webviews: WebView2 on Windows, WKWebView on macOS, WebKitGTK on Linux).
Unlike generic network tools that rely on ICMP ping (which measures ICMP echo response rather than actual DNS resolution performance and is frequently rate-limited or deprioritized by anycast routers), Resolv speaks the DNS wire protocol directly over UDP (:53), TCP (:53), DoH (RFC 8484), and DoT (:853).
Designed for zero-friction operation: auto-detects your active network adapter and current DNS, benchmarks every resolver with inline SVG [Min — ●Avg — |P95 — Max] range bars and real-time sparklines, and highlights the #1 recommended provider with a plain-English summary and one-click Apply Best DNS.
Designed for network engineers and privacy enthusiasts: inspect Average, P95 (95th percentile), Cached vs. Uncached (UUID recursive) latency, Jitter (:53 vs. DoH performance, DNSSEC validation, Ad/Tracker sinkhole probing, and ISP DNS Hijacking detection.
Standalone binaries are automatically compiled and published by GitHub Actions on every release tag:
| Operating System | Architecture | Package / Binary | Native Webview Engine |
|---|---|---|---|
| Windows 10 / 11 | x86_64 (amd64) |
resolv-windows-amd64.exe |
Microsoft Edge WebView2 |
| macOS 12+ | Universal (Intel + Apple Silicon) |
resolv-macos-universal.zip |
Apple WKWebView |
| Linux | x86_64 (amd64) |
resolv-linux-amd64 |
WebKitGTK 4.1 |
| Checksums | SHA-256 |
SHA256SUMS.txt |
— |
-
Multi-Protocol Wire Support: Benchmarks UDP (
:53), TCP (:53, RFC 7766 connection reuse), DoH (RFC 8484application/dns-messageover HTTP/2), and DoT (:853TLS 1.2/1.3). -
Session Warm-Up & Staggered Worker Pool: Establishes TCP/TLS/HTTP2 handshakes in an untimed warm-up phase so connection setup never skews query RTT. Dispatches interleaved queries round-robin across servers with a
12 msstagger across a bounded worker pool (12workers) to eliminate local socket exhaustion and router bufferbloat. -
Cached vs. Uncached Resolution:
-
Cached Queries: Queries high-traffic domains (
cloudflare.com,google.com,apple.com) to measure edge-cache hit latency. -
Uncached Queries: Generates a unique UUID v4 subdomain per query (
<random-uuid>.example.com) to bypass caches and measure true recursive upstream resolution.
-
Cached Queries: Queries high-traffic domains (
-
Comprehensive Metrics: Computes Average (
ms), Min (ms), Max (ms), Median (ms), P95 (ms), Jitter ($\sigma$ standard deviationms), Packet Loss (%), and retains chronological RTT samples for inline SVG sparklines.
- DNSSEC Validation Probe: Verifies whether each resolver sets the
AD(Authenticated Data) flag on signed zones (cloudflare.com) and properly returnsSERVFAIL(RcodeServerFailure) when querying a domain with a deliberately broken DNSSEC signature (dnssec-failed.org). - Ad & Tracker Sinkhole Probe: Queries known ad-serving and telemetry canary domains (
doubleclick.net,pagead2.googlesyndication.com,app-measurement.com) and flags resolvers that actively block them via sinkhole IPs (0.0.0.0,127.0.0.1,::),NXDOMAIN,REFUSED, orNODATA. - ISP DNS Hijacking & Transparent Proxy Detection:
- RFC 5737 Canary Probe: Sends a UDP
:53query to an unroutableTEST-NET-1address (192.0.2.53:53). Any response proves that an ISP or router firewall is transparently intercepting port 53 traffic. - NXDOMAIN Tampering Check: Compares plain UDP
:53responses against encrypted DoH responses for non-existent random domains to detect ISP search-redirect injection. - Bogon/Private IP Redirection Check: Detects captive portals or block-page redirections where plain DNS returns private RFC 1918 / CGNAT addresses while DoH returns public IPs.
- Egress Identity Fingerprinting: Queries
whoami.akamai.netover both UDP:53and DoH to detect cross-provider transparent proxying.
- RFC 5737 Canary Probe: Sends a UDP
| Platform | Active Interface Detection | Apply / Reset DNS | Flush DNS Cache | Privilege Elevation |
|---|---|---|---|---|
Windows (net_windows.go) |
PowerShell Get-NetAdapter, Get-NetRoute, Get-DnsClientServerAddress |
Set-DnsClientServerAddress / -ResetServerAddresses |
ipconfig /flushdns & Clear-DnsClientCache |
UAC (Start-Process -Verb RunAs) |
macOS (net_darwin.go) |
networksetup -listnetworkserviceorder, route -n get default, scutil --dns |
networksetup -setdnsservers <svc> <ips> / Empty |
dscacheutil -flushcache; killall -HUP mDNSResponder |
Native macOS Admin dialog (osascript) |
Linux (net_linux.go) |
/proc/net/route, ip route, nmcli, resolvectl |
nmcli connection modify (fallback to resolvectl dns) |
resolvectl flush-caches |
Polkit (pkexec) |
- Strict IP Validation Boundary: Every DNS address passed to an OS mutation command is validated via
net.ParseIPprior to command construction. - Graceful Non-Admin Fallback: If the user cancels the elevation prompt or runs without root/admin rights, Resolv opens a "Copy DNS Addresses & Terminal Command" modal with one-click clipboard copy and OS-specific step-by-step instructions.
In addition to auto-detecting your Current System DNS and Local Router / Gateway, Resolv ships with the following built-in resolvers (plus support for persistent custom IPv4, IPv6, DoH, and DoT resolvers):
| Provider | Category | Primary IPv4 | Secondary IPv4 | DoH Endpoint (RFC 8484) | DoT Host (:853) |
|---|---|---|---|---|---|
| Cloudflare | Privacy |
1.1.1.1 |
1.0.0.1 |
https://cloudflare-dns.com/dns-query |
one.one.one.one |
| Google Public DNS | Standard |
8.8.8.8 |
8.8.4.4 |
https://dns.google/dns-query |
dns.google |
| Quad9 | Privacy |
9.9.9.9 |
149.112.112.112 |
https://dns.quad9.net/dns-query |
dns.quad9.net |
| AdGuard DNS | Ad-blocking |
94.140.14.14 |
94.140.15.15 |
https://dns.adguard-dns.com/dns-query |
dns.adguard-dns.com |
| NextDNS | Privacy |
45.90.28.0 |
45.90.30.0 |
https://dns.nextdns.io |
dns.nextdns.io |
| OpenDNS | Standard |
208.67.222.222 |
208.67.220.220 |
https://doh.opendns.com/dns-query |
dns.opendns.com |
| Control D | Standard |
76.76.2.0 |
76.76.10.0 |
https://freedns.controld.com/p0 |
p0.freedns.controld.com |
| CleanBrowsing Family | Family |
185.228.168.168 |
185.228.169.168 |
https://doh.cleanbrowsing.org/doh/family-filter/ |
family-filter-dns.cleanbrowsing.org |
| Shortcut | Action |
|---|---|
/ or Ctrl+K (⌘K) |
Focus quick resolver search / filter bar |
Alt+1 |
Switch to Simple View |
Alt+2 |
Switch to Pro / Nerd Telemetry View |
Escape |
Close active modal or clear search filter |
Resolv/
├── LICENSE # GNU General Public License v3.0
├── go.mod / go.sum # Go module configuration
├── wails.json # Wails v2 project & packaging configuration
├── main.go # Native desktop window & embedded assets
├── app.go # Wails bound controller & custom resolver persistence
├── .github/workflows/release.yml # Automated multi-OS GitHub Actions release pipeline
├── build/
│ ├── appicon.svg # Pure flat geometric vector icon (zero gradients/filters)
│ └── appicon.png # 512×512 PNG application icon
├── docs/screenshots/ # UI screenshots for Simple & Pro views
├── frontend/
│ ├── index.html # Progressive disclosure Simple & Pro UI
│ ├── styles.css # Minimalist zinc/slate dark theme & latency badges
│ ├── app.js # State manager, pure SVG range-bars & sparklines
│ └── icon.svg # Header & modal vector icon
└── internal/
├── dns/
│ ├── resolvers.go # Built-in resolvers + system/gateway/custom parser
│ ├── transport.go # UDP :53, TCP :53, DoH (RFC 8484), DoT :853 queriers
│ ├── stats.go # Avg, Min, Max, Median, P95, Jitter (σ), Loss, Samples
│ ├── engine.go # Warm-up + staggered worker pool benchmark coordinator
│ ├── integrity.go # DNSSEC, AdBlock sinkhole, and ISP Hijack probes
│ ├── export.go # JSON, CSV, and Markdown report exporters
│ └── engine_test.go # Automated unit & integration tests
└── sysnet/
├── sysnet.go # Cross-platform types & strict IP validation boundary
├── exec_windows.go # Hidden subprocess creation flags on Windows
├── exec_unix.go # POSIX locale normalization & /etc/resolv.conf reader
├── net_windows.go # Windows PowerShell/CIM + UAC implementation
├── net_darwin.go # macOS networksetup/scutil + osascript implementation
└── net_linux.go # Linux nmcli/resolvectl + pkexec implementation
- Go 1.26+
- Wails v2 CLI:
go install github.com/wailsapp/wails/v2/cmd/wails@v2.17.1
- Platform WebView Dependencies:
- Windows: WebView2 Runtime (pre-installed on Windows 10/11)
- macOS: Xcode Command Line Tools (
xcode-select --install) - Linux (Debian/Ubuntu):
sudo apt install build-essential pkg-config libgtk-3-dev libwebkit2gtk-4.1-dev
go test -v ./internal/...# Windows (standalone .exe -> build/bin/resolv.exe)
wails build -platform windows/amd64 -clean -trimpath -ldflags "-s -w"
# macOS (Universal .app bundle for Intel + Apple Silicon -> build/bin/Resolv.app)
wails build -platform darwin/universal -clean -trimpath -ldflags "-s -w"
# Linux (x86_64 standalone binary -> build/bin/resolv)
wails build -platform linux/amd64 -tags webkit2_41 -clean -trimpath -ldflags "-s -w"Copyright (C) 2026 Resolv Contributors.
Distributed under the GNU General Public License v3.0 or later (GPL-3.0-or-later). See LICENSE for the full license text.