Online Hindi Typing Test – Improve Your Speed and Accuracy

Typing Test / टाइपिंग टेस्ट

T Test Timer / समय
01:00

Target passage / मिलान पाठ

भारत एक विशाल और विविधताओं से भरा देश है। यहाँ अनेक भाषाएँ, धर्म और संस्कृतियाँ एक साथ पनपती हैं। हमारा देश अपनी सभ्यता और परंपराओं के लिए पूरे विश्व में प्रसिद्ध है।
Words: 0 Characters: 0
Custom passage & favorites ▼
Upload a .txt file (optional) to auto-fill.
Tip: keep passages 1–3 paragraphs for the smoothest experience.
Evaluating Automatically / स्वतः मूल्यांकन

Shortcuts: Enter start test (when idle) · Esc reset · Font: use Mangal / KrutiDev in the bar above.

WPM0
Accuracy %100%
Correct Chars0
Error Chars0
Keystrokes0
Net Speed0
Goal WPM / लक्ष्य
Set a goal to track progress.
Goal Accuracy % / लक्ष्य
Set a goal to track progress.
📝

Practice Mode / अभ्यास मोड

Timer starts when you type. Switch Mangal (Unicode) or KrutiDev from the top bar anytime.

Target passage / मिलान पाठ

हमारे दैनिक जीवन में स्वास्थ्य का बहुत महत्व है। नियमित व्यायाम और संतुलित आहार हमें स्वस्थ रखते हैं। सुबह जल्दी उठना और ताजी हवा में सैर करना लाभदायक होता है।
Words: 0 Characters: 0
Words Typed0
Characters0
Accuracy %100%
Time Elapsed00:00
WPM0
Goal WPM / लक्ष्य
Set a goal to track progress.
Goal Accuracy % / लक्ष्य
Set a goal to track progress.
🎯

Game 1: Word Catch / शब्द पकड़ो

Score0
Streak0
Multiplierx1
Best0
Time60s
शुरू करें

🧩

Game 2: Sentence Scramble / वाक्य क्रम

Score0
Lives5
Combo0
Best0
Time90s
Start game to see scrambled sentence.

Game 3: Speed Burst / स्पीड बर्स्ट

Progress0/10
Timer0.0s
Mistakes0
Penalty0.0s
Best Time-
Press start to begin 10-sentence challenge.

