CursorTrack · field log GitHub ↗

A 32-day self-experiment

My cursor sat perfectly still for 91.9% of a month.
Then it reproduced a law from 1954.

I logged every position my mouse pointer occupied — 144 times a second, for 32 days — on a Windows 10 laptop. That is 82,866,811 samples of the least examined thing on a computer. Here is what fell out.

01 — The first surprise

A cursor is mostly a rock.

The recorder samples at 144 Hz whether or not anything happens, so the log contains the honest denominator that a normal mouse-move listener throws away. Of samples taken while the machine was awake, only landed on a pixel different from the one before. Everything else is a pointer sitting exactly where it was left.

How long it stays put

Each bar is one class of pause. Height = share of the awake hours spent in pauses of that length. Hover for the count.

How fast it moves when it does

Speed of every position change, in pixels per second. Use the selector to isolate one hour of the day.

02 — Territory

32 days of attention, burned into one screen.

Every recording is rescaled onto a common 1920×1080 reference screen, then accumulated. Dwell weights each pixel by the seconds the cursor rested there; travel counts position changes, which shows the routes rather than the parking spots; clicks shows only where the button actually went down.

lowhigh

Every click, exactly where it landed

Not a grid — one dot per press, all of them, at full coordinate precision. Drag the slider to isolate a single hour of the day and watch the pattern move.

all 24

The same screen, four times of day

Dwell time only, split into six-hour periods and scaled independently so each panel shows its own shape rather than just its own volume.

Which button

Every press over 32 days.

Clicks by hour

When the button actually goes down.

Scroll direction

Signed wheel/two-finger ticks, by delta sign.

03 — Rhythm

A month of work, one row per day.

Each row is a calendar date; each column is a minute of that day. A lit pixel means the laptop was awake and recording. This is the single most honest picture of a working month I have ever seen of myself — including the nights I would rather not have had a record of.

Hover any minute

The weekly clock

Hours awake at the machine, by weekday and hour of day.

Day by day

Pick a measure. Hover a bar for the full day's numbers.

04 — Odometer

The pointer walked 11.9 km across the glass.

Summing every step between consecutive positions and converting pixels to millimetres on a 15.6-inch panel gives a real, physical distance. It is not a metaphor: my index finger pushed a cursor that far.

Cumulative distance

Metres of on-screen cursor travel, accumulated over the 32 days. Hover for the day.

05 — The finding

My mouse reproduced Fitts's Law without being asked.

In 1954 Paul Fitts showed that the time to move to a target grows with the logarithm of the distance — a straight line when plotted against log₂(distance). It is normally measured in a lab, with a metronome and a chin rest. I measured it by accident, from a month of ordinary work: for every one of clicks, I took the uninterrupted movement that landed on it and asked how long that movement took.

Movement time vs. distance

The shape of a single movement

Mean speed across the course of a movement, with every movement stretched onto the same 0–1 timeline so short and long ones can be compared. Split by how far the movement travelled.

06 — The null result

Working at 3 a.m. did not make me clumsier.

I fully expected to find late-night degradation — wobblier paths, more corrections, slower approaches. I did not. Path efficiency (straight-line distance ÷ actual path length, so 1.0 is a perfect line) is essentially flat across all 24 hours. The honest finding here is the absence of one, and I would rather publish that than a curve I went looking for.

Path efficiency by hour of day

Mean efficiency of every movement longer than 30 px. The band shows the full range across the day — note how narrow it is.

Micro-corrections by hour

Share of movements shorter than 15 px — the nudges and overshoot fixes.

Time awake by hour

Where the 148 hours actually went. Two peaks, and a tail that should not exist.

07 — Forty minutes

The densest forty minutes in the whole log, replayed.

Rather than pick a nice-looking session, I let the data choose: this is the 40-minute window containing more distinct cursor positions than any other in the month. Rings are clicks, arcs are scrolls, and the trail fades over two seconds.

00:00

08 — Portraits

Every day has a handwriting.

One panel per calendar day: the whole day's trajectory drawn as a single continuous line. A 14-hour Saturday fills its frame edge to edge; a 40-minute Wednesday is a handful of strokes with the screen showing through. Click any panel to open it large.

09 — Honest notes

What a real telemetry log actually looks like.

None of this was clean. If you have only ever analysed a tidy CSV, this is the part worth reading — every one of these had to be handled before a single chart was drawn.

All recordings, laid end to end

Each bar is one file, positioned by when it started and how long it ran. Bars are stacked into lanes only so they do not overlap. The single bar spanning the whole month is the scheduled recording that never stopped.

10 — The instrument

Recorded with CursorTrack, which I built for this.

An open-source Python tool that records mouse movement, clicks and scrolls into a compact, delta-encoded, crash-safe binary format, replays them, and exports to CSV, JSONL, NumPy or Parquet. Capture and playback are dependency-free on Windows (Win32) and Linux (X11/XTest) via ctypes. Samples at up to 240 Hz, buffers and fsyncs as it goes so a recording survives being killed, and ships a global fail-safe that aborts playback the moment you move the mouse into a corner.

The 82.8 million events behind this page take 20 MB on disk — about 2 bytes per sample.

View CursorTrack on GitHub ↗