The two timings that matter
Every keystroke produces two measurable times. Dwell time is how long the key is held down — the duration between keydown and keyup. Flight time is the gap between releasing one key and pressing the next. Together these two numbers, sampled across a paragraph, produce a typing fingerprint.
The patterns no autotyper gets right (without trying)
- Gaussian distribution. Real flight times cluster around a mean with diminishing tails. Bots that use
setTimeout(..., random())produce a flat uniform distribution that's trivially separable from human data. - Word-internal acceleration. Characters 2–4 of a word type ~15% faster than the first. Motor memory takes over once the word starts.
- Punctuation and sentence-end pauses. Commas trigger 80–230ms pauses. Sentence-ending punctuation triggers 250–650ms. Newlines trigger longer.
- QWERTY-neighbour typos. Real typos are almost always physical neighbours of the intended key —
rfort, neverrforp. - Fatigue drift. Past 200 characters, average WPM drops and typo rate rises. By the eighth paragraph you're slower and sloppier than the first.
- Re-reading pauses. Every 80–200 characters, real typists stop for 400–1200ms to re-read what they just wrote.
The research
The seminal academic work in this space is "Keystroke Dynamics Against Academic Dishonesty in the Age of LLMs" by Kundu, Mehta, Kumar et al. (MIDAS Lab IIIT Delhi and Bucknell University, 2024). They demonstrate that a classifier trained on keystroke timing alone distinguishes human-written from LLM-pasted text with high accuracy, even when the textual content is otherwise indistinguishable to AI text-detectors.
A follow-up paper, "Detecting LLM-Assisted Academic Dishonesty using Keystroke Dynamics" (2025), extends this to live academic-writing settings.
Industry has caught on. Grammarly's Authorship and GPTZero's typing-pattern algorithm both build on the same insight: typing rhythm is harder to fake than text style.
How Wraitor's engine reproduces real dynamics
Wraitor's typing engine implements every pattern listed above. Per-character delays come from a Box-Muller transformed Gaussian centred on the configured WPM. Word-internal characters get a 15% speed boost. Boundary pauses are sampled from the empirically observed ranges. QWERTY typos use a neighbour-keymap and trigger a notice-pause, backspace, retype-pause, retype sequence. Fatigue gradually decays WPM toward a 60% floor over long sessions, and re-reading pauses fire stochastically.
The result is a typing trace that — to a keystroke-dynamics classifier — sits comfortably inside the human distribution.
Where it still falls short
Keystroke dynamics also captures per-person idiosyncrasy: which keys you hold longer than average, your particular flight-time bias on common digrams. Wraitor reproduces the human population distribution, not your individual one. For continuous behavioural authentication systems trained on a specific user (rare outside enterprise login), wraitor's output is human-like but not you-like. For one-off detection like Authorship or AI-interview screens, that distinction doesn't matter.