Self-hosted network testing for browsers and terminals.
Measure download, upload, and latency before and during transfers.
One Go server, a responsive web interface, and a native terminal client.
Quick start · Measurements · Browser · Terminal · Documentation
Real runs against local servers · screenshot gallery
docker run -d --name graphite-meter --restart unless-stopped \
-p 7246:7246 ghcr.io/zr-jb/graphite-meter:latestOpen localhost:7246, or http://YOUR_SERVER_IP:7246 from another
device, and start a test. The default provides HTTP/1.1 throughput and WebSocket latency,
with no configuration file or database service. Measurements cover the path between your device
and the server, whether that is your LAN, a VPN, or a remote host.
For other setups, see Docker Compose, native TLS and HTTP/3, reverse proxies, Podman, or Tailscale. Optional password, OIDC, or hybrid authentication protects both the interface and measurement routes on public deployments.
- Throughput measured at the receiver: downloads count bytes the client consumed; upload bytes and timing come from the server, so a sender queue cannot inflate the result. Download, upload and bidirectional stages.
- One to four servers from the operator's catalogue on one stage schedule, shown Combined or per server. A server that drops out leaves an explicit Partial result with its reason.
- Latency under load: idle and loaded latency per stage with median, p95, jitter and probe timeouts; added latency is the loaded median minus the idle median. Missing evidence stays explicit.
- Control over the connection path: throughput and latency paths chosen independently over HTTP/1.1, HTTP/2, HTTP/3, WebSocket and WebTransport. Details separates browser- and server-observed protocol evidence.
WebTransport needs a compatible browser, HTTPS, a trusted certificate, and reachable HTTP/3 over UDP. Probe timeouts are application observations, not TCP/IP packet loss. The optional wire-rate estimate is separate from measured payload throughput. See measurement definitions for exact timing, statistics, and interpretation, or the benchmark harness for controlled performance testing.
Run a test from a phone or desktop without installing a client. The gauge, timeline, and latency profiles keep transfer speed and responsiveness visible together.
- Flexible tests: stage toggles, duration presets or custom timings, automatic or fixed stream counts, and optional early completion when a stage stabilizes.
- Server selection: a Test servers checklist in Settings, independent sign-in for protected peers, and one Combined / per-server selector in results. Automatic paths resolve per server.
- Display choices: light and dark themes, decimal or binary bits/bytes, gauge scaling, and keyboard or touch chart inspection with reduced-motion support.
- Phone layout: one vertical reading order; the bottom status bar keeps the current stage and remaining time visible while you scroll.
- Wide desktop workspace: open Settings and Details side by side with the meter. Resize each panel to suit your monitor; your widths survive resizing and reload. Below the docked layout, one panel opens as a flyout and the URL follows the visible panel.
- Local history: optionally save up to 2,000 results on your device, grouped by day. Inspect past runs while the live test continues, then return to it from the toolbar. History is not a server-side archive.
Resizable desktop panels · more in the gallery
The same server, directly from your terminal. graphite-meter-client is an interactive Go TUI
with server selection, stage and timing controls, independent connection paths, stream settings,
and live throughput and latency results. It lets you test without browser runtime constraints.
Download and extract the matching client archive from Releases, then run:
./graphite-meter-client --url http://YOUR_SERVER_IP:7246
# Select catalogue entries explicitly, including runs without the catalogue host:
./graphite-meter-client --url https://meter.example.net --server frankfurt --server amsterdamPrebuilt clients are available for Linux and macOS on amd64/arm64, and Windows on amd64
(graphite-meter-client.exe). On authenticated servers, approve the terminal's short code in your
browser. The client keeps its measurement grant in memory and never asks for the operator password.
Without a terminal, or with --report, it runs once and prints the report; the exit status
reflects the outcome.
Flags, keys and exit codes · Build from source · Upgrading
- Deployment and configuration: TLS, authentication, containers, proxies, and troubleshooting.
- Measurement definitions: what each result measures and how it is calculated.
- Development: architecture, toolchain, testing, and releases.
- Benchmark harness: controlled throughput testing.
- Client contracts: discovery, uploads, and latency / WebTransport.
- Server catalogue and independent authorization: configure available servers and interpret simultaneous results.
Set up a checkout as in the development guide (mise run setup, then
mise run dev) and run mise run check before submitting a change.
Copyright © 2026 zR-JB. Licensed under AGPL-3.0-or-later; see LICENSE and
COPYRIGHT. Third-party notices ship in the browser's About/legal view, native-client
archives, and /usr/share/licenses/graphite-meter/ in the container.

