Documentation

Diagnostics

When a route feels slow or wrong, TailMux answers the questions in order: who owns the host, is the peer visible, is the path direct or DERP, and where does the time go.

View as Markdown

In the app#

Open the menu bar icon → OpenDiagnostics (or click Diagnose directly in the menu bar). Enter a hostname and TailMux reports which profile owns it and whether it's reachable — DNS resolution, ping, and an HTTP probe — through that profile. If the hostname classifies to the wrong profile, fix the suffixes under Profiles and restart the router when prompted. For path-level detail (direct vs. DERP, timing samples), use the CLI commands below.

diag path#

Run diag path first. It resolves which profile owns a hostname, whether the peer is visible in status JSON, whether the path is direct or DERP, and how long the HTTP probe took through the TailMux router.

zsh — tailmux
$tailmux diag path \$  http://nas.home-lab.ts.net:8080/dashboard \$  --netcheck

diag fetch#

Use diag fetch for repeated timing samples and to compare transport modes side by side — router vs. embedded vs. the official direct client:

zsh — tailmux
$tailmux diag fetch \$  --modes router,embedded,direct \$  --samples 5 \$  --timeout 25s \$  --read-limit 4194304 \$  http://nas.home-lab.ts.net:8080/dashboard

Streams & SSE#

For server-sent events and other long-lived streams, what matters is the first body byte, not total transfer time. Measure it directly:

zsh — tailmux
$tailmux diag fetch \$  --modes router,direct \$  --samples 5 \$  --first-byte-only \$  http://nas.home-lab.ts.net:8080/events
TailMux flushes unknown-length and chunked dynamic responses immediately, so streaming responses are not buffered by the proxy.

Reading results#

  • Owner — if the host resolves to the wrong profile, fix the suffix ownership in config.yaml rather than retrying.
  • Direct vs. DERP — a DERP path adds latency; a stable profile_udp_port_base helps peer-to-peer path discovery.
  • Router vs. direct — compare against the official client to decide whether the router is actually the bottleneck.
Performance characteristics change as the proxy and path code evolve. Re-measure before making any new performance claim — do not rely on a number from a previous run.