Round-trip time
Live log
Targets
A bare IP or hostname becomes https://<host>/. Targets must be
https:// — this page is served over HTTPS, so the browser blocks plain
http:// requests as mixed content no matter what the target allows.
How this measures things (and what it can't do)
These are HTTPS round trips, not ICMP pings
No browser can send an ICMP echo. There is no API for it and no workaround.
Every sample here is a small HTTPS request issued from this device, timed with
performance.now(). Nothing is measured on a server on your behalf and no
result is proxied through an API — if this page says 14 ms, your machine took
14 ms.
In practice that is often the more useful number at work: corporate networks
routinely block or deprioritise ICMP while HTTPS is what actually carries your
traffic. But it is not the same measurement as ping(8), and it will read
a few milliseconds higher because a TLS record and an HTTP response are involved.
"Loss" here means probe loss
A sample counts as lost when the request fails outright or exceeds the timeout. That covers real packet loss, DNS failure, TLS failure, and the target being down — it cannot distinguish between them the way ICMP loss can. Sustained loss to all targets is a strong internet-down signal; loss to one target usually means that target.
The first sample of each target is discarded
The first request to a host pays for DNS, TCP and the TLS handshake — roughly three extra round trips. That warm-up sample is logged but excluded from the statistics. Later samples reuse the kept-alive connection, so they sit close to true network RTT. An occasional isolated spike is usually the connection being re-established, not a network event.
Backgrounded tabs are throttled — gaps are drawn, never faked
Browsers clamp timers in hidden tabs, and after a few minutes Chrome drops them to roughly one per minute. Rather than reporting that as an outage, this page compares wall-clock time between ticks: any interval it could not actually sample is recorded as a gap, drawn as a hatched band on the chart, and excluded from the loss figures. Installing it as a desktop app and leaving the window visible avoids the throttling entirely.
Default targets
1.1.1.1— Cloudflare DNS-over-HTTPS, asking for a name Cloudflare itself already has cached, so the reply is near-pure network time.8.8.8.8— Google DNS-over-HTTPS, same trick.my.ipinfo.app— a small static asset on your own infrastructure, so you can tell "the internet is broken" apart from "my stuff is broken".
Don't judge a target by pasting its URL into a browser tab. The Cloudflare
probe returns HTTP 400 if you open it by hand, because its DoH endpoint
requires an Accept: application/dns-json header and the address bar
doesn't send one. The monitor sends it on every probe, which is why those samples
come back status=200. Trust the log rows over a manual visit — a probe
that really returned 400 would show up as an amber
reachable but HTTP 400 row, not a green one.
Adding your own IPs
Anything reachable over HTTPS works, including private addresses if this device can
route to them. Two limits are the browser's, not this page's: plain
http:// targets are blocked as mixed content, and a host with an
untrusted or self-signed certificate fails the TLS handshake and will read as 100%
loss. Targets that don't send CORS headers are probed in no-cors mode —
the timing is still accurate, but the HTTP status code is invisible, so any completed
exchange counts as reachable.
Your own public IP is offered as a target for convenience, but be aware most routers won't loop a connection back to their WAN address from inside the LAN, so it often reads as down even when everything is fine.