Top 5 Personal Scores / शीर्ष 5
    📊

    My Progress / मेरी प्रगति

    Avg WPM0
    Best WPM0
    Avg Accuracy0%
    Total Tests0
    Total Time0m

    WPM Trend (Last 10 Tests) / गति रुझान

    Accuracy Trend (Last 10 Tests) / शुद्धता रुझान

    DateDurationWPMAccuracyCorrectErrors
    💡

    Recommendations / सुझाव

    📊 Your Personalized Tips / आपके लिए सुझाव

    ℹ️Complete at least one typing test to get personalized recommendations based on your performance. / कम से कम एक टाइपिंग टेस्ट पूरा करें।
    Hindi Typing Speed Scale / गति स्तर
    0–20
    WPM
    🌱 Beginner
    20–35
    WPM
    ⭐ Developing
    35–50
    WPM
    ⭐⭐ Intermediate
    50–65
    WPM
    ⭐⭐⭐ Advanced
    65+
    WPM
    🏆 Expert
    🎯

    Focus on Accuracy First / पहले शुद्धता

    Speed follows accuracy naturally. If your accuracy is below 90%, slow down and type each character carefully before increasing speed.

    For Beginners
    1. Target 95%+ accuracy at any speed
    2. Use Practice Mode (no timer pressure)
    3. Only then increase WPM gradually

    Daily Practice Plan / दैनिक अभ्यास

    Consistent daily practice beats long irregular sessions. A 20-minute daily routine will improve your speed significantly within 2–3 weeks.

    Consistency
    1. 5 min — Practice Mode warm-up
    2. 10 min — 3 or 5 min timed tests
    3. 5 min — Word Catch game for speed

    Posture & Keyboard Setup / बैठने की मुद्रा

    Correct typing posture reduces fatigue and prevents injury, allowing longer productive practice sessions.

    Ergonomics
    1. Keep wrists flat, not bent upward
    2. Sit at 90° with feet flat on floor
    3. Screen at eye level, 50cm away
    4. Rest eyes every 20 min (look 20 feet away)
    🏆

    CPCT Exam Preparation / सीपीसीटी तैयारी

    CPCT requires minimum 30 WPM in Hindi with 85%+ accuracy. Use CPCT Exam Style passages and timed tests to simulate real exam conditions.

    Exam Ready
    1. Select "CPCT Exam Style" category
    2. Practice 5 and 10 minute tests daily
    3. Aim for 35+ WPM before exam
    4. Track your progress in My Progress tab
    🎮

    Use Games to Build Speed / गेम से गति बढ़ाएँ

    Games train your reflexes and build muscle memory faster than traditional typing exercises. Play Word Catch daily to boost raw typing speed.

    Fun Learning
    1. Word Catch → reaction speed
    2. Sentence Scramble → word recognition
    3. Speed Burst → sustained typing endurance
    📈

    Track & Analyze Progress / प्रगति देखें

    Use the My Progress tab after every session. Look for WPM trends — if you plateau for 3+ days, switch to a harder passage category.

    Growth Mindset
    1. Check WPM trend chart weekly
    2. If accuracy drops <85%, slow down
    3. Try Government category for advanced practice
    4. Download PDF reports to track over time
    🔤

    Common Hindi Typing Mistakes / सामान्य गलतियाँ

    Most learners struggle with matras (vowel marks), half-characters, and conjuncts. These require extra focused practice.

    Error Reduction
    1. Practice ि ी ु ू ा ो ौ matras slowly
    2. Half characters: क् ख् ग् etc.
    3. Conjuncts: क्ष त्र ज्ञ श्र
    4. Check your error report after each test
    🌐

    KrutiDev ↔ Unicode Workflow / रूपांतरण

    If you work with KrutiDev fonts for government documents, use our KrutiDev to Unicode converter to instantly convert your typed content.

    Site Feature
    1. Type in KrutiDev layout
    2. Copy your text
    3. Visit krutidev-to-unicode.com
    4. Paste and convert instantly for free
    How to use / उपयोग कैसे करें ▼

    Typing Test में टाइमर और श्रेणी चुनकर Start करें। Practice Mode में बिना टाइमर आराम से अभ्यास करें। Games टैब में Word Catch, Sentence Scramble और Speed Burst से स्पीड बढ़ाएँ। हर टेस्ट के बाद रिपोर्ट ऑटो-जनरेट होती है — PDF डाउनलोड करें या प्रिंट करें। Recommendations टैब में अपनी प्रगति के अनुसार सुझाव देखें। Enter दबाकर टेस्ट शुरू करें, Escape से रीसेट करें।

    '); printWindow.document.close(); printWindow.focus(); setTimeout(function(){ printWindow.print(); printWindow.close(); },900); };window.htmShareResult = function(){ var session=testState.lastReportSession||buildSessionFromGlobals(); /* FIX 7: include site URL */ var text='I scored '+Number(session.wpm||0).toFixed(1)+' WPM with '+Number(session.accuracy||0).toFixed(1)+'% accuracy on Hindi Typing Master! 🎯 Try it free at krutidev-to-unicode.com'; if(navigator.clipboard&&navigator.clipboard.writeText){ navigator.clipboard.writeText(text).then(function(){ alert('Result copied to clipboard! / क्लिपबोर्ड पर कॉपी हो गया!'); }); } else { prompt('Copy this result:',text); } };window.htmDownloadCSV = function(){ if(!sessions || !sessions.length){ alert('No sessions to export yet.'); return; } var csv = sessionsToCsv(sessions.slice().reverse()); downloadTextFile('hindi-typing-master-sessions.csv', csv, 'text/csv;charset=utf-8'); };window.htmTryAgain = function(){ resetTest({keepPassage:false,clearReport:true}); startTest(); };/* ─── PERSONAL RECOMMENDATIONS ─── */ function updatePersonalRecommendations(){ var recBox=qs('#personalRecContent'); if(!recBox) return; if(!sessions.length){ recBox.innerHTML='
    ℹ️Complete at least one typing test to get personalized recommendations. / कम से कम एक टाइपिंग टेस्ट पूरा करें।
    '; return; } var last=sessions[0]; var avgWpm=sessions.reduce(function(a,b){ return a+b.wpm; },0)/sessions.length; var avgAcc=sessions.reduce(function(a,b){ return a+b.accuracy; },0)/sessions.length; var tips=generateTips(last); var rating=ratingForWpm(last.wpm); var html='
    🏅Your Level: '+rating.label+' — Avg WPM: '+avgWpm.toFixed(1)+' | Avg Accuracy: '+avgAcc.toFixed(1)+'% | Tests Done: '+sessions.length+'
    '; tips.forEach(function(tip){ html+='
    💡'+tip+'
    '; }); if(last.wpm<30) html+='
    🎮Switch to Practice Mode to build muscle memory without timer pressure. / Practice Mode आजमाएँ।
    '; if(last.accuracy<90) html+='
    🎯Your accuracy needs work. Try typing 30% slower until accuracy exceeds 92%. / शुद्धता बढ़ाने के लिए धीमे टाइप करें।
    '; if(sessions.length>=5&&last.wpm>sessions[sessions.length-1].wpm) html+='
    📈Great progress! Your WPM improved from '+sessions[sessions.length-1].wpm.toFixed(1)+' to '+last.wpm.toFixed(1)+'. Keep going! / शानदार सुधार!
    '; recBox.innerHTML=html; }/* ─── INIT TYPING TEST ─── */ function initTypingTest(){ testState.category=testEls.category.value; setTestPassage(false); updateTestTimerUI(); updateTestCountsAndStats();/* --- ANTI-CHEAT APPLIED --- */ applyAntiCheat(testEls.input);// IME composition handling: avoid heavy segmentation/renders until composition commits. var testComposing = false; testEls.input.addEventListener('compositionstart', function(){ testComposing = true; }); testEls.input.addEventListener('compositionend', function(){ testComposing = false; if(testState.running) scheduleTestRender(true); });// Custom passage + favorites refreshFavoritesSelect(); if(testEls.customPassageFile) testEls.customPassageFile.addEventListener('change', function(){ var file = testEls.customPassageFile.files && testEls.customPassageFile.files[0]; if(!file) return; if(file.size > 1024 * 200){ alert('File too large. Please use a .txt under 200KB.'); return; } var reader = new FileReader(); reader.onload = function(){ if(testEls.customPassageInput) testEls.customPassageInput.value = String(reader.result || ''); }; reader.onerror = function(){ alert('Failed to read file.'); }; reader.readAsText(file); }); if(testEls.useCustomPassageBtn) testEls.useCustomPassageBtn.addEventListener('click', function(){ if(testState.running) return; var raw = (testEls.customPassageInput && testEls.customPassageInput.value) ? testEls.customPassageInput.value : ''; raw = normalizeForCompare(raw).trim(); if(!raw){ alert('Please enter a custom passage first.'); return; } testState.passageUnicode = raw; testState.passage = toDisplayText(testState.passageUnicode); testState.lastChunkIndex = null; passageGraphemes = segmentGraphemes(testState.passage); renderPassageStatic(testState.passage); updatePassageHighlight('', false); }); if(testEls.saveFavoriteBtn) testEls.saveFavoriteBtn.addEventListener('click', function(){ var raw = (testEls.customPassageInput && testEls.customPassageInput.value) ? testEls.customPassageInput.value : ''; raw = normalizeForCompare(raw).trim(); if(!raw){ alert('Nothing to save. Enter a custom passage first.'); return; } var title = raw.slice(0, 38).replace(/\s+/g,' ').trim(); var fav = loadFavorites(); fav.unshift({ id: Date.now(), title: title, text: raw }); fav = fav.slice(0, 50); saveFavorites(fav); refreshFavoritesSelect(); alert('Saved to favorites.'); }); if(testEls.loadFavoriteBtn) testEls.loadFavoriteBtn.addEventListener('click', function(){ var id = Number((testEls.favoriteSelect && testEls.favoriteSelect.value) || 0); if(!id) return; var fav = loadFavorites().find(function(f){ return Number(f.id) === id; }); if(!fav) return; if(testEls.customPassageInput) testEls.customPassageInput.value = fav.text; }); if(testEls.deleteFavoriteBtn) testEls.deleteFavoriteBtn.addEventListener('click', function(){ var id = Number((testEls.favoriteSelect && testEls.favoriteSelect.value) || 0); if(!id) return; var fav = loadFavorites().filter(function(f){ return Number(f.id) !== id; }); saveFavorites(fav); refreshFavoritesSelect(); });// Persist goal inputs try{ var savedGoalW = localStorage.getItem('hindiTypingMaster_goalWpm'); var savedGoalA = localStorage.getItem('hindiTypingMaster_goalAcc'); if(testEls.goalWpmInput && savedGoalW != null) testEls.goalWpmInput.value = String(savedGoalW); if(testEls.goalAccInput && savedGoalA != null) testEls.goalAccInput.value = String(savedGoalA); }catch(e){} if(testEls.candidateNameInput){ var savedCandidateName = loadStore(CANDIDATE_NAME_KEY, ''); if(typeof savedCandidateName === 'string') testEls.candidateNameInput.value = savedCandidateName.slice(0,60); testEls.candidateNameInput.addEventListener('input', function(){ var normalizedName = String(testEls.candidateNameInput.value || '').slice(0,60); testEls.candidateNameInput.value = normalizedName; saveStore(CANDIDATE_NAME_KEY, normalizedName); }); } if(testEls.goalWpmInput) testEls.goalWpmInput.addEventListener('input', function(){ try{ localStorage.setItem('hindiTypingMaster_goalWpm', String(testEls.goalWpmInput.value||0)); }catch(e){} applyGoalUI(Number(testEls.statWpm.textContent||0), Number(String(testEls.statAccuracy.textContent||'0').replace('%',''))||0); }); if(testEls.goalAccInput) testEls.goalAccInput.addEventListener('input', function(){ try{ localStorage.setItem('hindiTypingMaster_goalAcc', String(testEls.goalAccInput.value||0)); }catch(e){} applyGoalUI(Number(testEls.statWpm.textContent||0), Number(String(testEls.statAccuracy.textContent||'0').replace('%',''))||0); });testEls.timerPills.forEach(function(pill){ pill.addEventListener('click',function(){ if(testState.running) return; testEls.timerPills.forEach(function(p){ p.classList.remove('is-active'); }); pill.classList.add('is-active'); testState.durationSec=Number(pill.getAttribute('data-min'))*60; testState.remainingSec=testState.durationSec; updateTestTimerUI(); }); });testEls.category.addEventListener('change',function(){ if(!testState.running){ testState.category=testEls.category.value; setTestPassage(false); } }); testEls.randomBtn.addEventListener('click',function(){ if(!testState.running) setTestPassage(true); }); testEls.startBtn.addEventListener('click',function(){ playUiClick(); startTest(); }); testEls.stopBtn.addEventListener('click',function(){ playUiClick(); finishTest(); }); testEls.resetBtn.addEventListener('click',function(){ playUiClick(); resetTest({keepPassage:false,clearReport:true}); });if(testEls.musicToggleBtn){ testEls.musicToggleBtn.textContent='🎵 Music On'; testEls.musicToggleBtn.addEventListener('click',function(){ playUiClick(); testState.musicEnabled=!testState.musicEnabled; testEls.musicToggleBtn.textContent=testState.musicEnabled?'🎵 Music On':'🎵 Music Off'; if(!testState.musicEnabled) stopFluteSong(); else if(testState.running) startFluteSong(); }); }testEls.input.addEventListener('keydown',function(e){ if(!testState.running) return; var skip=['Shift','Alt','Control','Meta','ArrowLeft','ArrowRight','ArrowUp','ArrowDown','CapsLock','Home','End','PageUp','PageDown']; if(e.ctrlKey||e.metaKey||e.altKey) return; if(skip.indexOf(e.key)!==-1) return; totalKeystrokes+=1; testState.keystrokes=totalKeystrokes; testEls.statKeys.textContent=String(totalKeystrokes); playTypingClick(); });testEls.input.addEventListener('input',function(){ if(!testState.running) return; if(testComposing) return; scheduleTestRender(true); }); }/* ─── PRACTICE MODE ─── */ var practiceState={elapsedSec:0,timerId:null,active:false,category:'General Hindi',passage:'',passageUnicode:'',lastChunkIndex:null}; var practiceRenderRaf = null; var practiceRenderFollowCursor = false; var practicePassageGraphemes=[]; var practiceSpanPool=[]; var practiceSpanClassPool=[]; var PRACTICE_WINDOW_SIZE = 420; var PRACTICE_WINDOW_AHEAD = 260; var PRACTICE_WINDOW_BEHIND = PRACTICE_WINDOW_SIZE - PRACTICE_WINDOW_AHEAD; var PRACTICE_HIGHLIGHT_FAST_PATH_MAX_NEW = HIGHLIGHT_FAST_PATH_MAX_NEW_GRAPHEMES; var practiceWindowStart = 0; var practiceLastAutoScrollAtIndex = -9999; var practiceLastRenderedTypedLen = 0; var practiceLastRenderedWindowStart = 0; var practiceCorrectChars = 0, practiceErrorChars = 0; var practicePrevTyped = '', practicePrevTypedGraphemes = []; var practiceEls={ category:qs('#practiceCategory'),newBtn:qs('#practiceNewBtn'),clearBtn:qs('#practiceClearBtn'), passage:qs('#practicePassageDisplay'),input:qs('#practiceInput'), wordCount:qs('#practiceWordCount'),charCount:qs('#practiceCharCount'), statWords:qs('#practiceStatWords'),statChars:qs('#practiceStatChars'), statAccuracy:qs('#practiceStatAccuracy'),statTime:qs('#practiceStatTime'),statWpm:qs('#practiceStatWpm') }; var practiceGoalEls = { wpmInput: qs('#practiceGoalWpmInput'), accInput: qs('#practiceGoalAccInput'), wpmProgress: qs('#practiceGoalWpmProgress'), accProgress: qs('#practiceGoalAccProgress'), wpmText: qs('#practiceGoalWpmText'), accText: qs('#practiceGoalAccText') };function setPracticePassage(rand){ practiceState.category=practiceEls.category.value; var sel=getPassage(practiceState.category,rand); practiceState.passageUnicode=sel.text; practiceState.lastChunkIndex=sel.index; /* Pre-fill buffer to ensure it's long enough immediately */ for(var i=0; i<3; i++){ var next=getRandomPassageChunk(practiceState.category, practiceState.lastChunkIndex); practiceState.passageUnicode += ' ' + next.text; practiceState.lastChunkIndex=next.index; } practiceState.passage = toDisplayText(practiceState.passageUnicode);practiceEls.input.value=''; practiceState.elapsedSec=0; practiceState.active=false; if(practiceState.timerId){ clearInterval(practiceState.timerId); practiceState.timerId=null; } practiceCorrectChars=0; practiceErrorChars=0; practicePrevTyped=''; practicePrevTypedGraphemes=[];practicePassageGraphemes = segmentGraphemes(practiceState.passage); practiceSpanPool=[]; practiceSpanClassPool=[]; practiceWindowStart=0; practiceLastAutoScrollAtIndex=-9999; practiceLastRenderedTypedLen=0; practiceLastRenderedWindowStart=0;practiceEls.passage.innerHTML=''; var frag=document.createDocumentFragment(); for(var j=0;j= prevG.length){ for(var i=prevG.length;i 0 ? Math.max(0, Math.min(100, (wpm / goalW) * 100)) : 0; practiceGoalEls.wpmProgress.style.width = pctW.toFixed(1) + '%'; } if(practiceGoalEls.accProgress){ var pctA = goalA > 0 ? Math.max(0, Math.min(100, (acc / goalA) * 100)) : 0; practiceGoalEls.accProgress.style.width = pctA.toFixed(1) + '%'; } if(practiceGoalEls.wpmText){ practiceGoalEls.wpmText.textContent = goalW > 0 ? ('Progress: ' + Math.min(100, Math.round((wpm/goalW)*100)) + '%') : 'Set a goal to track progress.'; } if(practiceGoalEls.accText){ practiceGoalEls.accText.textContent = goalA > 0 ? ('Progress: ' + Math.min(100, Math.round((acc/goalA)*100)) + '%') : 'Set a goal to track progress.'; } } }function updatePracticeStats(){ var typed=practiceEls.input.value; return updatePracticeStatsFromGraphemes(typed, segmentGraphemes(typed)); }function setPracticePoolSpanClass(poolIndex, className){ if(poolIndex<0||poolIndex>=practiceSpanPool.length) return; if(practiceSpanClassPool[poolIndex]!==className){ practiceSpanClassPool[poolIndex]=className; practiceSpanPool[poolIndex].className=className; } }function updatePracticeHighlightFromGraphemes(typedG, typedLen, followCursor){var desiredStart = Math.max(0, typedLen - PRACTICE_WINDOW_BEHIND); var windowChanged = desiredStart !== practiceWindowStart; if(windowChanged){ practiceWindowStart = desiredStart; for(var r=0;r= practiceLastRenderedTypedLen && (typedLen - practiceLastRenderedTypedLen) <= PRACTICE_HIGHLIGHT_FAST_PATH_MAX_NEW && practiceLastRenderedTypedLen > 0){ function ensurePoolText(gIndex){ var poolIndex = gIndex - practiceWindowStart; if(poolIndex < 0 || poolIndex >= PRACTICE_WINDOW_SIZE) return; var expected = practicePassageGraphemes[gIndex] || ''; var span = practiceSpanPool[poolIndex]; if(span.textContent !== expected) span.textContent = expected; } function setPoolClassByGIndex(gIndex, cls){ var poolIndex = gIndex - practiceWindowStart; if(poolIndex < 0 || poolIndex >= PRACTICE_WINDOW_SIZE) return; setPracticePoolSpanClass(poolIndex, cls); }var oldCursorIndex = practiceLastRenderedTypedLen; var newCursorIndex = typedLen;ensurePoolText(oldCursorIndex); if(oldCursorIndex < typedLen){ var expOld = practicePassageGraphemes[oldCursorIndex] || ''; var clsOld = (typedG[oldCursorIndex] === expOld) ? 'htm-char-correct' : 'htm-char-incorrect'; setPoolClassByGIndex(oldCursorIndex, clsOld); } else { setPoolClassByGIndex(oldCursorIndex, 'htm-char-untyped'); }for(var g=practiceLastRenderedTypedLen; g= 0 && cursorPoolIndex < practiceSpanPool.length){ var cursorEl = practiceSpanPool[cursorPoolIndex]; if(cursorEl && Math.abs(typedLen - practiceLastAutoScrollAtIndex) > 6){ practiceLastAutoScrollAtIndex = typedLen; var targetTop = Math.max(0, cursorEl.offsetTop - practiceEls.passage.clientHeight/2); if(Math.abs(practiceEls.passage.scrollTop - targetTop) > 24) practiceEls.passage.scrollTop = targetTop; } } } }function updatePracticeHighlight(followCursor){ var typedG = segmentGraphemes(practiceEls.input.value); updatePracticeHighlightFromGraphemes(typedG, typedG.length, followCursor); }function initPracticeMode(){ setPracticePassage(true); /* --- ANTI-CHEAT APPLIED --- */ applyAntiCheat(practiceEls.input);// IME composition handling var practiceComposing = false; practiceEls.input.addEventListener('compositionstart', function(){ practiceComposing = true; }); practiceEls.input.addEventListener('compositionend', function(){ practiceComposing = false; // Render once after commit // (schedulePracticeRender is defined below in this scope) });// Persist goals try{ var savedW = localStorage.getItem('hindiTypingMaster_practiceGoalWpm'); var savedA = localStorage.getItem('hindiTypingMaster_practiceGoalAcc'); if(practiceGoalEls.wpmInput && savedW != null) practiceGoalEls.wpmInput.value = String(savedW); if(practiceGoalEls.accInput && savedA != null) practiceGoalEls.accInput.value = String(savedA); }catch(e){} if(practiceGoalEls.wpmInput) practiceGoalEls.wpmInput.addEventListener('input', function(){ try{ localStorage.setItem('hindiTypingMaster_practiceGoalWpm', String(practiceGoalEls.wpmInput.value||0)); }catch(e){} updatePracticeStats(); }); if(practiceGoalEls.accInput) practiceGoalEls.accInput.addEventListener('input', function(){ try{ localStorage.setItem('hindiTypingMaster_practiceGoalAcc', String(practiceGoalEls.accInput.value||0)); }catch(e){} updatePracticeStats(); });practiceEls.category.addEventListener('change',function(){ setPracticePassage(false); }); practiceEls.newBtn.addEventListener('click',function(){ setPracticePassage(true); }); practiceEls.clearBtn.addEventListener('click',function(){ setPracticePassage(false); }); function schedulePracticeRender(followCursor){ if(followCursor) practiceRenderFollowCursor = true; if(practiceRenderRaf) return; practiceRenderRaf = requestAnimationFrame(function(){ practiceRenderRaf = null; var typed = practiceEls.input.value; var typedG = segmentGraphemes(typed); ensurePracticeBuffer(typedG.length); updatePracticeHighlightFromGraphemes(typedG, typedG.length, practiceRenderFollowCursor); practiceRenderFollowCursor = false; updatePracticeStatsFromGraphemes(typed, typedG); }); } // now that schedulePracticeRender exists, hook compositionend to render once practiceEls.input.addEventListener('compositionend', function(){ schedulePracticeRender(true); });practiceEls.input.addEventListener('input',function(){ var val=practiceEls.input.value; if(val.length>0&&!practiceState.active){ practiceState.active=true; practiceState.timerId=setInterval(function(){ practiceState.elapsedSec+=1; updatePracticeStats(); },1000); } if(val.length===0&&practiceState.active){ practiceState.active=false; if(practiceState.timerId){ clearInterval(practiceState.timerId); practiceState.timerId=null; } practiceState.elapsedSec=0; } if(practiceComposing) return; schedulePracticeRender(true); }); }/* ─── FONT MODE TOGGLE INIT ─── */ function initFontModeToggle(){ setFontMode(fontMode); var uBtn = qs('#fontModeUnicodeBtn'); var kBtn = qs('#fontModeKrutiBtn'); if(uBtn) uBtn.addEventListener('click', function(){ if(fontMode === 'unicode') return; setFontMode('unicode'); // Refresh passages so display + comparison are in the same encoding. if(testState.running) resetTest({keepPassage:false, clearReport:true}); else setTestPassage(false); setPracticePassage(false); }); if(kBtn) kBtn.addEventListener('click', function(){ if(fontMode === 'krutidev') return; setFontMode('krutidev'); if(testState.running) resetTest({keepPassage:false, clearReport:true}); else setTestPassage(false); setPracticePassage(false); }); }/* ─── GAMES ─── */ var saveBest=function(){ saveStore(BEST_KEY,best); }; var saveGames=function(){ saveStore(GAMES_KEY,games); }; function pushGameScore(type,payload){ if(!Array.isArray(games[type])) games[type]=[]; games[type].unshift(payload); games[type]=games[type].slice(0,100); saveGames(); }/* Word Catch */ var wcState={running:false,score:0,streak:0,multiplier:1,isGolden:false,timeLeft:60,currentWord:'',roundTimer:null,gameTimer:null}; var wordCatchEls={score:qs('#wcScore'),streak:qs('#wcStreak'),mult:qs('#wcMult'),best:qs('#wcBest'),time:qs('#wcTime'),word:qs('#wcWord'),input:qs('#wcInput'),startBtn:qs('#wcStartBtn'),stopBtn:qs('#wcStopBtn'),progress:qs('#wcWordProgress'),message:qs('#wcMessage')};function updateWordCatchUI(){ wordCatchEls.score.textContent=String(wcState.score); wordCatchEls.streak.textContent=String(wcState.streak); wordCatchEls.mult.textContent='x'+wcState.multiplier; wordCatchEls.best.textContent=String(best.wordCatchBest||0); wordCatchEls.time.textContent=wcState.timeLeft+'s'; }function nextWordCatchWord(){ if(!wcState.running) return; wcState.currentWord=wordCatchWords[randomInt(wordCatchWords.length)]; wcState.isGolden=Math.random()<0.18; wordCatchEls.word.textContent=wcState.currentWord+(wcState.isGolden?' ✨':''); wordCatchEls.word.style.color=wcState.isGolden?'#F26522':'#6B4EFF'; wordCatchEls.input.value=''; wordCatchEls.input.focus(); var windowMs=Math.max(900,3000-wcState.score*20); if(wcState.roundTimer) clearTimeout(wcState.roundTimer); wordCatchEls.progress.style.transition='none'; wordCatchEls.progress.style.width='100%'; requestAnimationFrame(function(){ requestAnimationFrame(function(){ wordCatchEls.progress.style.transition='width '+windowMs+'ms linear'; wordCatchEls.progress.style.width='0%'; }); }); wcState.roundTimer=setTimeout(function(){ if(!wcState.running) return; wcState.streak=0; wcState.multiplier=1; wordCatchEls.message.className='htm-muted bad'; wordCatchEls.message.textContent='Missed! Combo reset.'; updateWordCatchUI(); nextWordCatchWord(); },windowMs); }function endWordCatch(isQuit){ if(!wcState.running) return; wcState.running=false; if(wcState.gameTimer) clearInterval(wcState.gameTimer); if(wcState.roundTimer) clearTimeout(wcState.roundTimer); wordCatchEls.input.disabled=true; wordCatchEls.startBtn.disabled=false; wordCatchEls.stopBtn.disabled=true; wordCatchEls.progress.style.transition='none'; wordCatchEls.progress.style.width='0%'; wordCatchEls.message.className='htm-muted'; wordCatchEls.message.textContent= isQuit ? 'Game stopped! Score: '+wcState.score : 'Game over! Score: '+wcState.score; if (!isQuit) pushGameScore('wordCatch',{dateISO:new Date().toISOString(),score:wcState.score}); }function initWordCatch(){ wordCatchEls.best.textContent=String(best.wordCatchBest||0); wordCatchEls.input.disabled=true; wordCatchEls.progress.style.width='0%'; /* --- ANTI-CHEAT APPLIED --- */ applyAntiCheat(wordCatchEls.input);wordCatchEls.startBtn.addEventListener('click',function(){ if(wcState.running) return; wcState.running=true; wcState.score=0; wcState.streak=0; wcState.multiplier=1; wcState.timeLeft=60; wordCatchEls.startBtn.disabled=true; wordCatchEls.stopBtn.disabled=false; wordCatchEls.input.disabled=false; wordCatchEls.message.className='htm-muted'; wordCatchEls.message.textContent='Golden words ✨ give bonus points!'; updateWordCatchUI(); nextWordCatchWord(); wcState.gameTimer=setInterval(function(){ wcState.timeLeft-=1; updateWordCatchUI(); if(wcState.timeLeft<=0) endWordCatch(false); },1000); }); wordCatchEls.stopBtn.addEventListener('click', function() { endWordCatch(true); });wordCatchEls.input.addEventListener('input',function(){ if(!wcState.running) return; if(normalizeSpace(wordCatchEls.input.value)===wcState.currentWord){ wcState.streak+=1; if(wcState.streak%5===0) wcState.multiplier=Math.min(wcState.multiplier+1,4); var gain=(wcState.isGolden?3:1)*wcState.multiplier; wcState.score+=gain; if(wcState.score>(best.wordCatchBest||0)){ best.wordCatchBest=wcState.score; saveBest(); } wordCatchEls.message.className='htm-muted ok'; wordCatchEls.message.textContent='Great! +'+gain+' points'; updateWordCatchUI(); nextWordCatchWord(); } }); }/* Sentence Scramble */ var scState={running:false,score:0,lives:5,combo:0,hintUsed:false,timeLeft:90,currentSentence:'',timer:null}; var scrambleEls={score:qs('#scScore'),lives:qs('#scLives'),combo:qs('#scCombo'),best:qs('#scBest'),time:qs('#scTime'),prompt:qs('#scPrompt'),input:qs('#scInput'),startBtn:qs('#scStartBtn'),stopBtn:qs('#scStopBtn'),submitBtn:qs('#scSubmitBtn'),hintBtn:qs('#scHintBtn'),message:qs('#scMessage')};function updateScrambleUI(){ scrambleEls.score.textContent=String(scState.score); scrambleEls.lives.textContent=String(scState.lives); scrambleEls.combo.textContent=String(scState.combo); scrambleEls.best.textContent=String(best.sentenceScrambleBest||0); scrambleEls.time.textContent=scState.timeLeft+'s'; }function scrambleWords(sentence){ var words=sentence.split(' '); if(words.length<2) return sentence; var shuffled=words.slice(),attempts=0; while(shuffled.join(' ')===sentence&&attempts<6){ shuffled=shuffle(words.slice()); attempts++; } return shuffled.join(' '); }function nextScrambleSentence(){ if(!scState.running) return; scState.currentSentence=scrambleSentences[randomInt(scrambleSentences.length)]; scState.hintUsed=false; if(scrambleEls.hintBtn) scrambleEls.hintBtn.disabled=false; scrambleEls.prompt.textContent=scrambleWords(scState.currentSentence); scrambleEls.input.value=''; scrambleEls.input.focus(); }function endScramble(isQuit){ if(!scState.running) return; scState.running=false; if(scState.timer) clearInterval(scState.timer); scrambleEls.startBtn.disabled=false; scrambleEls.stopBtn.disabled=true; scrambleEls.submitBtn.disabled=true; if(scrambleEls.hintBtn) scrambleEls.hintBtn.disabled=true; scrambleEls.input.disabled=true; scrambleEls.message.className='htm-muted'; scrambleEls.message.textContent= isQuit ? 'Game stopped! Score: '+scState.score : 'Game over! Score: '+scState.score; if (!isQuit) pushGameScore('sentenceScramble',{dateISO:new Date().toISOString(),score:scState.score}); }function initSentenceScramble(){ scrambleEls.best.textContent=String(best.sentenceScrambleBest||0); scrambleEls.input.disabled=true; scrambleEls.submitBtn.disabled=true; if(scrambleEls.hintBtn) scrambleEls.hintBtn.disabled=true; /* --- ANTI-CHEAT APPLIED --- */ applyAntiCheat(scrambleEls.input);scrambleEls.startBtn.addEventListener('click',function(){ if(scState.running) return; scState.running=true; scState.score=0; scState.lives=5; scState.combo=0; scState.timeLeft=90; scrambleEls.startBtn.disabled=true; scrambleEls.stopBtn.disabled=false; scrambleEls.input.disabled=false; scrambleEls.submitBtn.disabled=false; if(scrambleEls.hintBtn) scrambleEls.hintBtn.disabled=false; scrambleEls.message.className='htm-muted'; scrambleEls.message.textContent='Combo for higher points!'; updateScrambleUI(); nextScrambleSentence(); scState.timer=setInterval(function(){ scState.timeLeft-=1; updateScrambleUI(); if(scState.timeLeft<=0) endScramble(false); },1000); }); scrambleEls.stopBtn.addEventListener('click', function() { endScramble(true); });var submitScramble=function(){ if(!scState.running) return; var user=normalizeSpace(scrambleEls.input.value),correct=normalizeSpace(scState.currentSentence); if(user===correct){ scState.combo+=1; var gain=10+Math.min(scState.combo*2,14); scState.score+=gain; if(scState.score>(best.sentenceScrambleBest||0)){ best.sentenceScrambleBest=scState.score; saveBest(); } scrambleEls.message.className='htm-muted ok'; scrambleEls.message.textContent='Correct! +'+gain+' points'; } else { scState.lives-=1; scState.combo=0; scrambleEls.message.className='htm-muted bad'; scrambleEls.message.textContent='Wrong! Correct: '+scState.currentSentence; } updateScrambleUI(); if(scState.lives<=0){ endScramble(false); return; } nextScrambleSentence(); }; scrambleEls.submitBtn.addEventListener('click',submitScramble); scrambleEls.input.addEventListener('keydown',function(e){ if(e.key==='Enter'){ e.preventDefault(); submitScramble(); } }); if(scrambleEls.hintBtn){ scrambleEls.hintBtn.addEventListener('click',function(){ if(!scState.running||scState.hintUsed) return; var words=scState.currentSentence.split(' '); scrambleEls.message.className='htm-muted'; scrambleEls.message.textContent='Hint: starts with "'+words.slice(0,Math.min(3,words.length)).join(' ')+'"'; scState.hintUsed=true; scrambleEls.hintBtn.disabled=true; scState.score=Math.max(0,scState.score-2); updateScrambleUI(); }); } }/* Speed Burst */ var sbState={running:false,list:[],index:0,startMs:0,mistakes:0,penaltySec:0,timer:null}; var burstEls={count:qs('#sbCount'),timer:qs('#sbTimer'),mistakes:qs('#sbMistakes'),penalty:qs('#sbPenalty'),bestTime:qs('#sbBestTime'),prompt:qs('#sbPrompt'),input:qs('#sbInput'),startBtn:qs('#sbStartBtn'),stopBtn:qs('#sbStopBtn'),submitBtn:qs('#sbSubmitBtn'),message:qs('#sbMessage'),leaderboard:qs('#sbLeaderboard')};function renderSpeedLeaderboard(){ var rows=best.speedBurstTop||[]; burstEls.leaderboard.innerHTML=''; if(!rows.length){ var li=document.createElement('li'); li.textContent='No scores yet / अभी कोई स्कोर नहीं'; burstEls.leaderboard.appendChild(li); burstEls.bestTime.textContent='-'; return; } rows.forEach(function(r){ var li=document.createElement('li'); li.textContent=r.time.toFixed(2)+'s — '+new Date(r.dateISO).toLocaleDateString(); burstEls.leaderboard.appendChild(li); }); burstEls.bestTime.textContent=rows[0].time.toFixed(2)+'s'; }function endSpeedBurst(isQuit){ if(!sbState.running) return; sbState.running=false; if(sbState.timer) clearInterval(sbState.timer); burstEls.input.disabled=true; burstEls.submitBtn.disabled=true; burstEls.startBtn.disabled=false; burstEls.stopBtn.disabled=true; var raw=(Date.now()-sbState.startMs)/1000,total=raw+sbState.penaltySec; if(isQuit) { burstEls.timer.textContent='-'; burstEls.message.className='htm-muted'; burstEls.message.textContent='Game stopped manually.'; } else { burstEls.timer.textContent=total.toFixed(2)+'s'; burstEls.message.className='htm-muted ok'; burstEls.message.textContent='Done! '+raw.toFixed(2)+'s raw + '+sbState.penaltySec.toFixed(1)+'s penalty'; var record={dateISO:new Date().toISOString(),time:Number(total.toFixed(2)),raw:Number(raw.toFixed(2)),penalty:Number(sbState.penaltySec.toFixed(1))}; pushGameScore('speedBurst',record); best.speedBurstTop.push(record); best.speedBurstTop.sort(function(a,b){ return a.time-b.time; }); best.speedBurstTop=best.speedBurstTop.slice(0,5); saveBest(); renderSpeedLeaderboard(); } }function initSpeedBurst(){ burstEls.input.disabled=true; burstEls.submitBtn.disabled=true; renderSpeedLeaderboard(); /* --- ANTI-CHEAT APPLIED --- */ applyAntiCheat(burstEls.input);burstEls.startBtn.addEventListener('click',function(){ if(sbState.running) return; sbState.running=true; sbState.list=shuffle(speedBurstSentences.slice()).slice(0,10); sbState.index=0; sbState.startMs=Date.now(); sbState.mistakes=0; sbState.penaltySec=0; burstEls.input.disabled=false; burstEls.submitBtn.disabled=false; burstEls.startBtn.disabled=true; burstEls.stopBtn.disabled=false; burstEls.count.textContent='1/10'; burstEls.prompt.textContent=sbState.list[0]; burstEls.input.value=''; burstEls.input.focus(); burstEls.mistakes.textContent='0'; burstEls.penalty.textContent='0.0s'; burstEls.message.className='htm-muted'; burstEls.message.textContent='Mistake = +1.5s penalty. Type clean and fast!'; sbState.timer=setInterval(function(){ var e=(Date.now()-sbState.startMs)/1000; burstEls.timer.textContent=(e+sbState.penaltySec).toFixed(1)+'s'; },100); }); burstEls.stopBtn.addEventListener('click', function() { endSpeedBurst(true); });var submitBurst=function(){ if(!sbState.running) return; var typed=normalizeSpace(burstEls.input.value),target=normalizeSpace(sbState.list[sbState.index]); if(typed===target){ sbState.index+=1; if(sbState.index>=10){ burstEls.count.textContent='10/10'; endSpeedBurst(false); return; } burstEls.count.textContent=(sbState.index+1)+'/10'; burstEls.prompt.textContent=sbState.list[sbState.index]; burstEls.input.value=''; burstEls.input.focus(); burstEls.message.className='htm-muted ok'; burstEls.message.textContent='Nice! Next...'; } else { sbState.mistakes+=1; sbState.penaltySec+=1.5; burstEls.mistakes.textContent=String(sbState.mistakes); burstEls.penalty.textContent=sbState.penaltySec.toFixed(1)+'s'; burstEls.message.className='htm-muted bad'; burstEls.message.textContent='Try again. Penalty +1.5s'; } }; burstEls.submitBtn.addEventListener('click',submitBurst); burstEls.input.addEventListener('keydown',function(e){ if(e.key==='Enter'){ e.preventDefault(); submitBurst(); } }); }/* ─── PROGRESS ─── */ var progressWpmChart=null, progressAccChart=null; var progressEls={avgWpm:qs('#summaryAvgWpm'),bestWpm:qs('#summaryBestWpm'),avgAcc:qs('#summaryAvgAcc'),totalTests:qs('#summaryTotalTests'),totalTime:qs('#summaryTotalTime'),tableBody:qs('#progressTableBody'),clearBtn:qs('#clearHistoryBtn'),wpmChart:qs('#progressWpmChart'),accChart:qs('#progressAccChart')}; var exportCsvBtn = qs('#exportCsvBtn');function downloadTextFile(filename, text, mime){ try{ var blob = new Blob([text], { type: mime || 'text/plain;charset=utf-8' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); a.remove(); setTimeout(function(){ URL.revokeObjectURL(url); }, 2000); }catch(e){ // Fallback var a2 = document.createElement('a'); a2.href = 'data:' + (mime||'text/plain') + ';charset=utf-8,' + encodeURIComponent(text); a2.download = filename; document.body.appendChild(a2); a2.click(); a2.remove(); } }function sessionsToCsv(rows){ rows = Array.isArray(rows) ? rows : []; var header = ['dateISO','durationSelectedSec','elapsedSec','category','wpm','accuracy','correctChars','errorChars','keystrokes','netSpeed']; function esc(v){ var s = (v == null) ? '' : String(v); if(/[",\r\n]/.test(s)) s = '"' + s.replace(/"/g,'""') + '"'; return s; } var lines = [header.join(',')]; for(var i=0;i0){ var sumWpm=0,sumAcc=0; for(var i=0;ibestWpm) bestWpm=sessions[i].wpm; } avgWpm=sumWpm/total; avgAcc=sumAcc/total; } progressEls.avgWpm.textContent=avgWpm.toFixed(1); progressEls.bestWpm.textContent=bestWpm.toFixed(1); progressEls.avgAcc.textContent=avgAcc.toFixed(1)+'%'; progressEls.totalTests.textContent=String(total); progressEls.totalTime.textContent=totalMinutes>=60?(totalMinutes/60).toFixed(1)+'h':totalMinutes.toFixed(0)+'m'; progressEls.tableBody.innerHTML=''; if(!total){ var row=document.createElement('tr'); row.innerHTML='No sessions yet. / अभी तक कोई टेस्ट नहीं।'; progressEls.tableBody.appendChild(row); } else { sessions.slice(0,10).forEach(function(s){ var tr=document.createElement('tr'); tr.innerHTML=''+new Date(s.dateISO).toLocaleString()+''+Math.round(s.durationSelectedSec/60)+'m'+s.wpm.toFixed(1)+''+s.accuracy.toFixed(1)+'%'+s.correctChars+''+s.errorChars+''; progressEls.tableBody.appendChild(tr); }); } destroyProgressCharts(); if(typeof Chart==='undefined'||!total) return; var last10=sessions.slice(0,10).reverse(); var labels=last10.map(function(s){ var d=new Date(s.dateISO); return (d.getMonth()+1)+'/'+d.getDate(); }); progressWpmChart=new Chart(progressEls.wpmChart,{type:'line',data:{labels:labels,datasets:[{label:'WPM',data:last10.map(function(s){ return s.wpm; }),borderColor:'#6B4EFF',backgroundColor:'rgba(107,78,255,0.16)',fill:true,tension:0.3,pointRadius:3}]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{display:false}},scales:{y:{beginAtZero:true}}}}); progressAccChart=new Chart(progressEls.accChart,{type:'bar',data:{labels:labels,datasets:[{label:'Accuracy %',data:last10.map(function(s){ return s.accuracy; }),backgroundColor:'#2ECC9A'}]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{display:false}},scales:{y:{beginAtZero:true,max:100}}}}); }function initProgress(){ progressEls.clearBtn.addEventListener('click',function(){ if(!window.confirm('Clear all typing history? / क्या आप पूरा इतिहास हटाना चाहते हैं?')) return; sessions=[]; saveStore(SESSION_KEY,sessions); refreshProgress(); updatePersonalRecommendations(); }); if(exportCsvBtn) exportCsvBtn.addEventListener('click', function(){ if(!sessions.length){ alert('No sessions to export yet.'); return; } var csv = sessionsToCsv(sessions.slice().reverse()); downloadTextFile('hindi-typing-master-sessions.csv', csv, 'text/csv;charset=utf-8'); }); refreshProgress(); }/* ─── TABS ─── */ function initTabs(){ var buttons=qsa('.htm-tab-btn'), panels=qsa('.htm-panel'); function activate(tab){ buttons.forEach(function(btn){ var on=btn.getAttribute('data-tab')===tab; btn.classList.toggle('is-active',on); btn.setAttribute('aria-selected',on?'true':'false'); }); panels.forEach(function(panel){ panel.classList.toggle('is-active',panel.id==='tab-'+tab); }); if(tab==='progress') refreshProgress(); if(tab==='recommendations') updatePersonalRecommendations(); } buttons.forEach(function(btn){ btn.addEventListener('click',function(){ activate(btn.getAttribute('data-tab')); }); }); }/* ─── SHORTCUTS ─── */ function initShortcuts(){ document.addEventListener('keydown',function(e){ var activeTabBtn=qs('.htm-tab-btn.is-active'); if(!activeTabBtn||activeTabBtn.getAttribute('data-tab')!=='test') return; if(e.key==='Enter'&&!testState.running){ e.preventDefault(); startTest(); } else if(e.key==='Escape'){ e.preventDefault(); resetTest({keepPassage:false,clearReport:true}); } }); }/* ─── MOBILE NAV AUTO-HIDE ─── On mobile (≤860 px) the nav stacks into 3 rows and consumes ~40% of the viewport. This hides it when the user scrolls down and restores it on scroll-up, matching the UX pattern of native mobile apps. Desktop is completely unaffected. */ function initMobileNavHide(){ var nav = qs('.htm-nav'); if(!nav) return; var lastY = 0; var ticking = false; var MOBILE_BP = 860; var THRESHOLD = 60; // px scrolled before triggering hidefunction onScroll(){ if(ticking) return; ticking = true; requestAnimationFrame(function(){ var y = window.pageYOffset || document.documentElement.scrollTop || 0; if(window.innerWidth <= MOBILE_BP){ if(y > lastY && y > THRESHOLD){ nav.classList.add('htm-nav-hidden'); } else { nav.classList.remove('htm-nav-hidden'); } } else { /* always visible on desktop */ nav.classList.remove('htm-nav-hidden'); } lastY = Math.max(0, y); ticking = false; }); }window.addEventListener('scroll', onScroll, { passive: true });/* Re-show nav instantly when the user taps any tab button */ qsa('.htm-tab-btn').forEach(function(btn){ btn.addEventListener('click', function(){ nav.classList.remove('htm-nav-hidden'); lastY = window.pageYOffset || 0; }); }); }/* ─── BOOT ─── */ initTabs(); initThemeToggle(); initFontModeToggle(); initTypingTest(); initPracticeMode(); initWordCatch(); initSentenceScramble(); initSpeedBurst(); initProgress(); initShortcuts(); initMobileNavHide(); updatePersonalRecommendations();/* Signal that JS has fully booted — removes the shimmer loading overlay */ app.classList.add('htm-js-ready');} // end bootTypingMaster// Robust boot for WordPress optimization plugins (deferred, minified, etc.) if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', bootTypingMaster); } else { bootTypingMaster(); } // Safety net for async JS loading delays window.addEventListener('load', bootTypingMaster);})();
    ⌨ Free Online Tool

    Welcome to India's most complete free online Hindi typing test supporting both Mangal font and Kruti Dev font, with real-time WPM tracking, accuracy scoring, and exam-style passages. Built for government exam aspirants, data-entry professionals, and anyone who wants to type Hindi faster.

    Hindi is the most widely spoken language in India. As digital India grows, typing Hindi quickly and accurately is a core professional skill required for CPCT, SSC, UPSSSC, Rajasthan Patwari, UP Police, and dozens of other recruitment exams.

    📊

    According to a 2023–24 Ipsos report, over 700 million Indians are now online, with 84% preferring regional-language content. The demand for skilled Hindi typists in government, journalism, and content creation has never been higher.

    What is an Online Hindi Typing Test?

    An online Hindi typing test measures how many words you can type correctly within a fixed time. It gives you three scores that matter in every government exam:

    Gross WPM
    Raw speed
    Total chars typed ÷ 5 ÷ minutes. Your speed before error deductions.
    🎯
    Net WPM
    Exam score
    Gross WPM minus error penalty. In CPCT, one mistake costs 10 words.
    Accuracy %
    Correctness
    % of characters typed without errors. Most exams require 85–90% minimum.

    Our online typing test in Hindi Mangal font and Kruti Dev font gives you all three metrics live. You see exactly where you slow down, which characters you miss most, and how your speed trends across sessions so you can prepare smarter, not just harder.


    Mangal Font vs Kruti Dev Font

    The two most important font systems for Hindi typing in India are Mangal (Unicode) and Kruti Dev (non-Unicode). Choosing the wrong one for your exam can cost you the job.

    Unicode · Modern

    Hindi Typing Test Mangal Font

    The Mangal font is India's official Unicode Devanagari font. Because it follows the Unicode standard, text typed in Mangal displays correctly on every device phones, tablets, computers without any special font installation.

    Mangal uses the InScript keyboard layout, which is phonetic — each key roughly matches a Hindi sound. The Indian government has standardized InScript for all official digital use, making it the default for modern exams.

    Required for:
    CPCT (MP), SSC Inscript tests, UP Police, NIC, and all modern web-based government exams.
    Non-Unicode · Legacy

    Hindi Typing Test Kruti Dev Font

    Kruti Dev is a legacy font that dominated Hindi typing for over two decades. It uses the Remington keyboard layout the same layout used on old Hindi typewriters. Keys map to Hindi characters in a non-phonetic way that must be fully memorised.

    Despite being legacy, Kruti Dev remains mandatory for many state-level exams. Once the key positions are memorised, experienced typists can reach very high WPM on this layout.

    Required for:
    Rajasthan LDC/Patwari, UPSSSC, MP Vyapam, court typists. Download Kruti Dev 010 font for offline practice.

    Mangal vs Kruti Dev — Key Differences

    AttributeMangal (Unicode)Kruti Dev (Non-Unicode)
    EncodingUnicode — works everywhereASCII-based — needs font installed
    Keyboard layoutInScript — phonetic, standardizedRemington — non-phonetic, typewriter-based
    Device compatibilityAll browsers, apps, devicesOnly where Kruti Dev font is installed
    Learning curveEasier — intuitive key mappingSteeper — keys must be memorised
    Max speed potential40–70+ WPM achievable60–80+ WPM for expert typists
    Exam useCPCT, SSC Inscript, UP Police, NICRajasthan LDC, UPSSSC, MP Vyapam, courts

    Our tool supports both Mangal and Kruti Dev switch between them in one click. If you need to convert Kruti Dev text to Unicode, use our KrutiDev to Unicode converter.


    CPCT and Government Exam Typing Requirements

    Dozens of Indian government recruitment exams include a mandatory Hindi typing test. Here are the most important ones to prepare for:

    CPCT Madhya Pradesh

    15-minute Hindi test in Mangal/InScript. Minimum 20 net WPM. Certificate valid 7 years. Required for Patwari, Panchayat Secretary, Grade-III, and Police posts.

    SSC Staff Selection Commission

    Hindi typing in Inscript or Remington depending on post. Typically 25 WPM Hindi, 35 WPM English. Accuracy threshold: 85%+.

    UPSSSC Uttar Pradesh

    Hindi typing in Kruti Dev (Remington) or Mangal (Inscript). Minimum 25 WPM net speed. Used for Lekhpal, Junior Assistant, and data-entry posts.

    Rajasthan LDC / Patwari

    Kruti Dev font required. Minimum 8,000 keystrokes per hour (~27 WPM). Low accuracy is the most common reason for rejection.

    UP Police / PAC

    Hindi typing in Mangal font (InScript layout). Minimum 25 WPM. Daily 5–10 minute timed tests are the most effective prep strategy.

    High Court / District Court Typists

    Usually Kruti Dev (Remington). Speed 30–40 WPM depending on court and post. Strict accuracy requirements apply.

    Select the "CPCT Exam Style" passage category in our typing test and use the 15-minute timer to simulate exact exam conditions.


    How Hindi Typing Speed (WPM) is Calculated

    Understanding the WPM formula helps you interpret scores correctly and avoid surprises in the actual exam.

    • One word = 5 characters (including spaces). This is the standard used in all Indian government typing exams, regardless of actual word length.

    • Gross WPM = (Total characters ÷ 5) ÷ minutes. Example: 500 chars in 5 mins = 500 ÷ 5 ÷ 5 = 20 Gross WPM.

    • Net WPM = Gross WPM − (Errors × Penalty). In CPCT, each error subtracts 10 words. Type at 35 gross WPM with 2 errors = 35 − 20 = 15 net WPM below qualifying threshold.

    • Accuracy % = (Correct characters ÷ Total characters) × 100. Target 90%+ to maximize your net WPM. Accuracy matters more than raw speed.


    Why Our Hindi Typing Test is Better

    FeatureOther WebsitesOur Hindi Typing Master
    Font supportKruti Dev only or Mangal only✦ Full Mangal + Kruti Dev switch anytime
    Passage categoriesGeneric paragraphs only✦ General, CPCT style, Government, Daily Life, Technology
    Timer options1–5 minutes typically✦ 1, 3, 5, 10, 20, 30 min including 15-min CPCT mode
    Practice games✗ Not available✓ Word Catch, Speed Burst, Sentence Scramble
    Progress tracking✗ None✓ Full history, WPM trend charts, accuracy trends
    Detailed statsWPM and accuracy only✦ Correct chars, errors, keystrokes, net speed, goals
    Custom passage✗ Not supported✓ Upload .txt or type your own passage
    PDF report✗ Not available✓ Auto-generated printable report after every test
    Device supportDesktop only✦ Fully responsive mobile, tablet, desktop
    CostFree but ad-heavy or feature-locked✦ 100% free all features, no login required

    How to Take the Online Hindi Typing Test

    1. 1

      Select your font Choose Mangal (Unicode / InScript) or Kruti Dev (Remington) from the toggle bar at the top. Match your exam requirement exactly.

    2. 2

      Choose a passage category Select General Hindi for daily practice, CPCT Exam Style for exam prep, or Government vocabulary for state-level exam passages.

    3. 3

      Set your timer Start with 1–3 minutes if you're a beginner. For CPCT prep use 15 minutes. For endurance training try 20–30 minutes.

    4. 4

      Enter your name It appears on the auto-generated PDF report that you can download and share as proof of practice.

    5. 5

      Start typing Press Enter or click Start. The timer begins with your first keystroke. Wrong characters highlight in red instantly so you can self-correct.

    6. 6

      Review your results After the test, check your WPM, accuracy, correct/error characters, and net speed. Download the PDF report for your records.

    7. 7

      Play typing games Switch to the Games tab and try Word Catch for raw speed, Sentence Scramble for word recognition, or Speed Burst for sustained endurance.


    How to Improve Hindi Typing Speed

    These proven strategies will take you from beginner to exam-ready faster:

    • Prioritise accuracy over speed. In exams like CPCT and SSC, errors reduce your net WPM by 10 words each. Typing at 25 WPM with 95% accuracy outscores 40 WPM with 80% accuracy every time.

    • Stop looking at the keyboard. Build muscle memory by keeping your eyes on the screen. Cover your keyboard with a cloth during practice if needed this is the single biggest speed-booster for most learners.

    • Use correct posture and home row position. Sit upright, keep wrists flat, feet flat on the floor. Home row: left hand on ASDF, right hand on JKL;. This is the foundation of touch typing.

    • Practise daily for 20–30 minutes. Consistency beats length. Daily 20-minute sessions produce faster results than weekend marathon sessions. Use our Practice Mode (no timer) for warm-ups.

    • Master both layouts. If your target exam requires Kruti Dev, practise the Remington keyboard layout daily. Also keep up Mangal practice as it is increasingly required in modern exams.

    • Analyse error patterns. After every test, check which characters you miss most. For most Hindi typists, matras (ि ी ु ू ा ो ौ), half-characters (क् ख् ग्), and conjuncts (क्ष त्र ज्ञ) cause the most errors. Target these in Practice Mode.

    • Set goals and track progress. Use the Goal WPM and Goal Accuracy fields in our test. The My Progress tab shows your WPM and accuracy trends over time so you can clearly see improvement.

    Hindi Typing Speed Scale — Where Do You Stand?

    0–15 WPM
    🌱 Beginner
    15–25 WPM
    ⭐ Developing
    25–40 WPM
    ⭐⭐ Intermediate
    40–60 WPM
    ⭐⭐⭐ Advanced
    60+ WPM
    🏆 Expert

    Frequently Asked Questions

    Q Which font should I use for the CPCT Hindi typing test?
    CPCT (Madhya Pradesh) requires Hindi typing in Mangal font using the InScript keyboard layout. Select "Mangal" in our font toggle before practising. The minimum qualifying speed is 20 net WPM over 15 minutes.
    Q Is this Hindi typing test completely free?
    Yes no login, no subscription, no hidden limits. All features including practice games, progress tracking, PDF reports, and custom passages are free forever.
    Q Can I practise Kruti Dev typing without installing any font?
    Yes. Our tool handles Kruti Dev input directly in the browser no font installation needed. For offline software practice, you can also download Kruti Dev 010 font for free.
    Q How is net WPM calculated in Hindi exams?
    Net WPM = Gross WPM − (Errors × penalty). In CPCT, each error carries a 10-word penalty. So 35 gross WPM with 2 errors = 35 − 20 = 15 net WPM below the qualifying threshold. This is why accuracy-first practice is essential.
    Q What is the difference between InScript and Remington layout?
    InScript is phonetic used with Mangal font, keys correspond to Hindi sounds. Remington — used with Kruti Dev — is based on old typewriters and is not phonetic. See our Mangal keyboard layout guide for a visual comparison.
    Q How do I convert Kruti Dev text to Unicode?
    Use our KrutiDev to Unicode converter paste your Kruti Dev text and get instant Unicode output. Useful when submitting government documents or forms that require Unicode Hindi.

    Conclusion

    Whether you are preparing for the CPCT Hindi typing test, SSC, UPSSSC, Rajasthan Patwari, or simply want to type Hindi faster — consistent, structured practice is the only path to improvement. Our free online Hindi typing test gives you Mangal font support, Kruti Dev support, exam-style passages, real-time error tracking, practice games, progress charts, and PDF reports.

    Start with the 1-minute test to get your baseline. Work up to 5 and 10-minute sessions. Use Practice Mode to build muscle memory without the pressure of a timer. With 20–30 minutes of daily practice, most learners reach the CPCT qualifying speed of 20 net WPM within 4–6 weeks.

    Start Your Free Hindi Typing Test Now

    100% free. No login required. Supports Mangal & Kruti Dev. Works on mobile and desktop.

    शुरू करें — Begin Test

    The most complete online Hindi typing test in India — free forever.

    Scroll to Top