Daily typing practice: how our streaks work without burning you out

Daily typing practice works best when the daily minimum is small. On this site a streak needs one validated test per UTC day, and a 30-second test counts the same as an hour. We built it that way because a typing practice streak should keep you coming back without turning into a chore you resent.

The feature we argued about longest wasn't the race track or the anti-cheat. It was the streak.

Streaks work. Anyone who has used a language app also knows the feeling of opening it at 11:50 pm to type one sentence so the number doesn't reset. We wanted the first without the second. Here are the decisions, with the numbers, so you can judge whether we got it right.

What counts toward a typing streak?

A streak is the number of consecutive days with at least one validated test. One. A four-minute session extends it the same as an hour, and nothing you do later in the day changes it. Zen mode doesn't count, because zen results are never uploaded and we didn't want a mode with no measurement to carry a habit metric.

Days are UTC days, the decision we expect the most questions about. The reasons, and the cost, are further down.

The nudge, and what it doesn't do

When your last counted day is yesterday and you haven't typed today, the streak is "at risk", and the streak chip on the home page says so. That's the whole nudge. There's no notification, no email, no red badge on an icon, unless you've opted in to the weekly digest, which mentions your streak once a week in a line of plain text.

This was deliberate, and it probably costs us some returning visitors. Streak-loss push notifications are a common re-engagement tool in habit apps, and in our experience one of the most resented. Our plan said "no streak-loss notifications unless opted in", and we held to it.

If a result arrives backdated before your last counted day (a wrong laptop clock, an offline result syncing late), we count the test and leave the streak alone. Clock skew shouldn't cost anyone a hundred days.

How XP and levels are calculated

XP is the practice-time currency. It's deliberately not a ranking, for reasons that come later.

For every validated, non-zen test:

  • Base XP is 2 per second of active typing, scaled by accuracy. Thirty seconds at 95% is 57 XP. "Active" means the credited duration minus away-from-keyboard seconds, so leaving the tab open doesn't earn anything.
  • Credit is capped at 600 seconds per test, so a thirty-minute test earns the same base as a ten-minute one and marathons don't dominate.
  • Multipliers are added together: +50% for 100% accuracy, +50% for a quote test, +40% for punctuation on, +10% for numbers on. A perfect quote with punctuation runs at 2.4×.
  • Flat bonuses: +50 for the first test of the UTC day, +50 for a daily challenge attempt, +25 for a race and +25 more for winning it, +20 for a personal best.

Levels follow a gentle curve: the XP to go from level L to L+1 is 100 × L^1.3. Added up, level 2 arrives after 100 XP, level 5 after about 1,370, level 10 after about 7,700, level 20 after about 40,300 and level 50 after about 343,000.

To put level 50 in practice terms: a perfect 30-second test earns 90 XP before bonuses (60 base, plus 50% for perfect accuracy), so it's about 3,800 of those. Fifteen minutes a day at 95% accuracy earns about 1,760 XP with the first-test bonus, which reaches level 50 in roughly six to seven months. Level 100 needs about 1.7 million XP. The level names run from Newcomer through Typist, Keysmith and Wordsmith to Legend at 50 and Immortal at 100, and yes, the top of that list is a little silly on purpose.

As a guest, your browser applies the same rules to a local copy. Signing in is what keeps a streak and a daily ranking on an account, and if you sign in with a fresh account the local progress merges once, capped at 5,000 XP, 500 tests and a 30-day streak. The cap exists so the merge can't be used to manufacture a record; it's also why a signed-in account is the only way to a 100-day badge.

Streak milestones are at 3, 7, 14, 30, 60, 100, 180 and 365 days, with badges at 3, 7, 30, 100 and 365. The 365 badge is the one we expect almost nobody to earn, and that's the point of it.

Why the streak is built this way

Five rules shape the streak. Each came from asking what a habit metric should reward.

No volume points in the rankings

XP measures time spent, so it rewards volume. Take two typists. One types at 60 WPM and does a single 30-second test a day at 98% accuracy, which earns about 59 XP, plus the 50 first-test bonus, so roughly 110 a day. The other types at 45 WPM and practices fifteen minutes a day at 95%, which earns about 1,760. The slower typist earns sixteen times as much.

