How the browser test runs
Warm-up, quiet-line ping, download load, upload load, and result computation.
Jump to test flowdocumentation
Bufferbloat.org is designed to be inspectable. This is the trust layer: how the browser test runs, what is scored, why the scorecard uses median ping and p95 latency spread, what can be exported, and where the limits are.
Warm-up, quiet-line ping, download load, upload load, and result computation.
Jump to test flowThe scorecard uses the middle of the measured samples so one odd browser hiccup does not become the whole story.
Read median guideThe test looks at repeated high-delay behavior instead of showing a vague jitter number or one worst ping.
Read spread guideThe result page includes a technical drawer and CSV export so the measurement can be reviewed outside the website.
Read export guideStable variable names, value types, and definitions for the CSV export and technical table.
Jump to fieldsWhat a browser test can and cannot promise, what is retained, and what the export deliberately excludes.
Jump to limitsSmall preflight ping, download, upload, and quiet-line ping requests prepare the browser path. These samples are excluded from final medians.
The test first warms the quiet ping path, then samples baseline latency before adding download or upload pressure.
The browser creates download pressure with parallel streams and keeps probing latency during a short unscored settling period before recording the scored samples.
The browser sends repeated upload chunks, keeps probing during the unscored ramp period, then records latency while upload pressure is established.
The scorecard compares quiet latency with loaded latency, draws the final trace, and exposes the technical record behind the result.
The browser test uses median-style reporting, a Cloudflare Speed latency probe, a 100 MB download payload repeated across four streams, and repeated 1 MB upload chunks across three streams. The result grade is primarily about latency stability under load; low throughput is reported separately and is not automatically treated as bufferbloat. Latency spread is computed from the scored latency samples as 95th percentile ping minus median ping for each phase. It remains visible as a diagnostic tail-latency signal. Application performance uses a more robust upper-tail estimate when sample counts are small, so one or two isolated spikes can be shown without dominating the rating.
The running test asks the tab to stay in the foreground. If the tab is hidden, the run stops instead of producing a result from throttled or paused browser activity.
Results show quiet latency, download stress, upload stress, download throughput, upload throughput, and test duration. The completed chart uses orange for quiet-line samples, blue for download-loaded samples, purple for upload-loaded samples, and highlighted median ping dots for the final comparison.
The technical-details drawer contains the structured measurement record used by the scorecard: phase medians, stress deltas, p95 latency spread, robust application-tail estimates, throughput estimates, scored sample counts, raw scored latency sample lists, sample ranges, method notes, and application-performance scoring. The same record can be exported as CSV for review.
The result page exposes a technical-details drawer and CSV export. The scorecard keeps the table compact, while this section documents what each exported variable means. The CSV export uses stable variable names and raw values so the record can be reviewed in a spreadsheet or cited in a technical report. For the user-facing explanation, read how to inspect and export your test data.
| Variable | Value type | Description |
|---|---|---|
| grade | A+ through F | Overall bufferbloat grade computed from quiet latency, loaded latency, and latency movement under download/upload load. |
| measured_at | ISO timestamp | Browser-side completion time for the run. This is the time attached to the exported scorecard. |
| test_duration | seconds or m:ss | Elapsed time from measurement start through result computation, displayed in the same compact format as the scorecard. |
| quiet_latency_samples_ms | comma-separated milliseconds | Raw scored latency / ping samples collected during the quiet phase before intentional load is applied. |
| download_latency_samples_ms | comma-separated milliseconds | Raw scored latency / ping samples collected while download load is active, after the settling interval is excluded. |
| upload_latency_samples_ms | comma-separated milliseconds | Raw scored latency / ping samples collected while upload load is active, after the settling interval is excluded. |
| quiet_median_latency_ms | milliseconds | Median latency / ping before intentional download or upload traffic is applied. |
| download_loaded_latency_ms | milliseconds | Median latency / ping while the download load phase is active, after the settling interval is excluded. |
| upload_loaded_latency_ms | milliseconds | Median latency / ping while the upload load phase is active, after the settling interval is excluded. |
| download_stress_ms | milliseconds | Download-loaded median latency minus quiet median latency. Positive values mean added delay under download pressure. |
| upload_stress_ms | milliseconds | Upload-loaded median latency minus quiet median latency. Positive values mean added delay under upload pressure. |
| worst_loaded_latency_ms | milliseconds | Higher of the download-loaded and upload-loaded median latency values. |
| quiet_latency_spread_ms | milliseconds | 95th percentile scored latency / ping minus the median during the quiet phase. This shows the upper-end spread of normal ping before intentional load. |
| download_latency_spread_ms | milliseconds | 95th percentile scored latency / ping minus the median during download load. This is shown as a diagnostic tail-latency signal. |
| upload_latency_spread_ms | milliseconds | 95th percentile scored latency / ping minus the median during upload load. This is shown as a diagnostic tail-latency signal. |
| quiet_application_tail_ms | milliseconds | Robust quiet-line upper-tail estimate used for application-fit scoring. For small sample counts, this leans closer to p90-style spread so isolated spikes do not dominate the rating. |
| download_application_tail_ms | milliseconds | Robust download-load upper-tail estimate used for application-fit scoring. The visible p95 spread remains available as a diagnostic metric. |
| upload_application_tail_ms | milliseconds | Robust upload-load upper-tail estimate used for application-fit scoring. The visible p95 spread remains available as a diagnostic metric. |
| download_throughput_mbps | Mbps | Estimated downstream throughput measured during the download load phase. |
| upload_throughput_mbps | Mbps | Estimated upstream throughput measured during the upload load phase. |
| quiet_scored_samples | count | Number of quiet latency samples included in the displayed median and score calculation. |
| download_scored_samples | count | Number of download-loaded latency samples included after warm-up and settling exclusions. |
| upload_scored_samples | count | Number of upload-loaded latency samples included after warm-up and settling exclusions. |
| total_scored_latency_samples | count | Total quiet, download-loaded, and upload-loaded latency samples used for the displayed medians and grade. |
| latency_probe | endpoint name | Latency probe endpoint used for small ping-like browser requests during the test. |
| download_stream_count | streams | Number of parallel browser download requests used to create downstream load. |
| download_payload_size_mb | MB | Size of the payload file requested by each download stream. |
| upload_stream_count | streams | Number of parallel browser upload requests used to create upstream load. |
| upload_chunk_size_mb | MB | Size of the repeated upload payload chunk sent by each upload stream. |
| warm_up | inclusion rule | Indicates that session warm-up and quiet-line ping warm-up requests are excluded from the scored medians. |
| quiet_warmup_period_sec | seconds | Unscored quiet-line latency probe interval excluded before baseline latency samples are recorded. |
| settling_period_sec | seconds | Initial interval excluded from loaded phases so throughput and latency are scored after load begins to stabilize. |
| web_browsing_score | 0-100 score | Application-fit score for web browsing, derived from loaded latency, latency movement, and a light robust-tail adjustment. |
| video_streaming_score | 0-100 score | Application-fit score for video streaming, weighted more heavily toward download throughput with some latency-stability adjustment. |
| audio_calls_score | 0-100 score | Application-fit score for audio calls, derived from baseline latency, latency movement, robust tail latency, and minimum upload capacity. |
| video_calls_score | 0-100 score | Application-fit score for video calls, derived from baseline latency, latency movement, robust tail latency, download throughput, and upload throughput. |
| low_latency_games_score | 0-100 score | Application-fit score for low-latency games, weighted toward low baseline latency, low added latency under load, and robust tail latency. |
| cloud_backup_score | 0-100 score | Application-fit score for cloud backup, weighted toward upload throughput with a latency-stability adjustment. |
| export_contents | privacy statement | States that the CSV export contains measurement data only and excludes IP address, location, browser fingerprint, and device identity. |
Browser networking tests are useful but noisy. Results can be affected by browser scheduling, device load, Wi-Fi conditions, VPNs, background apps, router queues, ISP congestion, and mobile network variability.
The technical export contains measurement data only. It does not include IP address, location, browser fingerprint, user-agent string, or device identity.
Bufferbloat.org records first-party operational analytics for test quality and shared result links: session/test events, success or failure, coarse location from hosting headers, broad browser/OS/device category, bucketed viewport, measured results, chart samples, and application-fit scores. It does not store IP addresses, precise geolocation, full user-agent strings, or fingerprinting signals.
Shared result pages are backed by the same completed-test analytics record; they do not create a second copy of the result. Analytics and shared result records are retained for up to 180 days and are deleted automatically after that window.