A browser-based virtual keyboard and typing practice platform that lets you type in 100+ languages instantly — without installing anything.
Features:
- 🌍 100+ keyboard layouts across Latin, Cyrillic, Arabic, CJK, Indic, and more
- ⚡ Multilingual typing speed test with real-time WPM and accuracy tracking
- 🔤 Phonetic typing for major languages (type transliterated text on your QWERTY keyboard)
- 📝 Name transliteration across 30+ scripts
- 🔒 Privacy-first — all typing happens locally in your browser
- ♿ Accessible — WCAG-compliant with keyboard navigation, screen reader support, and reduced-motion respect
👉 Live app: anykeyboard.io
A comprehensive deep-dive audit was completed across 5 dimensions, resulting in 40+ fixes shipped in a single session:
| Dimension | Before | After | Key Improvements |
|---|---|---|---|
| Security | 7/10 | 9/10 | 0 vulnerabilities, tightened CSP, SRI on analytics, API auth |
| Performance | 4/10 | 7/10 | ~600 KB less per page, browser caching, ISR, font optimization |
| Code Quality | 4/10 | 8/10 | -15K lines removed, consolidated locale variants, modular JS |
| UI/UX | 5/10 | 7/10 | RTL support for 10 languages, theme detection, loading skeletons |
| Accessibility | 3/10 | 7/10 | Skip navigation, ARIA labels, focus management, reduced motion |
Overall: 4.9/10 → 8/10
Performance
- Removed forced re-download of 345 KB layout bundle on every navigation
- Dynamic font loading — each keyboard page only loads fonts for its script (saves 200-400 KB)
- CSS minification added to build pipeline
- Cache-Control headers for all static assets
- Incremental Static Regeneration (ISR) on 7 page types
- Typing sentences split from 1 monolith (49 KB) into 78 per-language files
Security
- Patched all 6 npm dependency vulnerabilities (0 remaining)
- Added Subresource Integrity (SRI) hash on third-party analytics
- Added authentication + rate limiting to IndexNow API endpoint
- Added
.envfiles to.gitignore - Restored and documented CSP policy requirements
Code Quality
- Consolidated 14 locale-specific hub page variants into 1 parameterized component (-10,000 lines)
- Consolidated 15 locale-specific footer variants into 1 component (-1,650 lines)
- Converted 32 copy-paste utility pages into 1 dynamic route (-1,100 lines)
- Refactored keyboard page to single source of truth (792 → 219 lines)
- Modularized 2,500-line vanilla JS runtime into 5 focused ES modules
- Centralized
SITE_URLfrom 18+ independent definitions to 1 - Extracted shared error boundary component
- Deleted orphaned files and analysis artifacts
- Added ESLint (next/core-web-vitals) + Prettier
UI/UX
- Defined 9 missing CSS custom properties (light + dark themes)
- Added 40 RTL CSS overrides for proper Arabic/Hebrew/Urdu/Persian layout mirroring
- Added OS
prefers-color-schemedetection (respects system theme preference) - Added keyboard loading skeleton and pre-populated layout selector
- Fixed RTL
dirattribute detection for 10 RTL languages - Added global error boundary for crash protection
Accessibility
- Added skip-to-content link on every page (WCAG 2.4.1)
- Added
aria-labelto all 50+ virtual keyboard keys including special keys (WCAG 4.1.2) - Added global
prefers-reduced-motionrule disabling all animations (WCAG 2.3.3) - Fixed textarea
lang/dir— now dynamic per keyboard instead of hardcoded Arabic - Audited 23
outline: noneinstances, fixed 9 missing focus indicators (WCAG 2.4.7) - Added mobile menu focus trap with Escape key handler (WCAG 2.4.3)
- Fixed
role="menu"misuse andaria-pressed→aria-selectedtab pattern - Added
langattributes to foreign-language hero text (WCAG 3.1.2) - Added
aria-labelto all search inputs and<main>landmarks to 17 pages
- Framework: Next.js 15 (Pages Router)
- Deployment: Vercel
- Rendering: 100% Static Generation (SSG) with ISR
- Styling: CSS custom properties with dark/light theme support
- Analytics: Umami (self-hosted, privacy-first)
- SEO: Custom pipeline with JSON-LD, hreflang, sitemap generation, IndexNow
