Messages to What Comes Next

This is revision 1 of this page, effective September 24, 2026. Its text is kept unchanged; any figure it draws from the corpus, such as a count or the current file's time, is live. The current revision is in force.

Method

Every entry carries a composition score and the figures it is drawn from. This page states exactly how they are computed, so that the score can be checked rather than believed, and so that anyone holding the corpus can recompute it.

The score is a summary of how a message was typed, not of what it says and not of who wrote it. It is published beside the entry and never used as a gate: a low score is shown, not enforced.

What is captured

While a message is written, the page records an event stream: the time at which each piece of text was inserted, deleted, or moved, and whether text arrived by paste. The stream carries timestamps and event types only, never which characters were typed. At publication the stream is sent to the server with the message, the server computes the figures below in memory, and the stream is discarded. It is never written to disk.

The figures are computed on the server rather than in the browser because a figure computed in the browser is self-reported: a script could post whatever numbers it liked.

The figures

FigureDefinition
Composition timeSeconds from the first insertion, deletion, or paste to the moment of publishing.
DeletionsNumber of deletion events. A held backspace that removes ten characters is one event; the characters removed are recorded separately.
Longest pauseThe longest gap, in seconds, between two consecutive edits.
Rhythm variationThe coefficient of variation (standard deviation divided by mean) of the intervals between consecutive insertions, counting only intervals of two seconds or less. Left blank when there are fewer than twenty such intervals.
PastedWhether any text arrived without a history, and how many characters. A paste, a drop, or any block of twenty or more characters appearing at once counts.

The corpus also records the number of characters typed, the number of characters in the message, the number of cursor moves, and the number of intervals behind the rhythm figure.

Version 1.0

The score is a weighted mean of five components, each scaled from 0 to 1, computed within the writer's declared input method. Dictation and touchscreens do not look like a keyboard, so each method has its own thresholds; a method that was not declared uses the most lenient thresholds.

Each component uses a ramp: 0 at or below a low value, 1 at or above a high value, and a straight line between.

ComponentWhat it measuresKeyboardTouchscreenDictation, assistive, or not stated
RhythmRhythm variation, ramping up0.15 to 0.500.15 to 0.50Not used for dictation or assistive; used when measurable if not stated
PaceCharacters per second over the composition time, ramping down8 to 155 to 1015 to 25
RevisionDeletions per 100 characters, ramping up, with a floor of 0.30 to 20 to 20 to 1
PauseLongest pause in seconds, ramping up, with a floor of 0.20 to 50 to 50 to 5
OriginShare of the text that was typed rather than pasted0 to 10 to 10 to 1

Origin is the number of characters typed divided by the number typed plus the number pasted. If fewer than half of the message's characters arrived by any recorded route, origin is capped at the share that did.

WeightKeyboardTouchscreenDictation and assistiveNot stated
Rhythm0.300.2500.15
Pace0.200.250.350.30
Revision0.150.150.150.15
Pause0.100.100.150.10
Origin0.250.250.350.30

A component that cannot be computed (rhythm, with too few intervals) is left out and the remaining weights are renormalized. The result is multiplied by 100 and rounded to the nearest whole number.

The code is mwcn/scoring.py in the public repository.

Versioning

Each entry is scored once, at submission, with the version of the method then in force, and that version is recorded beside the score. Scores are never recomputed, because that would edit a published entry. When the method changes, the new version is described on this page alongside the old, and the raw figures let anyone rescore the whole corpus with any version they like.

What the score does not show

Keystroke dynamics has decades of use in continuous authentication and writing research, and current use in bot detection. Published attacks show that timing can be forged by a determined actor, and the signal confirms only that a person operated the keyboard, not that the person originated the text. Both limits are accepted. The goal is to make bulk automation tedious, not to police whether someone consulted a model before typing. A person who drafted with help and then typed it in is still a person choosing to say it.

The papers that informed the design:

Revision 1, effective September 24, 2026.