deltras

KeyType - Free typing speed test & WPM trainer — no sign-up, no ads

by•
keytype is a free typing speed trainer that runs entirely in your browser — no account, no ads. Pick a mode: Test your WPM in 30/60/120s, Learn touch typing with adaptive key unlocking, practice with famous Quotes, or drill Code symbols. 11 languages, live keyboard visualization, daily streaks, personal bests, and 6 themes. Also ships as a native desktop app for Windows, macOS, and Linux.

Add a comment

Replies

Best
deltras
Maker
šŸ“Œ
šŸš€ keytype.pro — What We Built & Shipped Big update to [keytype.pro](https://keytype.pro) — a free, no-signup typing speed trainer. Here's everything that landed: šŸ New domain Migrated from Vercel preview URL to **keytype.pro** — updated canonical tags, Open Graph, Twitter cards, JSON-LD structured data, sitemap, robots.txt, and the share button all in one go. šŸ³ļø SVG Language Flags Replaced broken emoji flags (showed as "GB", "RU" etc. on Windows and in the Tauri desktop app) with hand-crafted inline SVG flags for all 11 languages — EN, RU, DE, FR, ES, IT, PT, PL, TR, NL, SV. Vector, no font dependency, works everywhere. ⚔ Performance — INP from ~200ms to <50ms Four input-handler optimizations: - Built a `charEls[wi][ci]` O(1) element map — eliminated `querySelector` on every keystroke - `badCounts[wi]` counter — no more DOM scans on backspace - `_cssZoom` cache + `_nxEl` ref — no repeated `getComputedStyle` or key-highlight iteration - Replaced all `offsetWidth` / synchronous `getBoundingClientRect` reads with `requestAnimationFrame` — zero forced reflows in the hot path šŸ” SEO - Added Yandex Webmaster verification file + meta tag - Fixed hreflang: removed duplicate `en`/`ru` tags pointing to the same URL (single-page app = one URL), kept only `x-default` — this was triggering a GSC/Yandex error - Added `sameAs` to JSON-LD structured data - Font preloads (`jbm-latin.woff2`, `sg-latin.woff2`) added before all other resources to eliminate render-blocking font discovery **♿ Accessibility — 89 → ~95/100** - Language dropdown: `aria-label`, `aria-haspopup`, `aria-expanded` (synced via JS on open/close), `role="menu"` + `role="menuitem"` on all items - Hidden typing input: `aria-label="Type the displayed text"` - Close button, volume slider, punctuation/numbers toggles: all properly labeled šŸ› Bug fixes - Language dropdown was rendering *behind* the word display and keyboard — root cause was `zoom: 1.35` creating a stacking context, fixed by giving `nav-bar` an explicit `z-index` as a flex child - Focus mode animation fill-mode cascade issue fixed - Cursor positioning under CSS zoom corrected (`getBoundingClientRect` returns screen-space px; divide by zoom factor for layout px)