Updates
Latest changes, features, and fixes on WPM.GG.
Friends, DMs, Ghost Mode & Alpha Badges
- NEW Friends — Add friends by username, see who's online, and manage requests from the new friends icon in the nav bar.
- NEW Direct Messaging — Chat privately with your friends via persistent DMs. Messages are saved so the conversation continues where you left off.
- NEW Ghost Mode — A gold ghost cursor races your personal best on any text you've typed before. Enable it with the Ghost Mode checkbox (default off) or use the dedicated Ghost game mode to pick any of your previous prompts and race yourself directly.
- NEW Alpha Tester Badge — Every account created during the alpha period now shows an α Alpha Tester badge on their profile. Thanks for being early!
- IMPROVED Persistent Chat — Global chat history now survives server restarts. The last 100 messages are always there when you join.
- IMPROVED Appearance Panel — Theme and font selector is now more compact and cleaner.
Error Tracking, Missed Keys & Polish
- IMPROVED Honest Error Tracking — Mistakes now count toward your heatmap and stats even if you backspace and correct them. Your error data finally reflects every key you struggled with, not just ones left unfixed at the end.
- NEW Missed Keys Breakdown — The results screen now shows which individual keys and short letter combinations (up to 4 characters) you missed most, replacing the per-word breakdown. Great for spotting specific letter sequences to practice.
- IMPROVED Feature Requests — The "Feedback" link has been renamed to "Feature Requests" throughout the site to better reflect what the page is for.
Themes, Fonts & Test Feel
- NEW Font Picker — Choose your typing font from 8 options: Default, Atkinson Hyperlegible, JetBrains Mono, Space Mono, Roboto, IBM Plex Mono, Fira Code, Inconsolata, and DM Mono. Font applies across the whole site including the test.
- NEW 5 New Themes — Laser (synthwave pink/cyan), Carbon (warm charcoal/orange), Nord (arctic blue-slate), Botanical (forest green), and Tokyo (deep dark red/yellow). Choose from the palette button in the nav.
- NEW Appearance Panel — Theme and font are now combined into one palette icon button in the nav that opens a compact selector panel.
- IMPROVED Typing Contrast — Correctly typed characters are now dimmed so your eyes naturally track the untyped text ahead. Errors remain full brightness with a red highlight.
- IMPROVED Auto-end Test — Standard and word-count tests now finish the moment you type the last character. No Enter press or button click needed — consistent with how Battle mode works.
Streaming Modes, Timing Fix & QoL
- NEW Streaming Word Modes — Timed and word-limit tests now pull from an infinite shuffled word pool (mix of common words + paragraph vocabulary) that flows in as you type. No more visible ending, no more mid-sentence cutoffs in these modes.
- NEW Consistency Score — Your results screen now shows a consistency % based on how steady your WPM was throughout the test.
- NEW Tab to Restart — Press Tab at any time during a test to immediately restart. Press Esc to close the results screen.
- FIX Daily Challenge Score Discrepancy — A timing bug caused daily leaderboard scores to be recorded lower than what was actually displayed on screen. The root cause was the server mixing its own clock with the client's end-time, creating drift when clocks weren't perfectly in sync. Daily now uses the same client-clock arithmetic as all other modes. Affected scores have been corrected retroactively and impacted players received 1,000 Sparks as compensation.
- FIX All prompts in standard, daily, and battle modes now end with a complete sentence — no more mid-sentence cutoffs.
v2.1 Technical Notes (Admin Only)
- Bug root cause:
startDailyChallenge() pre-set startTime = Date.now() before the user typed, and the server's /daily/addScore endpoint computed elapsedMs = endTime (client clock) − serverStartTime (server clock) — mixing two different clocks. The regular /addScore endpoint already used firstKeystrokeTime (client-only arithmetic) to avoid exactly this drift. Daily was never updated to match.
- Fix applied: Removed the
startTime pre-set from startDailyChallenge(). Daily now times from first keystroke like all other modes. firstKeystrokeTime is now included in the daily POST body. /daily/addScore now uses firstKeystrokeTime with the same fallback logic as /addScore.
- Retroactive correction: Startup migration
fixDailyScoresForTimingBug() reads all entries in daily.json with a userId, finds the closest matching entry in stats.recentGames (within ±90s), and if the WPM differs, updates the daily score, sets corrected: true + originalScore, awards 1,000 Sparks, and sends a personal notification. Entries are re-sorted after correction. Flag dailyTimingBugFixed_v1 prevents re-processing.
- Leaderboard display: Corrected entries show an adjusted badge with a tooltip showing the original score. This is only shown on the daily tab.
- Streaming modes:
initStreamMode(n) builds a shuffled pool from STREAM_WORDS (300 common words) + paragraphWords (unique words extracted from the Gist paragraph pool on load). Timed modes dynamically extend when within 80 chars of the buffer end. Word-limit modes pre-load N + 70 words — test still ends at N correct words. Paragraph container gets overflow:hidden + CSS gradient mask; scrollTop is managed each keystroke.
- Accuracy fix: Accuracy for stream mode now uses typed-length as denominator (not full buffer length) to prevent artificially inflated accuracy.
Feature Requests & Site Polish
- NEW Feature Requests — New page where you can suggest ideas and upvote your favourites. Top-voted requests get built first. Filter by status (Pending, Planned, In Progress, Shipped) or sort by Top / Newest.
- FIX Players-online hover tooltip now works on every page, not just the home page.
Global Chat & Polish
- NEW Global Chat — Logged-in players can now chat with anyone online site-wide. Chat bubble button in the lower-right corner. Messages persist across page navigation and show the last 100 messages on connect.
- NEW 100% Mode Persists — Your 100% mode preference is now saved and restored automatically across all pages and battle modes.
- NEW Customize Tab Preview — The Customize tab on your profile now shows a live player card preview that updates in real time as you change your gradient, title, and color.
- NEW Gradient Cards Everywhere — Full gradient player cards now appear in battle lobbies, standings, results, matchmaking, leaderboard ELO tab, and the nav badge.
- FIX Score shown on screen after a battle now matches what's recorded — client WPM is used when it's within a reasonable range of the server calculation.
- FIX Achievement icon colors standardized — all icons now use consistent stroke styling.
- FIX Toast notification order is now consistent — achievements always appear before daily bonus.
- FIX Daily challenge promo banner no longer appears during an active typing test.
- FIX Removed redundant "New Battle" button from post-matchmaking results screen.
Sparks, Shop, Gradients, Titles & Profile Customize Tab
- NEW Sparks Currency — Earn Sparks by completing daily challenges, logging in daily, and finishing your first test each day. Balance shown in the navigation bar.
- NEW Shop — Spend Sparks on cosmetic items via the Shop button in the nav. No real money — Sparks are earned through play only.
- NEW Gradient Backgrounds — 23 purchasable gradient styles including multi-layer cosmic designs, conic vortex, deep space star fields, plasma, prism, solar flare, holographic, and nebulae. Active gradient shows on your leaderboard entries and player card.
- NEW Shop Titles — 12 purchasable titles (Typist, Swift, Phantom, Racer, Keymaster + 7 space-themed: Cosmonaut, Stardust, Nebula, Void Walker, Supernova, Celestial, Galactic) displayed next to your name.
- NEW Customize Tab — New tab on your Profile page to equip username color, display title, and gradient without leaving your stats.
- NEW Player Cards — Hovering registered usernames anywhere on the site shows a card with their WPM, ELO, streak, and equipped gradient.
- FIX Battle WPM inflation fixed — scores no longer spike when client and server clocks diverge.
- FIX Guest battle results no longer affect ELO gain/loss for registered players.
- FIX Terminal and High Contrast themes now use readable text colors matching the main dark theme.
Results Modal, Live Leaderboards & UX Polish
- NEW Results Modal - Your results now appear in an overlay modal instead of a separate section. Dismiss with ✕ or click outside to return to the leaderboard immediately.
- NEW Live Leaderboard Updates - All leaderboard tabs refresh automatically the moment you finish a test — no manual reload needed.
- NEW Players Online - A live counter in the bottom-left shows how many unique visitors are currently on the site.
- NEW Donor Support Flow - Clicking the ☕ donate button now shows a modal explaining how to link your username to your Buy Me a Coffee support for automatic badge assignment.
- FIX Enter key in sign-in form now moves focus from username to password field, then submits on second press.
- FIX Clicking outside any modal now closes it.
- FIX All-time leaderboard now correctly shows best score per player with a label indicating this.
- FIX Leaderboard entries now accept up to 100 scores (was capped at 10 on all-time and period tabs).
Donor Badges, Admin Crowns & AdSense
- NEW Donor Badge - Support WPM.GG on Buy Me a Coffee and receive a ☕ badge next to your name across the site.
- NEW No Ads for Donors - Donors have ads automatically suppressed as a thank-you.
- NEW Admin Crown - Site administrators display a gold crown (👑) next to their username.
- NEW Floating Donate Button - Coffee cup button in the lower right corner links to Buy Me a Coffee with instructions for claiming your badge.
- NEW Bug Report Button - Found something broken? Use the 🐛 button in the lower right to send a report directly.
- NEW Google AdSense integrated for non-donor visitors.
Achievements, Titles, Colors & Account Settings
- NEW Achievement Titles - Unlock titles through achievements and equip them in Account Settings. Each title has a unique color displayed next to your name everywhere.
- NEW Username Color - Registered users can now choose a custom username color in Account Settings.
- NEW 37 Achievements - Expanded achievement system across WPM milestones, battle wins, streaks, ELO tiers, and special categories like Night Owl and Underdog.
- NEW Password Reset - Link an email in Account Settings and use it to reset your password securely.
- NEW Password Strength Rules - Live green/red indicators while typing your password during registration and password changes.
- NEW ELO Overhaul - Multi-opponent ELO now sums pairwise results. Beating a high-ELO opponent gives proportionally more ELO.
- FIX Average WPM calculation corrected — was sometimes showing higher than best WPM.
- FIX Accuracy now fully affects score — spamming random words in battles no longer gives a score floor.
- FIX Match history no longer double-logs the same game.
Matchmaking & Persistent Sessions
- NEW Matchmaking - Queue up and get matched with a real opponent automatically. If no one's available after 15 seconds, you'll face a bot tuned to your ELO.
- NEW Smart Bot ELO - Matchmaking bots are dynamically created within ±50 ELO of yours with interpolated WPM targets.
- NEW Match History - All results logged to your profile with ELO gain/loss, placement, and opponent info.
- NEW Leave Penalty - Abandoning a match mid-game places you last and deducts ELO accordingly.
- FIX Sessions now persist through server restarts — you stay signed in.
- FIX Two players in queue now correctly match with each other instead of both getting bots.
ELO Ranks, Leaderboard Tabs & Daily Challenge
- NEW ELO Rank System - Eight tiers: Wood → Bronze → Silver → Gold → Platinum → Diamond → Emerald → Legend, each with a unique colored star.
- NEW Leaderboard Tabs - Filter scores by All Time, Monthly, Weekly, Today, Daily Challenge, and Account ELO.
- NEW Daily Challenge - One paragraph per day, resets at midnight Pacific. Compete for the top daily score.
- NEW Server-side WPM validation in battles — client scores can't be spoofed.
- NEW Rank icons shown next to player names in lobby, standings, and results.
Battle Mode & Bot System
- NEW Battle Mode - Real-time multiplayer typing races via WebSocket. Share a room link or add bots to fill the lobby.
- NEW Eight Bot Tiers - Wood to Legend with realistic WPM ranges per tier.
- NEW Lobby chat, host controls, rematch system, and live race progress bars.
- NEW Share your result with a URL that replays the outcome.
Initial Launch
- NEW Typing speed tests with server-validated WPM and accuracy tracking.
- NEW Global leaderboard — play as a guest or register for a persistent account.
- NEW Profile page with WPM history chart, key error heatmap, and word breakdown.
- NEW Four themes: Dark, Light, Terminal, High Contrast.
- NEW Multiple test modes: Standard, Timed (15/30/60/120s), Word Count (25/50/100), Custom text, Practice.
- NEW Daily typing streak tracking.