That is the right answer for a practice currency, because time on the keys is the thing practice needs. It's the wrong answer for a ranking, which should say who types fastest and cleanest. An XP board would put the second typist first, and the way to climb it would be to add minutes.

So XP never ranks anyone. The leaderboards rank speed, with an accuracy floor; XP shows on your results and your profile, never on a board. The same logic sets the race results screen: place, WPM and accuracy come first, and the XP line is small and underneath.

Nothing to buy

There's no currency to spend, no shop, no cosmetic upgrade and nothing that decays if you don't log in. A streak is a record of days you practiced. Once any part of it can be bought, the number means "practiced, or paid", and it stops telling you anything. A store also gives the site a reason to make you anxious about losing progress, because anxiety is what sells protection. We didn't want that incentive in the code.

No paywalled history

Your history is unlimited and free, and the streak never depends on anything you'd pay for. The streak exists to produce the 90-day trend on your history page, and that chart is the only honest test of whether the habit is working. Locking old results away would hide the plateau you most need to see.

No loss screen

When a streak breaks, which it will, the chip says 1 and your best-streak number stays. There's no offer to restore it.

Habit research supports going easy here. In a University College London study led by Phillippa Lally, forming a new habit took an average of 66 days for the participants the researchers could model, and missing one opportunity "did not significantly impact the habit formation process". Treating a missed day as a disaster teaches people the habit is fragile, and some quit rather than start again from 1.

We considered a "streak freeze" like the language apps sell, and decided that making a lost streak feel like a missed purchase was what we were trying not to build.

UTC days

The day boundary has to be the same for everyone, or the leaderboards and the daily challenge can't share it. With local time, the daily quote would change at a different moment for every visitor, and the "fastest today" list would compare different days. UTC is the one boundary a server can compute without asking the browser.

The cost is that for a typist in California the day rolls over at 4 or 5 pm, and for one in Delhi at 5:30 am. We considered a per-account hour offset and decided against it for the first version: it adds a rule to explain, and a streak that needs a paragraph of explanation is already losing. The daily challenge countdown shows how long is left in the current day. If we revisit this, it'll be a one-time offset, and this note will say so.

How often should you practice typing?

Set the minimum low. A streak that needs fifteen minutes dies on the first busy day; on a bad day, one 30-second test is enough. The 40 to 80 WPM practice plan is built around this: the full session is fifteen minutes, the floor is one test.

Don't chase the first-test bonus at midnight. The +50 exists so a short session is worth it, not so you stay up. If it's 11:55 pm UTC and you're tired, the streak is worth less than the sleep.

Use the daily challenge as the default session. It's one quote, it usually takes under a minute, and its board resets every day, so the top is reachable. Gamification designer Yu-kai Chou makes the same case: "A standard first-place-to-last-place ranking only energizes a small group near the top", and he suggests matching the reset to how often people act, daily for frequent actions.

Watch the trend line, not the streak. The 90-day chart on your history page is what the streak is for. If the line is going up, the streak did its job even if it breaks. If the line is flat for a month, the streak is keeping you typing without making you faster, and that's the signal to open the weak-key drill in practice instead of the usual test.

What we're watching

We don't have retention data to publish yet. When we do, the question is whether people who keep a 30-day streak are getting faster by the 90-day trend, or just keeping a streak. If it's the second, the design is wrong, and the first change would be to make the daily challenge the thing that counts.

Frequently asked questions

How often should I practice typing?

Little and often beats occasional marathons for keeping a habit. Our streak asks for one validated test a day, and the practice plan suggests fifteen minutes when you have them and one short test when you don't.

When does the daily streak reset?

At midnight UTC. The daily challenge countdown shows how many hours are left in the current UTC day, so you can see when "today" ends wherever you live.

Does the daily challenge need perfect accuracy?

No. You can play as often as you like and your best run counts, but a run is ranked on the daily board only at 90% accuracy or better.

Sources