· 3 min read

A typing score is input, not proof

Why Typestrix re-checks every result on the server before it is saved: identity, arithmetic, the shape of the run, and your own history.

Shivank Pandey

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.

Step through it. A failure at any step stops the save with the same generic error.

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.

Keep reading