I Added XP and Levels to a Typing Test
TypeVelocity now has an XP system. 50 levels, a slow grind, and a progress bar that shows up in your results after every run. Here's what I built, why I built it this way, and the decisions that went into making it feel like it means something instead of just being a number that goes up.
The problem with most typing test feedback
Most typing tests give you a WPM number and a grade and that's it. You close the tab. There's no sense of accumulation — no record of the fact that you've been showing up and putting in runs. Your 200th game looks exactly like your 1st game from the interface's perspective.
TypeVelocity already had a rank system (Snail → Turtle → Walker → Jogger → Runner → Sprinter → Speed Demon → Velocity King → Velocity God) based on your best WPM. It already had daily streaks, a ghost race, 35 badges, and a profile page with a performance graph. But none of that captured the grind itself — the fact that you've been here, consistently, putting in runs even when the numbers weren't moving.
XP is supposed to capture that.
The formula
XP per run is calculated as:
base = WPM × accuracy%
Then multiplied by difficulty: Baby mode gives 0.8×, Standard gives 1×, Hard gives 1.5×. Daily Challenge gives 2× on top of that.
So a 60 WPM run at 95% accuracy on Standard gives you 57 XP. The same run on Hard gives 85 XP. The same run as part of the Daily Challenge on Hard gives 171 XP.
The formula rewards both speed and accuracy together, not one at the expense of the other. A 100 WPM run at 70% accuracy gives less XP than a 70 WPM run at 98% accuracy. That's intentional — sloppy fast typing shouldn't be the optimal path.
Why the grind is slow on purpose
The XP curve is steep. Level 1 to 2 costs 500 XP. By the time you're in the 40s, each level costs 18,000 XP. Total XP to reach level 50 is around 300,000.
At 60 WPM on Standard, you earn roughly 57 XP per run. That means level 50 takes thousands of runs. It's not something you reach in a week. It's not something you reach in a month. It's a long-term record of how much time you've actually spent here.
I made it slow deliberately. Fast XP systems feel hollow — you level up constantly and the levels stop meaning anything. A level system where level 20 represents months of consistent play means something. When you see someone at level 30, you know they've been here a long time. That's the point.
The early levels are reachable quickly enough to feel like progress. Level 5 takes a few sessions. Level 10 takes a week or two of daily play. After that it slows down and stays slow.
The rank system stays separate
The existing WPM rank (Snail through Velocity God) is still there and still based on your best WPM. I kept them separate on purpose.
WPM rank answers: how fast are you? It's a skill indicator. It's honest and immediate.
XP level answers: how long have you been here? It's a grind indicator. Someone can be level 20 and still be a Jogger — that's interesting, not broken. A level 1 Velocity God is also interesting. They're fast but new. The two numbers tell different stories and combining them would lose one of those stories.
The achievement overlay
TypeVelocity has had 35 badges since the last update. The problem was that badge unlocks were easy to miss — they showed up as small chips inside the results modal, which you might scroll past or not notice at all.
The new overlay is hard to miss. When you unlock a badge, a full-screen dark backdrop appears with the badge icon centered, the name, and the description. It stays for 2.6 seconds, then fades. If you unlock multiple badges in one run, they queue and show one at a time.
The chips still appear in the modal too, so you can see them after the overlay fades. The overlay is for the moment. The chips are for the record.
The encouragement system
The results screen has always shown a short message after each run — a grade-based roast, basically. I replaced the static lookup with a context-aware system that reads the actual situation before picking a message.
Priority order: level-up messages first, then new personal best, then daily challenge completion, then streak milestones, then grade. The messages are dry and honest. No "great job!" No exclamation marks on bad runs. If you leveled up, it says something about the level. If you set a record, it says something about the record. If you had a rough run, it says "rough one. next." and moves on.
A few examples of what actually shows up:
- "level 10. double digits. the keyboard respects you now."
- "new record. don't celebrate too long. run it again."
- "daily challenge complete. same time tomorrow."
- "rough one. next."
- "7 days straight. don't break it over nothing."
The tone is the same as the rest of the game — it doesn't talk down to you and it doesn't hype you up artificially. It just tells you what happened.
What's next
The XP system is the foundation for a few things I want to build next: level-gated features, a streak freeze mechanic, and eventually a "beat yesterday's daily challenge score" ghost. The level number also shows on the profile page with a progress bar, so you can see exactly where you are in the grind.
If you want to see where you land, run a few tests and check your profile. The XP starts accumulating from your next run — it doesn't backfill from old games, so everyone starts at level 1 from here.