LagScope · Methodology

How LagScope measures your connection — and where it stops

A lag tool you can’t audit is just another opinion. This page is the full recipe: what we send down the wire, how every number is computed, what a browser physically cannot see, and when LagScope is the wrong tool entirely. If anything here ever drifts from what the tool actually does, the tool wins — tell us and we’ll fix the page.

What goes down the wire

In GAME TRAFFIC mode, LagScope opens a WebRTC connection to the nearest measurement node (US, EU or Brazil — auto-selected by lowest measured latency at page load) and sends 128-byte UDP packets at 30 Hz over an unreliable, unordered DataChannel — the same shape as real game traffic: small, frequent, and never retransmitted. That last part is the point. TCP-based tests quietly resend lost packets, so loss becomes invisible; our probes behave like your game’s packets, so a lost probe is recorded as loss, exactly the way your game felt it. If WebRTC is unavailable, the monitor falls back to lightweight HTTP probes and says so in the status line — HTTP timing still catches spikes and outages, but it can’t show true UDP loss.

The lighter 25-second tests on the game and symptom pages use the HTTP probe pattern against the same nodes. Same engine, shorter session, no WebRTC requirement.

How every number is computed

Baseline — the median of your last 120 good samples

Your “normal” is the rolling median of the last 120 clean samples (about four seconds of traffic). Two deliberate choices. Median, not average: a median ignores the spikes themselves — if we averaged, a lagspike would drag its own reference line upward and smaller follow-up spikes would escape detection. 120 samples, rolling: enough to be statistically stable, short enough to adapt when your line genuinely shifts (a different node, a different route, evening congestion becoming your new normal). Everything else — spikes, verdicts, per-game readiness — is measured against this line, not against an arbitrary ms number.

Spike threshold — adaptive, not fixed

A sample counts toward a spike when it sits above baseline + a noise-aware margin (the margin scales with the median absolute deviation of your recent samples) and the elevation holds for at least half a second. Consequence: a rock-solid fiber line gets a tight threshold, a noisy satellite or fixed-wireless link gets a wide one — so we don’t cry wolf on lines where ±10 ms of wobble is simply the weather. Micro-bursts shorter than ~0.5 s are absorbed by game netcode and never counted as events.

Jitter, loss, outages, bufferbloat

Warmup and verdicts

The first ~10 seconds of a session are calibration: raw numbers render immediately (the proof surface is never a void), but verdicts, spike events and scores wait for the baseline to be trustworthy. First impressions get a label (“looking stable so far…”), not a fake verdict.

Why a hidden tab shows a gap, not a spike

Browsers throttle or fully freeze timers in background tabs — that’s specified behavior, not a bug (W3C Page Visibility; the WebRTC transport itself is standardized by the W3C WebRTC spec and RFC 8831). If we kept timing probes while your tab was hidden, the browser’s freeze would look like a massive lagspike on your connection — a fabricated event in your evidence log. So LagScope stops measuring when the tab hides and draws an honest gap band on the chart instead. Your evidence report covers only time that was actually measured. We’d rather show “no data” than show a lie.

Limitations — what a browser cannot see

When NOT to use LagScope

LagScope diagnoses the network. It is the wrong tool, and will honestly tell you nothing, for:

What real sessions look like

Three anonymized sessions, in the exact shape of a proof report — baseline, jitter, loss, events, score — and what each one meant:

Session 1 — “It’s not your internet”

MetricValue
Baseline24 ms
Avg jitter (60 s)1.8 ms
Packet loss0.0%
Spikes / outages0 / 0 in 42 min
Score97 / 100 — EXCELLENT

The player was dying to “lag” in Valorant ranked. The connection was spotless for three quarters of an hour — the deaths were server-side hit-reg and a frame-time problem. A clean result is information too: it redirects the hunt to the PC or the game server instead of the ISP.

Session 2 — Wi-Fi with a full signal

MetricValue
Baseline31 ms
Avg jitter (60 s)14.6 ms
Packet loss0.8%
Spikes11 in 60 min, peaks +120–+210 ms over baseline
Score58 / 100 — UNSTABLE

Average ping looked fine; the game felt terrible. The jitter and the spike log told the real story. Same session re-run on Ethernet: baseline 19 ms, jitter 2.1 ms, zero spikes. One cable, problem gone — and the timestamped before/after is the proof it was never the ISP.

Session 3 — Fine until the house wakes up

MetricValue
Baseline (idle)22 ms
Latency under stress test+380 ms under load — bufferbloat confirmed
Packet loss0.0%
SpikesClustered 19:00–23:00, matching family streaming hours
Score71 / 100 — MOSTLY STABLE, with a loaded-latency warning

Nothing wrong with the line itself — the router was queuing game packets behind 4K streams. SQM (Cake) at 95% of line rate, stress test re-run: +14 ms under load. The bufferbloat guide walks the same fix.

Lag in game? The 60-second decision path

1. Run LagScope for 15 minutes while you play (tab visible).
2. Clean result (no loss, no spikes, low jitter)? → Your connection is innocent — look at the game server (check their status), your PC (FPS drops aren’t lag), or the server region you’re matched into.
3. Packet loss >0? → Real packets dying. On Wi-Fi? Test on Ethernet first — half of all loss is the last 3 meters of air. Wired and still losing? That’s an ISP conversation — bring evidence.
4. High jitter but no loss? → The rollercoaster. Classic Wi-Fi interference or congestion — wire up, or test at a different hour to isolate.
5. Latency explodes only when the network is busy? → Bufferbloat. Run the 8-second stress test to confirm, then fix the queue — free, tonight, on the router you already own.
6. Spikes at the same hours every day? → Congestion pattern, upstream of you. Log it for a few evenings — repetition turns an anecdote into a ticket your ISP’s network team can act on.

Machine-readable proof

Every shared result (/proof/{id}) has a machine-readable twin at /api/snapshot/{id}: the session’s score, plain-language summary, baseline, jitter, loss and the full spike/outage event lists as JSON. Anyone — your ISP’s support, a forum skeptic, an AI assistant — can verify the numbers behind the card instead of taking a screenshot’s word for it.

Sources

Primary sources only — standards, and the game developers’ own engineering posts:

The tool is the argument

Everything on this page is checkable in one session. Run the monitor while you play and watch it do exactly what it says here — free, no signup, runs in your browser.

Open the monitor