Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
ND-300 Network Diagnostic
Cross-platform network diagnostic tool for Windows, macOS, and Linux. Includes SpeedQX, a standalone quad-provider speed test.
Features
- Two operating modes: User mode (clean summary) and Technician mode (deep diagnostics)
- 8 core diagnostics: adapters, interfaces, gateway, DNS, public IP, latency, speed test, port connectivity
- 17 deep diagnostics (technician mode): ARP, routing, connections, listening ports, DHCP, protocol stats, adapter hardware, proxy, VPN, firewall, DNS cache, IPv6, MTU, connection states, bufferbloat, reverse DNS, TLS inspection, traffic counters
- Diagnostic-driven
nd300 fix— runs the diagnostics, identifies which checks failed, and applies only the recovery actions that target those specific failures. Clean and latency-only networks are advisory/no-op, DNS repair is staged from safest to most invasive, and medium/high-risk steps require confirmation. Re-tests after each step and repeats until everything passes or no further actions remain. - Quad-provider speed test — Cloudflare + M-Lab NDT7 + LibreSpeed + fast.com (Netflix) with bounded N-provider inverse-variance aggregation, modified trimean (Ookla-style), and RFC 3550 jitter for technician-grade accuracy. Measures ping, jitter, download, upload, packet loss, stability, and provider divergence.
- Resilient self-update —
nd300 update/speedqx updatechecks GitHub for the latest release and runs a probe-and-retry chain: cargo first when available, cargo-dist installer as universal fallback (curl → wget on macOS/Linux, PowerShell → pwsh on Windows). When one strategy can't run, the next is tried automatically; failures from every strategy are surfaced together with specific reasons. - SpeedQX standalone speed test binary — all 4 providers with per-provider breakdown and real-time progress
- Bufferbloat detection with grade scoring (A+ through F)
- JSON output for scripting and automation
- Unicode box-drawing table rendering with ASCII fallback
- Color-coded status indicators (OK/Warn/Fail/Skip)
- Cross-platform — native support for Windows, macOS, and Linux
Installation
Shell (macOS/Linux)
|
PowerShell (Windows)
powershell -ExecutionPolicy Bypass -c "irm https://github.com/QubeTX/qube-network-diagnostics/releases/latest/download/nd300-installer.ps1 | iex"
MSI (Windows)
Download the .msi installer from the latest release.
Cargo
Older installed copies that still request nd-300-installer.sh or nd-300-installer.ps1 are supported by compatibility aliases on every new GitHub release, so the legacy updater path can still reach the current installers.
From Source
Usage
nd300 — Network Diagnostic
As of v3.0.0, every action command is available either as a subcommand or as a flag — both forms are first-class and produce identical behavior. Pick whichever you prefer.
# Default user mode — clean summary
# Technician mode — full deep diagnostics
# Change DNS configuration (interactive)
# Diagnostic-driven fix loop (subcommand form, recommended)
# Same thing — legacy flag forms (still supported)
# Auto-confirm medium-risk prompts (does NOT bypass high-risk Y/N)
# Skip the speed test for faster execution
# JSON output for scripting
# ASCII characters instead of Unicode
# Disable colored output
# Custom report title
# Custom speed test duration per provider (seconds)
# Self-update — both forms work
# Reset DNS cache — both forms work
# Uninstall — both forms work
# Show help
speedqx — Standalone Speed Test
# Full quad-provider speed test (Cloudflare + NDT7 + LibreSpeed + fast.com)
# Custom duration per direction (30s download + 30s upload per provider)
# Override fast.com duration (defaults to "auto")
# JSON output
# Quick test with shorter duration
Example Output
╔══════════════════════════════════════════════════════════════╗
║ ND-300 Network Diagnostic ║
╠══════════════════════════════════════════════════════════════╣
║ Category │ Status │ Details ║
╠══════════════════╪════════╪═════════════════════════════════╣
║ Network Adapters │ OK │ Wi-Fi (connected) ║
║ IP Configuration │ OK │ 192.168.1.42/24 ║
║ Default Gateway │ OK │ 192.168.1.1 ║
║ DNS Resolution │ OK │ 1.1.1.1, 8.8.8.8 ║
║ Public IP │ OK │ 203.0.113.45 (Cloudflare) ║
║ Latency │ OK │ 12ms avg (1.1.1.1) ║
║ Speed Test │ OK │ ↓ 245 Mbps ↑ 48 Mbps ║
║ Port Check │ OK │ 8/8 reachable ║
╚══════════════════╧════════╧═════════════════════════════════╝
Command Line Options
| Flag | Description |
|---|---|
-t, --tech |
Technician mode — show full technical report with deep diagnostics |
-T, --title <TITLE> |
Custom title for the report header |
--json |
Output results as JSON |
--ascii |
Use ASCII characters instead of Unicode box-drawing |
--no-color |
Disable colored output |
--fast |
Skip the speed test (faster execution) |
--speed-duration <SECS> |
Speed test duration in seconds (default: 10, min: 4) |
--verbose |
Show additional debug/trace information |
-d, --dns |
Change DNS servers and verify connectivity (requires elevated privileges) |
-f, --fix |
Run the diagnostic-driven triage / fix loop (requires elevated privileges). Equivalent to nd300 fix. |
-c, --clear-dns |
Flush the system DNS cache. Equivalent to nd300 clear-dns. |
--uninstall |
Remove nd300 from the system. Equivalent to nd300 uninstall. |
--update |
Check for updates and install the latest version. Equivalent to nd300 update. |
-y, --yes |
Auto-confirm medium-risk prompts when running the fix flow. Does not bypass high-risk Y/N. |
-h, --help |
Print help |
-v, --version |
Print version |
Subcommands
| Subcommand | Equivalent flag | Description |
|---|---|---|
nd300 fix [-y] |
nd300 -f / nd300 --fix |
Diagnostic-driven triage and recovery loop |
nd300 update |
nd300 --update |
Self-update to the latest release |
nd300 clear-dns |
nd300 -c / nd300 --clear-dns |
Flush the DNS cache and exit |
nd300 uninstall |
nd300 --uninstall |
Uninstall nd300 from this system |
SpeedQX Options
| Flag | Description |
|---|---|
--json |
Output results as JSON |
--ascii |
Use ASCII characters instead of Unicode box-drawing |
--no-color |
Disable colored output |
--duration <VALUE> |
Test duration per direction for CF/NDT7/LS: seconds or "auto" (default: 30) |
--fastcom-duration <VALUE> |
Test duration per direction for fast.com: seconds or "auto" (default: auto) |
--latency-probes <N> |
Number of latency probes (default: 20) |
--update |
Check for updates and install the latest version |
-v, --version |
Print version |
-h, --help |
Print help |
User Mode vs Technician Mode
User mode (default) runs 8 core diagnostics and presents a clean summary table. Ideal for quick network health checks.
Technician mode (-t) runs all 8 core diagnostics plus 17 additional deep diagnostic modules. Produces a detailed technical report with per-module breakdowns, suitable for troubleshooting and support workflows.
Diagnostics Covered
Core Diagnostics (both modes)
- Network Adapters
- IP Configuration / Interfaces
- Default Gateway
- DNS Resolution
- Public IP
- Latency
- Speed Test (Cloudflare + M-Lab NDT7 in nd300; all 4 providers in SpeedQX)
- Port Connectivity
Deep Diagnostics (technician mode only)
- ARP Table
- Routing Table
- Active Connections
- Listening Ports
- DHCP Lease Info
- Protocol Statistics
- Adapter Hardware Details
- Proxy Detection
- VPN Detection
- Firewall Status
- DNS Cache
- IPv6 Connectivity
- MTU Discovery
- Connection State Summary
- Bufferbloat Detection
- Reverse DNS
- TLS Inspection
Fix Flow (nd300 fix / nd300 -f)
The fix flow runs a diagnostic-driven triage loop: it tests the network, looks at what actually failed, applies only the recovery actions that target those specific failures, re-tests, and repeats. Requires elevated privileges (sudo on macOS/Linux, Administrator on Windows).
A clean network completes nd300 fix in under 8 seconds and applies zero actions. Latency-only findings are reported as advisory because ICMP can be rate-limited or deprioritized by healthy networks. A real failure usually clears in 1–2 iterations.
How it works
1. Run baseline diagnostics
2. If everything passes → done.
3. Look at which specific diagnostics failed.
4. Group them by root cause (e.g. interface-down ⇒ skip DNS/gateway/IP — they cascade).
5. Pick the safest justified action that targets a remaining failure and apply it.
6. Wait for the system to stabilize.
7. Re-run the diagnostics.
8. Repeat until everything passes, or no further actions are available.
The loop is bounded by three independent caps so it always terminates:
- ≤ 6 iterations
- ≤ 4 minutes wall clock
- Per-action attempt cap (typically 1 — failed actions are not retried)
Action ladder
Actions are tried by evidence and risk: cheap first, reversible first, and only when the current failure set justifies the action. DNS repair is intentionally staged so the tool flushes caches and restores router-provided DNS before considering a public DNS change.
| Cost / risk | Action | Targets |
|---|---|---|
| Cheap / Low | Flush DNS cache | DNS |
| Cheap / Low | Reset DNS to router defaults | DNS |
| Cheap / Low | Switch DNS to Cloudflare 1.1.1.1 | DNS, only after safer DNS-specific fixes fail |
| Cheap / Low | Flush ARP cache | Gateway |
| Medium / Low | Restart networking services | DNS, gateway, public IP |
| Medium / Low | Renew DHCP lease | Gateway, public IP, adapters, interfaces |
| Medium / Medium | Temporarily disable consumer VPNs | Public IP, DNS; interactive confirmation required |
| Expensive / Medium | Restart the network adapter | Adapters, interfaces, gateway, DNS, public IP |
| Expensive / High | Deep stack reset (Winsock / TCP-IP / IPv6 on Windows; recreate network service on macOS; recreate NetworkManager profile on Linux) | Last-resort recovery |
Enterprise VPNs (Cisco AnyConnect, Zscaler, Palo Alto / GlobalProtect, F5, Check Point, Juniper) are never auto-disabled. Consumer VPN disable is also skipped in JSON or non-interactive mode, even with --yes, because the tool cannot safely guide re-enable/recovery steps there. Other medium-risk actions such as DHCP reset, service restart, adapter restart, and public-DNS changes are skipped in JSON or non-interactive mode unless --yes can safely auto-confirm the medium-risk prompt. High-risk actions are never auto-confirmed.
Confirmation prompts
Medium-risk actions explain what they will change and require confirmation unless --yes is provided. The deep stack reset is high-risk and is always gated behind a structured plain-language prompt:
┌─ Escalating: Reset Windows networking stack ──────────────────────────────
Why I want to do this:
Gateway and DNS are still failing after DHCP renew and ARP flush.
Resetting the networking stack rebuilds Windows' TCP/IP, Winsock,
and IPv6 catalogs from scratch — the standard fix when simpler
steps haven't recovered the connection.
What will happen:
• You will lose internet for ~10–15 seconds.
• Open VPN sessions and SSH connections will drop.
• A reboot is recommended afterward; nd300 will remind you at the end.
Reversible: requires reboot to fully revert
Typical duration: 10–15 seconds
Continue? Type 'y' to proceed, anything else to skip:
--yes does not bypass high-risk prompts — they always require an explicit y. Anything else (including a blank Enter) is treated as N. In --json / non-interactive contexts, high-risk actions are skipped, not auto-applied, with a clear marker in the report.
Hard-block detection
Some failure shapes can't be auto-fixed. The loop short-circuits cleanly with guidance instead of thrashing:
- No physical link — no cable / Wi-Fi.
- ISP outage shape — local network healthy, public internet failing.
- Enterprise VPN active — diagnostics shaped by a managed VPN we won't disable.
Fix Report
Every run produces a Markdown report at ~/Downloads/nd300-fix-report-YYYYMMDD-HHMMSS.md:
- Verdict — Fixed, Partially fixed, Couldn't fix, Cannot fix from here, Timed out, or Stopped at your request.
- Baseline diagnostics — full table snapshot before any action ran.
- Iteration timeline — for each loop pass: which actions ran, captured stdout/stderr/exit/duration, and the diagnostic delta after.
- Final diagnostics — same table as baseline so you can see what changed.
- Environment — OS, version, elevation status, VPNs detected.
- What to try next — concrete suggestions when the fix didn't fully succeed (restart router, contact ISP, check for driver updates, etc.).
In JSON mode (nd300 fix --json), the schema reports the same data as outcome, iterations, applied_actions[], remaining_failures[], hard_block, and report_path.
DNS Configuration (--dns)
The DNS flag (nd300 -d) provides a standalone way to change your DNS configuration. Requires elevated privileges.
Providers:
- Cloudflare (recommended) — 1.1.1.1 (privacy-focused)
- Google — 8.8.8.8 (reliability)
- NextDNS — Encrypted DNS with filtering (requires config ID)
- Automatic — Reset to system default (DHCP)
- Hybrid (not recommended) — Cloudflare + Google
NextDNS encryption by platform:
- Windows — DNS-over-HTTPS via
netshDoH template registration - Linux — DNS-over-TLS via
systemd-resolved(falls back to plain IPs vianmcli) - macOS — NextDNS CLI client (
nextdns install/activate), plain IPs if CLI not installed
After setting DNS, the tool verifies both DNS resolution and HTTP connectivity. If verification fails, it automatically reverts to DHCP and reports the result. On success, full diagnostics run to confirm network health.
Man Pages (Linux/macOS)
Man pages are generated at build time and included in release archives. To install after building from source:
Then use man nd300 or man speedqx to view documentation.
Building from Source
Binaries will be at target/release/nd300 and target/release/speedqx (or .exe on Windows).
Self-Update
Both binaries support self-updating to the latest release. Either form works:
The updater runs a probe-and-retry chain so missing tools don't block the update:
- Checks the latest release on GitHub. If you're already on it, exits 0 with no action.
- Tries
cargo install nd300 --forcefirst whencargo --versionsucceeds on your system. - If cargo isn't available (or fails), falls through to the cargo-dist installer for your platform —
curl | shthenwget | shon macOS/Linux,powershell.exethenpwsh.exeon Windows. The installer URL uses GitHub'sreleases/latestredirect, so it always resolves to the newest release. - Whichever strategy succeeds first wins; the chain stops there.
- If every strategy fails, both pretty and
--jsonoutput show a per-attempt diagnostic block listing what was tried and why each failed, so you can fix the environment manually.
Current releases publish the canonical nd300-installer.sh and nd300-installer.ps1 assets plus legacy nd-300-installer.* aliases for older installed copies.
In --json mode, the response includes "strategy" (the precise variant that ran or was attempted) and, on failure, an "attempts" array. The legacy "method" field still maps to "cargo" or "installer" for backward compatibility.
Speed Test Methodology
The speed test uses a technician-grade accuracy pipeline matching the SpeedQX web speed test:
- Modified trimean (Ookla-style):
(P10 + 8*P50 + P90) / 10for robust central tendency - 30% slow-start discard: eliminates TCP ramp-up contamination
- IQR outlier filtering: removes transient congestion and measurement artifacts
- Winsorized cross-validation: catches edge cases where IQR filtering is too aggressive
- Upload-specific pipeline: keeps fastest 50% of post-warmup samples (following Speedtest.net methodology)
- RFC 3550 jitter: exponentially weighted moving average, the standard used by VoIP and real-time media
- Bounded inverse-variance weighted aggregation: combines every successful provider while preventing any single provider from dominating the result
- Provider divergence detection: flags when the full provider spread differs by >30%, indicating possible throttling or QoS
For a full technical breakdown, see the SpeedQX Technical Report.