Skip to content

Methodology

How Human measures

Precise where a browser can be precise, honest where it can't. Every formula below is the one the code uses.

No account. No tracking. Your results stay with you.

Timing APIs

Every interval is measured on one monotonic, high-resolution clock: performance.now(). Input events carry their own timestamp on the same clock (event.timeStamp) — the moment the operating system delivered the press — so a busy page can't add time to your response. If a browser reports an implausible timestamp, Human falls back to reading the clock when the event is handled. Date.now() is never used to measure anything; it only stamps when a result was saved.

Signals are drawn inside a requestAnimationFrame callback, and the onset is read in that same callback, just before the frame is painted. Moving targets are positioned as a function of elapsed time, never by counting frames. During a measured trial nothing is re-rendered by React; results are committed after the trial.

Display refresh, input devices and browsers

A screen only shows a new image at its refresh rate: every 16.7 ms at 60 Hz, 8.3 ms at 120 Hz. A signal drawn just after a refresh waits for the next one, so a 60 Hz display adds up to a frame of unavoidable variation. Keyboards, mice and touchscreens add their own delay — often 5–30 ms, sometimes more for wireless devices. Browsers may also coarsen timers for privacy.

Human does not invent corrections for any of this. Instead it records broad context with timing-sensitive results (input type, approximate refresh rate, device class and browser engine), keeps personal bests separately per input type, and labels them “best on this device”.

Practice and invalid trials

Timing-sensitive tests start with a practice trial labelled “Practice”, which is never scored. A trial is discarded and repeated when:

  • you respond before the signal (a false start — “Too soon.”), or within 100 ms of it (faster than a reaction can be);
  • there is no response within the time limit;
  • the page is hidden or the window loses focus during the trial, or two animation frames are more than 250 ms apart (a stalled browser) while a response is being timed — and, in browsers that report it (Chrome, Edge), any main-thread task of 50 ms or more between the signal and your response, because it may have delayed the signal on screen.

Discarded trials are counted and shown, never silently dropped — and valid outliers are never removed.

Median vs mean

Timed tests report the median: the middle value of your valid trials. One slow trial (a blink, a distraction) moves a mean a lot but a median hardly at all, so the median describes your typical speed better. The mean, best, worst and spread are shown alongside it.

consistency = 100 × (1 − standard deviation ÷ mean), clamped to 0–100

Consistency of 100 means identical values; it falls as values vary more relative to their average.

Input mode

Human records whether a result came from a mouse, touch, pen or keyboard. A finger tap, a mouse click and a key press travel through different hardware, so results are compared only within the same input type.

Typing formulas

net WPM = (correct characters ÷ 5) ÷ minutes raw WPM = (typed characters ÷ 5) ÷ minutes accuracy = correct keystrokes ÷ all keystrokes × 100

By convention every five characters — spaces and punctuation included — count as one word. Corrected errors were wrong when typed and later deleted; uncorrected errors are still wrong at the end. The text is bundled with the page: everyday words and passages written for Human.

Accuracy and response-time challenges

accuracy = correct answers ÷ trials × 100

Choice Reaction and Stroop report the median response time of correct answers. Go/No-Go uses accuracy as its score because responding to everything quickly would otherwise look like a good result; commission errors (responding when you should hold) and omission errors (missing a go signal) are shown separately.

Memory scoring

Sequence, Number and Visual Memory get one step harder after each success and give you three lives: a mistake costs a life and repeats the level with new, cryptographically random content. Your score is the highest level you completed — the longest sequence, the longest number, or the most cells.

Randomness

Waiting times, sequences, numbers, patterns, target positions and colours come from the browser's cryptographic generator (crypto.getRandomValues) with rejection sampling, so there is no bias and no predictable pattern. Math.random() is never used.

Local history and trends

Up to 50 results per test are kept in this browser, plus personal bests that outlive that history. Your profile compares the median of your last five comparable results with the five before them; within 2% is “steady”. There is no AI or opaque analysis.

Daily Challenge seed

The local calendar date (for example 2026-10-24) is hashed (xmur3) to seed a small deterministic generator (sfc32). It chooses only which five tests appear, their order and the typing words. The first completed run of each Daily test is that day's result; retries are practice — saved to your history, never replacing it. Everything that is measured still uses the cryptographic generator. The date is fixed when you open the page, so midnight or a time-zone change doesn't switch challenges part-way.

Why there are no population percentiles

Claims like “faster than 87% of people” need a large, calibrated dataset collected under known conditions. Human doesn't collect anyone's results, and results from different screens and devices aren't comparable anyway — so it shows the comparisons it can stand behind: your previous result, your best, your consistency and your trend.

Non-clinical scope

Human is a set of interactive challenges for curiosity and self-improvement. It is not a medical, psychological, neurological, intelligence or hiring assessment, and it cannot diagnose, screen for or rule out any condition. Colour Difference is a visual challenge, not a color-vision test. If you have concerns about your health, vision or attention, talk to a qualified professional.