A typing test runs in the browser. The timer, the keystrokes and the final numbers are all produced on a device the player controls. Client-side rules like the anti-hold guard and word lock make honest typing feel right, but they cannot make a submitted score trustworthy. Anything the browser sends can be edited before it arrives.
So every result is treated as a claim. Before it reaches the database or the leaderboard, the server checks whether the claim is believable.
Four questions before a save
Pick a step, or use the arrows, to walk through the diagram.
Make the numbers agree with each other
The most useful checks are not clever. A typing result is a small system of equations: net speed comes from correct characters over time, raw speed from all characters over time, accuracy from correct over typed. A real test produces numbers that satisfy those relationships. A hand-edited result usually breaks at least one, because changing one number honestly means changing several others in step.
There is also a physical ceiling. No one types a passage faster than a certain pace, so a duration that is too short for the characters it claims is rejected, whatever the other numbers say.
Check the run, not just the headline
A headline number can be made to look reasonable. The per-second chart is harder to fake well. The server checks that it moves forward in time, that the speed it implies never grows faster than a person could type, and that it lines up with the final duration. A curve that is too smooth to be human is also a signal.
These checks share code with the browser. The same scoring function runs in both places, but the server only has the result and its chart; keystroke timings never leave the device. So the server judges what it can see, and nothing more.
Compare people with themselves
A global rule cannot tell a world-class typist from a cheater. Their own history can. Once someone has enough saved results for a mode and length, the server compares the new score against their recent ones. Steady improvement passes. A sudden leap far outside their normal range does not.
The comparison is deliberately forgiving: the expected spread has a floor, so a very consistent typist is not blocked for having a good day.
Say less when rejecting
Every failed check returns the same message: the result is invalid. It does not say which rule failed. Explaining the reason would turn the error into a tuning tool for anyone trying to craft a fake result.
What this does and does not prove
These checks establish that a result is plausible: internally consistent, physically possible, and in line with the player's own history. They do not prove a person typed it. The server never sees the keystrokes, and the passage is generated in the browser.
That is the honest boundary of a browser-based typing test. Proof would need a different protocol, such as passages issued and timed by the server. For a free practice site, plausibility checks keep the leaderboard meaningful without making the test slower for everyone.
Next, read how accepted scores become Redis personal bests.