
Globaler DNS-Propagation-Checker TUI — beobachte die Verbreitung eines DNS-Eintrags über 34 öffentliche Resolver weltweit auf einer Weltkarte in deinem Terminal
Ein globaler DNS-Propagationsprüfer für dein Terminal — eine Rust-TUI, die 34 öffentliche DNS-Resolver weltweit parallel abfragt, ihre Antworten vergleicht und die Propagation deines Records auf einer Weltkarte anzeigt.

Denk an dnschecker.org / whatsmydns.net, aber in deinem Terminal, mit Watch-Modus: Starte eine Prüfung und es fragt wiederholt ab, bis der Record überall propagiert ist.
Die Resolver erstrecken sich über die globalen Anycast-Netzwerke (Google, Cloudflare, Quad9), Nordamerika, Europa, Russland, den Nahen Osten, Ostasien und die südliche Hemisphäre (Telstra AU, SafeSurfer NZ, UOL BR) — jeder wird direkt abgefragt, sodass du die aktuelle Sicht jedes Servers auf den Record siehst.
Jeder Resolver wird direkt abgefragt (kein Cache, EDNS0, TCP-Fallback bei abgeschnittenen Antworten), du siehst also die aktuelle Sicht jedes Servers auf den Record. Antworten, die sich einen beliebigen Record teilen, werden gruppiert — Round-Robin-DNS (jeder Resolver cached eine andere Teilmenge eines IP-Pools) zählt also als eine konsistente Antwort, nicht als zwanzig widersprüchliche. Die Propagationsanzeige zeigt, wie viele Resolver in der Mehrheitsgruppe sind; Ausreißer werden mit ≠ DIFFERS markiert, sobald alle Ergebnisse vorliegen.
Die Tabelle passt in ein 80-Spalten-Terminal: Die vollständige IPv4-Adresse jedes Resolvers, Round-Trip-Zeit, TTL und Ablauf-Countdown bleiben erhalten, und das Urteil pro Zeile schrumpft zum Glyphen am linken Rand (✓ ≠ ! ↻ ∅ ✗), damit die Antwort den Platz behält. Der Countdown ist bewusst grob — 45s, 4m, 2h, 1d — denn eine Sekundenspalte, die aus dem Takt tickt, ist oberhalb einer Minute nur Rauschen.
Wenn das Terminal breit genug ist, erscheint rechts eine Weltansicht mit einem Punkt pro Resolver, je nach Status eingefärbt (Grün stimmt überein, Magenta weicht ab, Rot Fehler, Gelb in Bearbeitung). Die Ansicht passt sich der Breite an: Terminals mit ≥157 Spalten bekommen eine flache Weltkarte, schmalere (≥131 Spalten) einen rotierenden 3D-Globus, der weniger Spalten benötigt; ein Größenwechsel über den Schwellenwert verwandelt eine in die andere. Mit Ctrl+O schaltest du Karte/Globus von Hand um, und mit --view auto|map|globe (oder view = "..." in der Konfigurationsdatei) erzwingst du einen Stil direkt.
Jeder Resolver wird gefragt, welcher seiner Standorte dir antwortet, per NSID (RFC 5001) — eine EDNS-Option, die der antwortende Knoten mit seinem eigenen Namen befüllt (gpdns-yul, yul01, res721.qyul1, jfk-dns1-02.inet.centurylink.net). Das benötigt keine betreiberspezifische Unterstützung, sodass auch selbst hinzugefügte Resolver einen Standort melden können. Wo NSID keinen Ort nennt, übernehmen die betreiberspezifischen Identifikationsabfragen: Quad9 (TXT id.server.on.quad9.net), Cloudflare (CH TXT id.server), Google (Egress-Subnetz via TXT o-o.myaddr.l.google.com abgeglichen mit TXT locations.publicdns.goog), OpenDNS (TXT debug.opendns.com), CleanBrowsing und Neustar UltraDNS. Der ermittelte Standort erscheint in der Loc-Spalte als Code im Stil →YUL, und der Kartenpunkt des Resolvers wandert zum POP, der deine Anfragen tatsächlich bedient.
Installation:
brew install 514-labs/tap/dnsglobe # Homebrew (macOS/Linux)
cargo install dnsglobe # from crates.io
yay -S dnsglobe # from archlinux aur (compile from source)
yay -S dnsglobe-bin # from archlinux aur (install prebuilt binary)
nix run github:514-labs/dnsglobe # Nix flakes (builds from source)
# or grab a prebuilt binary from the GitHub Releases page
Ausführen:
dnsglobe # start empty, type a domain
dnsglobe example.com # query immediately and watch
dnsglobe example.com TXT # same, starting on TXT records
dnsglobe --once example.com TXT # no TUI: print results, exit (for scripts)
dnsglobe example.com --ecs 203.0.113.0/24 # see the zone as that client network does
dnsglobe --once example.com --ecs 203.0.113.0/24,198.51.100.0/24
# one table per subnet + a convergence summary
--ecs (oder ecs = [...] in der Konfigurationsdatei) fügt jeder Abfrage eine EDNS-Client-Subnet-Option (RFC 7871) hinzu, sodass GeoDNS-Zonen für dieses Client-Netzwerk antworten statt vom eigenen Standpunkt des Resolvers aus. Subnetze sind CIDRs oder bloße IPs; die meisten öffentlichen Resolver verwenden höchstens /24 (IPv4) oder /56 (IPv6). Wenn mehrere Subnetze konfiguriert sind, wechselt Ctrl+N das aktive Subnetz (plus eine Aus-Position) und fragt sofort erneut ab; --once durchläuft jedes Subnetz und endet mit einer Zusammenfassung der Konvergenz pro Subnetz. Resolver, die ECS bewusst ignorieren (Cloudflare, Quad9, …), werden mit NO ECS markiert — ihre Antwort wird zur Referenz angezeigt, aber vom Propagationsprozentsatz ausgeschlossen, da sie ihren eigenen Standort beschreibt, nicht das getestete Netzwerk.
Optional kannst du mit einer TOML-Konfigurationsdatei unter ~/.config/dnsglobe/config.toml ($XDG_CONFIG_HOME/dnsglobe/config.toml, falls gesetzt) eigene Resolver hinzufügen — oder die eingebaute Liste vollständig ersetzen. Setze DNSGLOBE_CONFIG, um einen anderen Pfad zu verwenden.
# Set to true to replace the built-in list instead of extending it —
# e.g. to watch propagation across your own nameservers only.
replace = false
# EDNS Client Subnet(s) to query with (Ctrl+N cycles; --ecs overrides).
ecs = ["203.0.113.0/24"]
# World-view style: auto (default — pick by terminal width), map, or globe.
# The --view flag overrides this.
view = "auto"
[[resolvers]]
name = "Corp DNS" # required — shown in the Resolver column
ip = "10.0.0.53" # required — IPv4 or IPv6, queried on port 53
location = "HQ" # optional — Loc column / location sort
lat = 40.7 # optional — position on the world map;
lon = -74.0 # omit both to leave it off the map
[[resolvers]]
name = "NS1 (public)"
ip = "198.51.100.53"
# Optionally recolor the UI. Every key is optional; unset roles keep their
# defaults. Colors are ANSI names ("lightcyan"), 256-color indexes ("208"),
# or hex ("#ff8700" — needs truecolor support).
[theme]
accent = "lightcyan" # borders, titles, cursor, anycast sites
agree = "lightgreen" # answers matching the majority; fast latency
differ = "lightmagenta" # answers disagreeing with the majority
error = "white on lightred"
# ERR / SERVFAIL / NONE; slow latency. Written
# "<fg> on <bg>", it becomes a filled badge on the
# status glyph and word — legible on any background;
# a plain color like "lightred" drops the badge
pending = "lightyellow" # queries in flight; middling latency
stale = "208" # caches serving an answer past its own TTL
upstream = "lightblue" # refetched but upstream still has the old data
muted = "faint" # labels, hints, countdowns, quiet borders —
# "faint" dims your terminal's default foreground;
# set a color if your terminal renders faint poorly
coastline = "gray" # map/globe land outline
grid = "244" # globe graticule and limb
Ungültige Konfiguration (falsche IP, unbekannter Schlüssel, nicht erkannte Farbe, ungültiges ecs-Subnetz, lat ohne lon, replace = true ohne Resolver) wird beim Start mit Benennung des fehlerhaften Eintrags gemeldet.
→YUL); für den Rest ist die Standortspalte die Heimatregion des Betreibers.src/resolvers.rs; verwende die obige Konfigurationsdatei, um sie ohne Neukompilieren zu erweitern oder zu ersetzen. Jeder eingebaute Eintrag wurde verifiziert, dass er externe Abfragen beantwortet; viele bekannte ISP-Resolver (und insbesondere alle großen afrikanischen) lehnen Abfragen von außerhalb ihres Netzwerks ab, daher können sie nicht aufgenommen werden.Das Projekt bietet optionale Nix-Flake-Ausgaben für Nutzer, die bereits Nix verwenden. Das Flake baut aus dem Quellcode.
# Latest source from default branch
nix run github:514-labs/dnsglobe
# Specific release (uses the flake at that git tag)
nix run github:514-labs/dnsglobe/v0.4.0
# Named outputs (if the flake exposes them): #latest, #source
nix run github:514-labs/dnsglobe#source
# Build / develop
nix build github:514-labs/dnsglobe
nix develop github:514-labs/dnsglobe
Das Flake stellt packages.<system>.default, apps.<system>.default, devShells.<system>.default und overlays.default bereit.
Aktualisiere über denselben Nix-Workflow, den du für die Installation verwendet hast. Für Profilinstallationen führe nix profile list und danach nix profile upgrade <index-or-name> aus. Für Flake-Inputs führe nix flake update <repo> in deinem eigenen Flake aus und baue neu.
Für reproduzierbare Entwicklungsumgebungen verwende Devbox:
# Install Devbox first (if not already installed)
curl -fsSL https://get.jetify.dev/devbox | bash
# Initialize the environment
devbox shell
# Build the project
devbox run build
Oder installiere Devbox über Homebrew:
brew install jetify-com/devbox/devbox
Mit ❤️ gemacht von den Leuten, die an 514.ax arbeiten.
| Key | Aktion |
|---|
| Eingabe / ⌫ / Del | Domain bearbeiten |
| ←/→ / Home/End | Cursor im Domain-Feld bewegen |
| Enter | Prüfung starten und beobachten: fragt alle 30 s erneut ab, bis die Propagation 100 % erreicht |
| Ctrl+R | Beobachten stoppen oder fortsetzen |
| Tab / Shift-Tab | Record-Typ auswählen (A, AAAA, CNAME, MX, NS, TXT, SOA) und neu abfragen |
| ↑/↓ / PgUp/PgDn | Markierung durch die Resolver-Tabelle bewegen (scrollt mit) |
| + | Resolver für diese Sitzung hinzufügen (Name, IP, optional Standort und Kartenposition) |
| Ctrl+X | markierten Resolver für diese Sitzung entfernen |
| Ctrl+S | Tabellensortierung wechseln: Resolver / Standort / Ping / Status / Antwort |
| Ctrl+O | Weltansicht zwischen flacher Karte und rotierendem Globus umschalten |
| Ctrl+N | ECS-Client-Subnetz wechseln und neu abfragen (nur wenn --ecs/Konfiguration eines eingerichtet hat) |
| Ctrl+U | Domain leeren |
| Esc / Ctrl+C | Beenden |