If you have a question which is not mentioned here, please contact via email: [email protected]
GDPR / DSGVO
For your questions regarding the General Data Protection Regulation we have created this specific FAQ: GDPR / DSGVO FAQ (TODO: update link v3)
WPM - words per minute
WPM-calculation is based on the following calculation: 5 keystrokes equal 1 WPM, if you don't believe me, check Wikipedia about Words per minute :)
What is a keystroke?
Every key you hit on the keyboard to type a letter is one keystroke. The calculation also considers if you have to type uppercase letters or language specific letters who need 2 keystrokes to be typed (for example "A"). For example "quick" needs 5 keystrokes whereas "America" needs 8 keystrokes.
My results are not visible (in the competition)
You probably have to unlock your result by completing the anti-cheat-test. At the top of the page your should see 'notifications', clicking on it you will be able to participate in an anti-cheat-test.
My scores over 120 WPM are not visible
If you receive a result over 120 WPM you have to unlock it with an anti-cheat-test. Click on the speech bubble at the top of the site to check for notifications.
Translation - How can I help?
If you would like to help translate 10FastFingers into your language, please take a look at the translation page.
How do you know which language specific characters need more than 1 keystroke?
TODO: still accurate?
All languages: all uppercase letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)
Catalan:
2 keystrokes: à è ò é í ó ú Ç ! " · $ % & / ( ) ? ¿ @ # € ; : [ ] { } \
3 keystrokes: À È Ò É Í Ó Ú ï ü
4 keystrokes: Ï Ü
Chinese and Japanese:I currently just quintuple the characters. For example: "明年" will count as 10 keystrokes.
The average WPM on 10fastfingers is 42 WPM. This number is extracted from over 14 million tests, spread out over 41 languages.
How is the accuracy calculated?
TODO: still accurate?
For the calculation of accuracy (used in the text practice mode) the amount of mistakes made and the number of corrections used is taken into consideration.
Imagine a text requiring exactly 500 keystrokes. There are 4 possible cases:
0 wrong word and 0 correction: 500 correct entries out of 500 = 500/500 * 100 = 100% accuracy.
0 wrong word and corrections: e.g. 500 correct entries and 25 corrections = 500/(500+25) * 100 = 95,23% accuracy.
Wrong words and 0 correction: e.g. 10 wrong words worth 450 correct entries out of 500 = 450/500 * 100 = 90% accuracy.
Wrong words and corrections: e.g. 10 wrong words worth 450 correct entries out of 500 and 25 corrections = 450/(500+25) = 85,71% accuracy.
Thank you Linsk for coming up with this :)
How are the score/points in the Text Practice Mode calculated?
TODO: still accurate?
Everytime you complete a text you get a score, here is how it is calculated:
The number of correct keystrokes is multiplied with the accuracy, for example: 500 (correct keystrokes) * 1.0 (100% accuracy) = 500 (acc_points)
This value (acc_points) is now multiplied with the milliseconds needed divided by 60000 milliseconds. Lets say it tooks us 60 seconds to get 500 correct keystrokes: 500 / (60000 / 60000) = 500 (acc_time_points). This calculation integrates the time into our score, the faster you type correct and accurate, the higher your score.
This value (acc_time_points) is now multiplied by all keystrokes the text consisted of divided by 500. Lets say the whole text consisted of 500 keystrokes: 500 * (500 / 500) = 500 (acc_time_length_points). This last step will give longer texts an edge over very short texts (below 500 keystrokes). This is needed or otherwise very short texts would be the best way to gather points.
Here is another calculation, this time with slightly different values:
If same CPM/wrong words: the lowest corrections wins.
If same CPM/wrong words/corrections: the earliest test taken wins.
How can I delete my account?
Log into your account, go to your settings page, click on 'account' and at the bottom you will find a 'Delete Account' link. Be aware that once your account has been deleted, it can't be restored and you have to create a new one. Once your account has been deleted, you won't be able to create a new account with your previous email address for 30 days.
Translations
#TODO: add links
Would you like to help translate 10FastFingers into your language? Join our project on Localazy.com and contribute to making the platform more accessible to users worldwide!
Getting Started
Sign Up & Access
Create an account on Localazy and log in.
Search for the 10FastFingers project and request access.
Once approved, you'll see a dashboard displaying available languages and their translation status.
Missing Your Language?
If your native language isn't listed, no worries! Just send me a message on Discord, and I'll add it for you.
How to Translate
Select Your Language
Choose your preferred language and start translating.
You'll be presented with English phrases that need translation.
Enter Your Translations
Type your translation in the provided space.
If a suggested translation appears at the bottom, feel free to use it if it fits.
Click Save Translation to confirm and move to the next key.
Informal Tone
Please use an informal approach (e.g., in German, use "Du" instead of "Sie"). This may vary by language, so choose the most natural informal form.
Need Help?
If you’re unsure about a phrase, you can skip it for now. Feel free to ask for help by posting your question or the specific key in Discord—we’re here to support each other!
Advanced Stats
Glossary
Words: a full word with a space (the space locks in the word-input), e.g.: "house "
Chars: expected chars, regardless of composed, upper- or lowercase, e.g.: "a" is one char, "A" is another char
Keystrokes: sum of expected keystrokes per char (calculated based on keystrokesDictionary), e.g: "a" is one keystroke, "A" is two keystrokes
UserInput: actual user input from input field, with upper-, lowercase and accents etc. TODO example
Keys: actual typed keys, with all possibly typed extra dead (non-visible) keys, TODO example
Correct Words: Words that were finished without errors, e.g.: "house" TODO: is the space included?
Correct Chars: "a" and "A" each count as one
Correct Keystrokes: "a" counts as one, "A" counts as two
Wrong Words: Number of words that had at least one error, e.g.: if the word is "house", both would count as one wrong word: "hoise" and "eeeee"
Wrong Chars: see above
Wrong Keystrokes: see above
Spaces: the number of spaces you typed
Corrected Chars: Characters you typed incorrectly but corrected
Corrected Keystrokes: Keystrokes you typed incorrectly but corrected
Missed Chars: Characters you didn't type, e.g.: "house" is the word and you typed "hous"
Missed Keystrokes: Same as "missed chars" but on a keystroke basis, if the word is "ALERT" and you typed "ALER", this would count as two missed keystrokes
Extra Chars: if you typed more than necessary, e.g.: "house" is the word and you typed "houses"
Extra Keystrokes: same as extra chars
Total Keys: #TODO example
Total extra Keys: #TODO example
WPM Raw: Sum of all chars and spaces of all words, regardless of correct or wrong, per minute divided by 5.
Duration in Seconds: for a typing test and competition this value should be 60 seconds, for text practice and multiplayer mode this number will vary
Pace: #TODO example
CPM: #TODO example
CPM Raw: #TODO example
KPM: #TODO example
KPM Raw: #TODO example
Consistency: #TODO example
Calculations
Following calculations are made in V3. Listed here as basis for discussion:
WPM (Words per minute) Sum of all expected keystrokes and spaces of all correct words calculated per minute divided by 5 (arbitrary word length).
Consistency Typing consistency over time resp. average deviation on keys amount per second.
const kpmRawArray = keysPerSecondArray.map((k) => Math.round((k / 5) * 60))
const keysPerSecondDeviation = stdDeviation(kpmRawArray)
const keysPerSecondAvg = mean(kpmRawArray)
stats.consistency = Math.round(
calcConsistency(keysPerSecondDeviation / keysPerSecondAvg)
)
/**
* This code calculates the standard deviation of an array of numbers.
* The first two lines store the length of the array (n) and the mean of the array in two variables.
* The last part calculates the standard deviation by mapping each number in the array to the difference between it and the mean,
* squaring the result, and then calculating the average of all the results. The final result is the standard deviation.
*/
export function stdDeviation(array: number[]): number {
try {
const n = array.length
const mean = array.reduce((a, b) => a + b) / n
return Math.sqrt(
array.map((x) => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n
)
} catch (e) {
return 0
}
}
/**
* Returns the average (mean) of an array of numbers as a single number.
*/
export function mean(array: number[]): number {
try {
return (
array.reduce((previous, current) => (current += previous)) / array.length
)
} catch (e) {
return 0
}
}
Score Sum of correct chars and accuracy as a second measurement when same WPM