{"id":48082360,"url":"https://github.com/center2055/dns-hop","last_synced_at":"2026-06-07T22:01:07.877Z","repository":{"id":339916837,"uuid":"1163397357","full_name":"center2055/DNS-Hop","owner":"center2055","description":"Cross-platform DNS benchmarking, diagnostics, and one-click switching for Windows and Linux.","archived":false,"fork":false,"pushed_at":"2026-05-28T20:13:16.000Z","size":2275,"stargazers_count":56,"open_issues_count":1,"forks_count":5,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-05-28T20:22:02.727Z","etag":null,"topics":["avalonia-ui","dns","dns-benchmark","dns-over-https","dns-over-tls","dns-switcher","network-tools","windows"],"latest_commit_sha":null,"homepage":"https://center2055.github.io/DNS-Hop/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/center2055.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-21T15:15:58.000Z","updated_at":"2026-05-28T20:13:21.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/center2055/DNS-Hop","commit_stats":null,"previous_names":["center2055/dns-hop"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/center2055/DNS-Hop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/center2055%2FDNS-Hop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/center2055%2FDNS-Hop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/center2055%2FDNS-Hop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/center2055%2FDNS-Hop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/center2055","download_url":"https://codeload.github.com/center2055/DNS-Hop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/center2055%2FDNS-Hop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34039495,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-07T02:00:07.652Z","response_time":124,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avalonia-ui","dns","dns-benchmark","dns-over-https","dns-over-tls","dns-switcher","network-tools","windows"],"created_at":"2026-04-04T14:57:41.133Z","updated_at":"2026-06-07T22:01:07.871Z","avatar_url":"https://github.com/center2055.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DNS Hop\n\nModern DNS benchmark and resolver-switcher for Windows and Linux. Built with C#, .NET 8 and Avalonia + FluentAvalonia.\n\n![DNS Hop Home](docs/images/dns-hop-home.png)\n\n## What it does\n\nDNS Hop helps you pick a fast, honest DNS resolver and apply it to your system without leaving the app.\n\n- Benchmarks public resolvers across classic UDP/TCP, DoH and DoT\n- Surfaces three timing probes (cached, uncached, DotCom) plus reliability checks for DNSSEC, NXDOMAIN hijacking and dead servers\n- Applies the resolver you pick directly to the active system adapter on Windows or Linux\n- Verifies what actually went through with a DNS leak test\n- Speaks five languages out of the box\n\n## v2 highlights\n\nThe whole shell was redesigned in v2 around the Windows 11 25H2 Settings aesthetic:\n\n- **FluentAvalonia `NavigationView`** with a left rail: Home, Benchmark, Resolvers, Results, Profiles, Network, Logs, Settings, About\n- **Mica backdrop** on Windows 11 when you stay on the System theme; solid backgrounds in Light/Dark so the title bar and sidebar match the rest of the UI\n- **DNS Profiles** — save preferred + alternate pairs for IPv4 + IPv6 and apply with one click. Built-in profiles: Cloudflare Privacy, Quad9 Secure, AdGuard Family, Mullvad, Google\n- **Geo-aware recommendations** that bias the resolver list toward your region (Cloudflare CDN trace, country-only, six-hour cache, no precise geolocation)\n- **Curated resolver metadata** — operator, country, no-log policy, ad/malware/adult filtering surfaced as badges\n- **DNS leak test** via `whoami.cloudflare` so you can verify your active resolver\n- **Apply history** keeps the last five applied configurations with a one-click \"Restore previous\"\n- **Results page** with two recommendation cards (Primary / Secondary) and per-row latency bars\n- **Logs page** with severity colours, level filters, search and export\n- **Five languages** out of the box (English, German, French, Russian, Simplified Chinese) with reactive switching — no restart\n\n## Get it\n\nLatest release: \u003chttps://github.com/center2055/DNS-Hop/releases/latest\u003e\n\nEach release ships:\n\n| Asset | Platform |\n| --- | --- |\n| `DNS-Hop-Setup-vX.Y.exe` | Windows installer |\n| `DNS-Hop-Portable-vX.Y.zip` | Windows portable |\n| `DNS-Hop-AppImage-vX.Y-x86_64.AppImage` | Linux AppImage |\n\n## Build from source\n\nRequires the .NET 8 SDK.\n\n```bash\ndotnet restore\ndotnet build DNSHop.sln\ndotnet run --project src/DNSHop.App/DNSHop.App.csproj\n```\n\n### Self-contained Windows release\n\n```powershell\ndotnet publish src/DNSHop.App/DNSHop.App.csproj `\n  -c Release `\n  -r win-x64 `\n  --self-contained true `\n  /p:PublishSingleFile=true `\n  /p:IncludeNativeLibrariesForSelfExtract=true `\n  -o artifacts/publish-win-x64-release\n\n# portable zip\n.\\scripts\\package-win-portable.ps1 -PublishDir artifacts\\publish-win-x64-release -ProjectPath src\\DNSHop.App\\DNSHop.App.csproj\n\n# installer (Inno Setup 6)\n\u0026 \"C:\\Path\\To\\Inno Setup 6\\ISCC.exe\" installer\\DNSHop.iss\n```\n\n### Self-contained Linux AppImage\n\n```bash\n./scripts/publish-linux-appimage.sh\n# Produces artifacts/DNSHop-linux-x86_64.AppImage\n```\n\nThe Linux AppImage is also built by CI on every push to `main` and attached to GitHub Releases on every `v*` tag — see [`.github/workflows/linux-appimage.yml`](.github/workflows/linux-appimage.yml). The matrix smoke-tests the bundled binary on Debian 12, Fedora 41 and Arch using `DNSHop.App --smoke-test`.\n\n## Project layout\n\n```\nsrc/DNSHop.App/\n├── App.axaml(.cs)             FluentAvalonia bootstrap + DI\n├── Program.cs                 Entry point, command-line dispatch\n├── Localization/              i18n service, markup extension\n├── Models/                    DnsServerDefinition, DnsProfile, etc.\n├── Services/                  Benchmark, ServerList, SystemDns, Profiles, LeakTest, Geo, Metadata\n├── Styles/                    Theme + card styles\n├── ViewModels/\n│   ├── ShellViewModel.cs      Navigation rail + active page\n│   └── Pages/                 One VM per nav item\n├── Views/\n│   ├── ShellWindow.axaml      Main window (NavigationView + Mica)\n│   └── Pages/                 One view per nav item\n└── Assets/\n    ├── i18n/                  Per-culture JSON dictionaries\n    └── resolver-metadata.json Curated operator / region / no-log info\n```\n\n## System DNS switching\n\n- **Windows**: classic UDP/TCP IPv4 + IPv6 endpoints on port 53. Profiles apply preferred + alternate via `netsh`.\n- **Linux**: tries NetworkManager (`nmcli`) and `systemd-resolved` first; falls back to writing `/etc/resolv.conf`.\n- **WSL**: writes `/etc/resolv.conf`. For changes to survive a restart, set `[network] generateResolvConf=false` in `/etc/wsl.conf`. WSLg is required for the GUI.\n\n## Diagnostics\n\n- Logs are written to `%LOCALAPPDATA%\\DNS Hop\\Logs` on Windows and `$HOME/.local/share/DNS Hop/Logs` on Linux.\n- The in-app Logs page parses these with severity colouring and supports filter + export.\n- `DNSHop.App --smoke-test` runs a quick non-UI sanity pass and prints version, platform and the active diagnostics log path. This is what the CI matrix uses.\n\n## Notes\n\n- Custom resolver entries you add in **Resolvers** persist in `settings.json` under `%LOCALAPPDATA%\\DNS Hop\\`.\n- The \"Update public list on launch\" option pulls a small additional set of resolvers from \u003chttps://public-dns.info\u003e. Turn it off if you only want the curated built-in list.\n- Exports land in `Documents\\DNSHop\\Exports`.\n- Translations live in `src/DNSHop.App/Assets/i18n/\u003cculture\u003e.json`. PRs adding more languages are welcome.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcenter2055%2Fdns-hop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcenter2055%2Fdns-hop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcenter2055%2Fdns-hop/lists"}