Speedtype Lab / Product notes
8 min readInside the Speedtype Race Bot: Pace, Progress, and Win Conditions
Understand the simulated race bot, its target WPM settings, pace variation, progress calculation, and the exact condition that ends a race.
Evidence checked: Race implementation and end-to-end behavior tests. Product behavior and limitations are described for the current release.
The race is a local simulation
Speedtype Race uses a simulated opponent running in the browser. It is not another person, a recorded user, or an adaptive model. Selecting 80 WPM asks the simulation to move at an average target pace derived from 80 five-character units per minute.
That distinction matters. Race is a pacing drill: it gives the user a moving reference and a finish condition. It is not evidence of how a real 80 WPM typist would handle a particular passage, punctuation pattern, language, or keyboard.
For a human-to-human event, use a private Multiplayer room instead. Multiplayer and Race have different infrastructure and should not be described as the same mode.
From WPM to on-screen movement
The current bot choices are 60, 80, 100, and 120 WPM. The simulation converts the selected target into characters per second:
Characters per second = selected WPM * 5 / 60
At an 80 WPM target:
80 * 5 / 60 = 6.67 characters per second
The bot updates every 100 milliseconds. On each update it advances by one tenth of the calculated per-second amount, modified by a small random pace change.
The underlying multiplier ranges from 0.9 to 1.1. That is approximately 10% below or above the selected target on an individual update. Although a source-code comment previously described a different percentage, the implemented arithmetic is the behavior documented here.
Random variation means repeated races at the same target do not have an identical bot trace. The selected value is a target around which the simulation moves, not a frame-by-frame guarantee.
What starts the bot
The race does not begin when the page opens. The timer and bot begin after the first accepted typed character.
This prevents the user from losing time while reading controls or positioning their hands. It also means that changing language, difficulty, or bot target before typing does not put the bot ahead. Each such change restarts the race state with a new passage.
The Restart button also clears:
- the current and completed input;
- attempted character count;
- start and end times;
- user and bot progress;
- the result dialog;
- the visible current-word field.
A restart selects another passage for the current language and difficulty.
Why wrong input stops visible user progress
The user progress bar is based on the length of the exact correct prefix. Speedtype compares characters from the beginning and stops counting at the first unresolved mismatch.
Suppose the passage starts:
Before going to the market
and the input starts:
Bed
The first two characters, B and e, match. The third target character is f, but the input contains d. The progress bar therefore reflects only the two-character correct prefix. Typing more text after the mismatch does not move the progress marker past an unresolved break.
This rule prevents a user from reaching the finish by entering the right number of unrelated characters. Correct the first mismatch, and the matching prefix can extend again.
The live error colors and WPM fields still use the shared scoring model. The case-sensitive grading note explains why B and b do not match.
Why the visible word clears after Space
Race uses a word-sized input field. When the current word exactly matches the current target word, Space or Enter commits that word, appends the passage space, and clears the visible field for the next word.
If the word is wrong, the commit is blocked. The field remains available for correction instead of advancing to a new word with an unresolved completed token. This is stricter than free-form practice input and is intended to keep the race aligned at word boundaries.
The passage display retains the completed state even though the small input field is empty. A completed word should therefore remain green in the passage while the field starts the next word. The earlier issue where a correct completed word did not clear was a functional defect, not intended behavior.
The finish conditions
The race ends as soon as either side reaches the passage end:
- The user finishes when the normalized complete input equals the normalized passage.
- The bot finishes when its simulated character position reaches the passage length.
If the user completes first while the bot is still short, the result is a user win. If the bot reaches the end while the user's passage is incomplete, the bot wins. Because browser timers run in discrete updates, a near-simultaneous finish should be treated as a pacing outcome, not laboratory timing.
The result is saved using the same summary fields as other Speedtype runs. A signed-in user can also send the run to configured cloud history. Race results identify the selected bot target in their mode value.
Choosing a useful target
Do not assume the highest option is the best practice setting. A target that ends the passage before you can establish controlled input may provide less information than a closer pace.
A repeatable approach is:
- Establish several practice runs under one language, difficulty, and duration.
- Look at net WPM and accuracy together.
- Choose the nearest race target that allows a meaningful portion of the passage.
- Run three races without changing settings.
- Note where your correct prefix stalls.
- Review whether the cause was reading, capitalization, punctuation, or a repeated letter pattern.
- Change one condition only after recording the observation.
The seven-session baseline provides a more controlled measurement protocol. Race can then be used as a separate pacing exercise rather than replacing the baseline.
What Race does not prove
The bot does not react to the user, learn from prior races, pause at difficult words, or simulate human correction behavior. Its random variation is not a model of fatigue or skill. The WPM label describes the configured movement formula.
Race also does not make passages equivalent. An English basic passage and a Marathi advanced passage can differ in script, input method, composition behavior, and reading demand. Compare like with like, as described in the English and Marathi results guide.
If the bot moves before the first character, a wrong word commits, Restart preserves old progress, or the user bar advances past an unresolved mismatch, submit the passage opening, settings, browser, and exact input through Feedback and Support.