The short version: every existing typing site got at least one thing wrong, and the gap kept bothering me until building my own seemed easier than continuing to use theirs. The long version is what follows.
The state of typing tests in 2025
The category had three rough tiers. At the top, Monkeytype — the gold standard for personal practice, polished, fast, beloved by the speed-typing community. At the bottom, an endless gradient of ad-stuffed sites running on aging frameworks, full of upsells, popunders, and "create an account to see your score" walls. In the middle, a scattering of mechanical-keyboard-community forks that started strong and then went quiet within a year.
If you wanted a clean test for practice, Monkeytype already won. If you wanted something with races, leaderboards, social features, and a real progress system — without giving up the minimalist feel — your options were worse. TypeRacer had races but the interface felt 2009. 10FastFingers had everyone-types-the-same-prompt energy but was buried under ads and popups. Nitrotype had cars and gamification, which is a different product. Keybr was great at teaching you to touch type but didn't really hold your attention after you had.
What I wanted that didn't exist
The list, as I wrote it down at the time:
- A clean test — no chrome, no popups, no "next test in 5… 4… 3…" countdowns I didn't ask for.
- Real-time races with a shared prompt — type the same passage against a friend, watch live progress bars, no matchmaking queue.
- A daily challenge where everyone in the world types the same thing — the only way to compare progress over months without word-list luck variance.
- Server-verified badges and rank-tier achievements — the kind you can't fake from devtools.
- Anti-cheat on the leaderboard that wasn't just "we trust the client." Pasted text, autotyper rhythm, impossible WPM/accuracy combinations — all flagged automatically.
- Stats that mean something — per-key accuracy heatmaps, recent-run sparklines, real history. Not just "your best WPM is 87."
- Chat that didn't feel bolted on — global, DMs, mod tools.
- No required sign-in. The typing test itself should work for everyone, every time, no account needed.
- No data sale, no marketing pixels, no third-party fingerprinting SDKs. Pure subscription-and-donation business model.
None of these are revolutionary on their own. Most of them existed somewhere. The combination didn't.
The decision to not use a framework
I'd built enough React and Next.js apps to know that I didn't want to build this in React or Next.js. A typing test is one piece of state (the user's current keystrokes) reacting to one event stream (the keyboard). It does not benefit from a virtual DOM. It does not need component lifecycles, context providers, or hydration boundaries. The latency that frameworks insert between keypress and visible render is small but real, and on a typing test you can feel it.
So I made the call: vanilla JS, plain HTML, plain CSS, no build step. One `main.js` file. No bundler. No TypeScript. No npm packages on the client. Every change ships as text. The whole site is grep-able in 5,000 lines.
This was the right call. The app loads instantly, the typing feel is immediate, and a year later I can still hold the entire codebase in my head. The downside — a single big file that takes discipline to keep clean — is real but manageable. I've added linting habits, sectioned comments, and a small set of agent prompts that review changes before I push. The codebase is bigger than it would be in React, sure. It's also faster, simpler, and more debuggable.
What surprised me
Three things, in order of surprise:
1. How much of the work was anti-abuse, not typing
I figured I'd spend my time on typing engine, modes, and themes. In practice, half the line count is moderation, anti-cheat, rate limiting, dev-auth, abuse logging, and ban enforcement. Public typing tests attract a specific subset of clever users who think it would be funny to autopaste a 500 WPM run, and the only defense is layered: client-side detection, server-side validation, and human review with a real appeals process. None of that work is visible to legitimate users — which is exactly the point.
2. How much the daily challenge mattered
I almost cut the daily mode in the first month because it felt like extra surface area for a small audience. Then we launched it and it immediately became the most-used mode by people who care about real progress, because it's the only mode where the prompt is identical across users and across time. Every word-list run is contaminated by which words you got. The daily is the cleanest signal you have for "am I actually getting faster," and once you start comparing weekly daily scores, it's hard to go back.
3. How much chat became part of the product
I built chat as a "we should probably have one" feature. It turned into a real community — race invites, technique discussion, occasional drama. I had to build full moderation, AI-assisted content filtering, fuzzy keyword matching, and a strike system to keep it healthy. Chat is now where most of the dev-time goes that isn't going to typing. That wasn't the plan but I'm glad it happened.
What's coming
The shortlist of things actively in development, in no particular order:
- Shareable result pages — every finished test gets a unique URL with its own social image. Currently being prototyped.
- Aggregate stats page — "average WPM is X, top 10% is Y" backed by our own anonymized data. Capture is being wired up so we have months of data when the page launches.
- Two more arcade games — Bullet Storm and Boss Battle (currently beta-key gated). Falling Words variants with new mechanics.
- A widget for embedding the test on other sites. Lower priority — needs careful design so it doesn't feel like a banner ad.
- More aurora themes, sound packs, and a couple of overdue typing modes.
The thing I'm not doing is adding any feature that clutters the test surface itself. The typing area is sacred. Everything else has to fight for space in modals and popovers.
The boring acknowledgment
tempo wouldn't exist without Monkeytype, TypeRacer, Keybr, and 10FastFingers — every one of them shaped what tempo is and isn't. The category is well-served. If you're happy on another site, stay there. tempo isn't trying to be everything to everyone; it's the version I wanted to use, made public so other people who wanted the same thing can use it too.
If that's you, the site is at tempogames.net. Sign-in is optional. There are no ads for paying users, no ads with a Premium upgrade, no dark patterns. It loads in under a second on a normal connection. The test starts the moment you press a key.
That was the only thing I really wanted, and it's the only thing I won't change.