Measuring a mobile line without spending it
A speed test that burns 300 MB to tell you your line is fine is a strange thing to run on a metered plan. How Nibble gets the same answer from a tenth of the data — and some of it from none at all.
The usual speed test saturates your line for a fixed ten or fifteen seconds. On Wi-Fi that costs nothing. On a mobile plan, a fast 4.5G or 5G connection can move a few hundred megabytes in that time — so the more often you check, the more of your month you give away to checking.
Some answers cost nothing
The phone already counts every byte it moves. Android exposes those counters, and reading them is a local system call — no network at all. So while another app is downloading (a video, an update, a backup), Nibble samples the counters every two seconds and records the speed that app reached. It is a lower bound, not a ceiling: it only sees as fast as the other app pulls. But it is free, and over a day it adds up to a good picture of the line.
Latency was the second surprise. I first measured it the obvious way — time a tiny request in JavaScript — and got a jitter of around 30 ms on a line whose real jitter was closer to one. The noise was the timer and the event loop, not the network. Cloudflare's speed endpoint reports the kernel's own TCP counters for the connection in a response header, so Nibble reads round-trip time, its variance and retransmissions from there:
server-timing: cfSpeedEdge;dur=3, cfSpeedWorker;dur=23,
cfL4;desc="?proto=TCP&rtt=73953&min_rtt=71958&rtt_var=18178
&sent=5&recv=9&lost=0&retrans=2 …"Packet loss comes from the same counters, which means Nibble never has to flood the line with probe packets to estimate it. Latency, jitter and loss together cost about 30 KB.
Throughput on a budget
Download and upload still need real bytes. The change is that they do not run for a fixed time — they run against a budget you choose, from 3 MB to 50 MB, and each phase:
- 01starts with 256 KB chunks and grows them as it learns the line;
- 02leaves the first ~600 ms (TCP slow start) out of the result — but still charges those bytes to the budget;
- 03stops as soon as the last readings are stable (their spread under 5%);
- 04and cuts off hard the moment the budget is spent.
Fast lines turn out to be the cheap case, not the expensive one: a 100 Mbps connection proves itself in about a second and a half. Holding it for three seconds would have spent the whole budget on confirming what was already known.
Every byte Nibble spends is on screen, including the ones it spends on itself.
The scores that come out at the end (gaming, video calls, 4K, downloads) are curves anchored to real requirements — a streaming bitrate, the latency band competitive games need — rather than a single number dressed up as a grade. What makes a line good for gaming is almost the opposite of what makes it good for downloads, so they are scored separately.