v0.1.0 โ€” open source

speedtest

Professional CLI speed test.
Async. Zero overhead. No external dependencies.

โšก Tokio async๐Ÿ“Š Terminal graphs๐Ÿ”ง JSON output๐ŸŒ Multi-stream๐Ÿฆ€ 100% Rust
$curl https://raw.githubusercontent.com/bacteriafield/speedtest/refs/heads/main/scripts/install.sh | sh
Copied!
more options โ†’
speedtest
$ speedtestDetecting nearest server...โœ“ Server: Sรฃo Paulo, BR โ€” 8ms
Download0 Mbps
Upload0 Mbps
Ping-- ms
download throughput

Why speedtest?

Built for engineers who need real data, fast.

performance

Zero overhead.
Real throughput.

Multiple simultaneous TCP/HTTP connections via Tokio async ensure real throughput measurement โ€” not theoretical.

  • 8 parallel download streams
  • 4 parallel upload streams
  • Zero-copy buffer strategy
// spawn parallel streams let handles: Vec<_> = (0..streams) .map(|_| tokio::spawn( download_chunk(client.clone(), url) )) .collect(); let results = join_all(handles).await;
visualization

Live graphs
inside your terminal.

Real-time rendering using Unicode blocks and Braille characters. Smooth updates with no flicker.

  • Braille dot rendering (2560 dpi equivalent)
  • No flicker via full-frame diff
  • Adaptive scale
// braille rasterizer fn render_graph(points: &[f64]) -> String { let canvas = BrailleCanvas::new( points.len() * 2, 4 ); canvas.plot(points).render() }
server selection

Best server.
Automatically selected.

Automatic nearest-server discovery based on geolocation, latency, and availability.

  • IP-based geolocation
  • Parallel latency probing
  • Fallback chain
async fn best_server( candidates: Vec<Server> ) -> Server { let pings = probe_all(&candidates).await; pings.into_iter() .min_by_key(|s| s.latency_ms) .unwrap() }
structured output

Native JSON.
Ready for metrics.

Structured output for Prometheus, Grafana, dashboards, and observability pipelines.

  • --json flag for machine output
  • Compatible with jq, Prometheus
  • --csv for spreadsheet export
{ "download_mbps": 423, "upload_mbps": 118, "ping_ms": 8, "jitter_ms": 1.1, "server": "br-rj-01", "timestamp": "2026-04-04T12:00:00Z" }

Live simulation

See how speedtest runs inside your terminal.

speedtest โ€” demo

Modular architecture

Clear separation of responsibilities. Easy to extend.

โšก
async-runtime
Tokio-powered async executor. Manages connection pools and stream concurrency.
tokio / futures
๐ŸŒ
server-discovery
IP geolocation + parallel ICMP probing to select the fastest available server.
reqwest / trust-dns
๐Ÿ“ก
measurement
Download and upload engine with configurable stream count and test duration.
hyper / bytes
๐Ÿ“Š
renderer
Terminal UI with Braille canvas, Unicode bars, and full-frame diff for no flicker.
crossterm / unicode
๐Ÿ”ง
output
Structured result serialization to JSON, CSV, and human-readable terminal output.
serde / csv
๐Ÿ’พ
history
Local SQLite store for result history. Query and compare past tests with --history.
rusqlite

Available flags

--liveReal-time terminal graph
--jsonStructured JSON output
--server <id>Select server manually
--duration <s>Test duration in seconds
--streams <n>Parallel streams count
--csvExport results to CSV
--historyView previous test history
--no-colorDisable colored output