A terminal-based internet speed test with an interactive TUI and a headless CLI for scripting and CI.
- Download & upload speed measurement with live EWMA progress
- Ping & jitter: configurable ping count, jitter as Mean Absolute Deviation
- Network diagnostics: traceroute, DNS timing, quality scoring (
lazyspeed diag) - Interactive TUI: server selection, results, history, export, help overlay
- Headless CLI: JSON, CSV, and one-liner output for scripting and CI
- Persistent history: XDG-compliant storage with configurable retention
- Multi-test runs:
--count Nfor sequential tests - Shell completions: bash, zsh, fish, powershell
- Single binary: zero runtime dependencies, cross-platform (macOS, Linux, Windows)
brew tap jkleinne/tools
brew install lazyspeedDownload the latest binary from Releases.
Requires Go 1.24+.
git clone https://github.com/jkleinne/lazyspeed.git
cd lazyspeed
make buildlazyspeed| Key | Action |
|---|---|
n |
Start a new speed test |
d |
Run network diagnostics |
e |
Export latest result (JSON or CSV) |
h |
Toggle help overlay |
↑/↓ or k/j |
Navigate lists |
Enter |
Select |
Esc |
Back |
q / Ctrl+C |
Quit |
# Default (human-readable progress on stderr)
lazyspeed run
# Structured output
lazyspeed run --json
lazyspeed run --csv
lazyspeed run --simple # DL: X Mbps | UL: X Mbps | Ping: X ms
# Options
lazyspeed run --server <id> # Use a specific server
lazyspeed run --no-upload # Skip upload phase
lazyspeed run --no-download # Skip download phase
lazyspeed run --count 5 --json # Run 5 sequential tests# Interactive diagnostics in TUI
lazyspeed diag
# Headless with structured output
lazyspeed diag --json
lazyspeed diag --csv
lazyspeed diag --simple
# Specify target
lazyspeed diag --server <host>
# View diagnostics history
lazyspeed diag --history
lazyspeed diag --history --last 5lazyspeed history # Table view
lazyspeed history --format json # JSON output
lazyspeed history --format csv # CSV output
lazyspeed history --last 10 # Last N entries
lazyspeed history --clear # Delete all historylazyspeed servers # Table of servers sorted by latency
lazyspeed servers --format json
lazyspeed servers --format csvlazyspeed version # Version, commit, build date
lazyspeed completion bash # Shell completions (bash/zsh/fish/powershell)Config file: ~/.config/lazyspeed/config.yaml (respects $XDG_CONFIG_HOME)
history:
max_entries: 50 # Maximum history entries (default: 50)
path: "" # Override history path (default: ~/.local/share/lazyspeed/history.json)
test:
ping_count: 10 # Ping iterations per test (default: 10)
fetch_timeout: 30 # Server list fetch timeout in seconds (default: 30)
test_timeout: 120 # Speed test timeout in seconds (default: 120)
export:
directory: "" # Default export directory (default: current directory)All settings are optional: sensible defaults are used when omitted.
Push speed test results to InfluxDB (v1 or v2) for graphing in Grafana. Configure one or more endpoints in ~/.config/lazyspeed/config.yaml:
metrics:
endpoints:
- url: "https://influx.example.com:8086"
v2:
token: "your-influx-token"
org: "my-org"
bucket: "speedtest"
timeout: 10
max_retries: 1For InfluxDB v1, use a v1: block with database, optional username, and optional password instead. Exactly one of v1: or v2: must be set per endpoint.
Metrics writes fire after every successful speed test in both headless (lazyspeed run) and interactive (TUI) modes. Failures are logged as warnings and do not fail the test itself.
| Feature | LazySpeed | Ookla CLI | fast-cli | speedtest-go CLI |
|---|---|---|---|---|
| Interactive TUI | Yes | No | No | No |
| Headless CLI | Yes | Yes | Yes | Yes |
| Persistent history | Yes | No | No | No |
| JSON/CSV export | Yes | JSON only | No | JSON only |
| Network diagnostics | Yes | No | No | No |
| Configurable | Yes (YAML) | Limited | No | No |
| Single binary | Yes | Yes | No (Node.js) | Yes |
| Cross-platform | macOS, Linux, Windows | All | All | All |
| Open source | MIT | Proprietary | MIT | MIT |
See CONTRIBUTING.md for setup instructions, coding conventions, and PR guidelines.