Skip to content

Latest commit

 

History

556 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Graphite Meter

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.

CI Release Container License

Quick start · Measurements · Browser · Terminal · Documentation

Graphite Meter completed results on desktop with an overlapping phone companion

Real runs against local servers · screenshot gallery

Quick start

docker run -d --name graphite-meter --restart unless-stopped \
  -p 7246:7246 ghcr.io/zr-jb/graphite-meter:latest

Open 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.

What you can measure

  • 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.

Browser client

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.

Graphite Meter with Settings and Details open beside the completed meter on a wide desktop

Resizable desktop panels · more in the gallery

Native terminal client

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.

Graphite Meter native terminal client after a complete latency, download and upload run

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 amsterdam

Prebuilt 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

Documentation

Contributing

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.

License

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.

About

Self-hosted network throughput, loaded latency, and WebTransport datagram-loss measurement with receiver-side accounting, selectable transports, and browser and terminal clients.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages