cloudflare-speed-tui

A speed test that ends in a letter grade.

Runs against the Cloudflare edge and grades the connection A+ to F on latency, jitter, packet loss and loaded overhead.

The current cloudflare-speed-tui Overview after a completed run: large download and upload speed readouts, throughput charts, latency and reliability rows, connection details, idle latency distribution, and a three-strip latency profile. Quality D, 58 out of 100, with zero UDP loss.
The current Overview after a full run, captured from the release build with vhs.
Download and upload phases were shortened to 5 seconds for the recording.
cloudflare-speed-tui / overview
grade

Four weighted scores, one letter.

Each input is scored 0 to 100 from fixed bands. The weighted sum maps to a grade. If no loaded latency was measured, the 15 points move to idle latency.

idle latency
35%
jitter
25%
packet loss
25%
loaded overhead
15%

idle latency

under 10 ms
100
10 to 19
90
20 to 49
70
50 to 99
50
100 to 199
25
200 and up
0

jitter

under 1 ms
100
1 to 3
85
3 to 10
60
10 to 20
30
20 and up
0

packet loss

under 0.001%
100
under 0.1%
90
under 1%
70
under 3%
40
3% and up
0

loaded overhead

under 10%
100
10 to 24%
80
25 to 49%
60
50 to 99%
30
100% and up
0
A+95 and up
A85 to 94
B75 to 84
C60 to 74
D45 to 59
Funder 45

The recorded run: idle latency of 75.5 ms scores 50. Loaded download latency of 172.3 ms is 128% over idle, which scores 0. Jitter of 8.9 ms scores 60; zero loss scores 100. The weighted total is 57.5 points, displayed as 58, grade D.

measurements

What a run records.

The test starts when the app launches unless you turn that off with --test-on-launch false.

idle latency

Probes before the transfer phases, 2 seconds by default. Reported as a median with quartiles.

download and upload

10 second phases by default, 6 workers. Requests are 10 MB down and 5 MB up unless you change them.

loaded latency

Latency probed during the download and during the upload. The gap from idle becomes the overhead score.

udp packet loss

50 packets by default, set with --udp-packets. Reported as received count, loss percent and round-trip time.

dns and tls

Lookup and handshake times run by default. --skip-diagnostics leaves them out.

ip versions and route

--compare-ip-versions compares IPv4 with IPv6. --traceroute traces the path to the edge, 30 hops at most.

live run

Recorded, not mocked.

One complete run of the release binary with --download-duration 5s --upload-duration 5s --auto-save false.
  • overview

    Live throughput, latency and reliability, distribution and a shared-scale latency profile.

  • diagnostics

    The DNS, TLS and route measurements.

  • history

    Saved runs. Saving is on by default.

  • help

    Key bindings for the four tabs.

flags

Interactive, or just the numbers.

json

Prints the result and exits.

cloudflare-speed-tui --json

text

Prints a text summary and exits.

cloudflare-speed-tui --text

silent

Only errors are printed. Meant for cron.

cloudflare-speed-tui --silent

all 29 options

Search all options, or toggle categories to narrow the list.

flagwhat it doesdefault
output
--jsonPrint JSON result and exit, no TUI
--textPrint text summary and exit, no TUI
--silentSuppress all output except errors
--export-json <path>Export results as JSON
--export-csv <path>Export results as CSV
--auto-save <bool>Save each run to historytrue
--comments <text>Attach a comment to this run
timing
--download-durationDownload phase length10s
--upload-durationUpload phase length10s
--idle-latency-durationIdle latency probe length, before the test2s
--probe-interval-msTime between latency probes250
--probe-timeout-msProbe timeout800
--udp-packetsUDP packets sent for the loss measurement50
load
--concurrencyWorkers for download and upload6
--download-bytes-per-reqBytes per download request10000000
--upload-bytes-per-reqBytes per upload request5000000
network
--base-urlSpeed test service to usehttps://speed.cloudflare.com
--interface <name>Bind to a network interface, such as eth0
--source <ip>Bind to a source IP address
--proxy <url>Route traffic through an HTTP, HTTPS or SOCKS5 proxy
--certificate <path>Custom TLS certificate, PEM or DER
--ipv4-onlyForce IPv4
--ipv6-onlyForce IPv6
diagnostics
--compare-ip-versionsCompare IPv4 and IPv6 performance
--tracerouteTrace the route to the Cloudflare edge
--traceroute-max-hopsHop limit for the traceroute30
--skip-diagnosticsSkip the default DNS and TLS measurements
launch
--test-on-launch <bool>Start a test when the app openstrue
--experimentalReserved for future features
build

Built from source with cargo.

full build

The interactive TUI and the non-interactive modes.

cargo build --release

headless build

No TUI dependencies. Use --json, --text or --silent.

cargo build --no-default-features