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}); } }); }/* ─── BOOT ─── */ initTabs(); initThemeToggle(); initFontModeToggle(); initTypingTest(); initPracticeMode(); initWordCatch(); initSentenceScramble(); initSpeedBurst(); initProgress(); initShortcuts(); updatePersonalRecommendations();})();

    If you want to type in Hindi quickly and correctly, you're in the right place. Hindi typing is no longer just a skill for typists: it matters for government exams, data-entry work, journalism, content creation and even texting friends.

    The demand for native-language content is exploding in India. According to a 2023-24 Ipsos report, around 700 million Indians are now online. With 84% of users consuming regional content, the need for quick, accurate Hindi typing in data-entry jobs, government roles, and newsrooms is higher than ever.

    States like Madhya Pradesh now require a Computer Proficiency Certification Test (CPCT) for clerical posts, combining a multiple-choice exam with rigorous Hindi and English typing tests. A reliable online Hindi typing test - one that is free, trustworthy, and tailored to different keyboard layouts - is an invaluable tool for your preparation.

    What Is a Hindi Typing Test?

    A typing test measures how many words you can type correctly in a set time. Most platforms count five characters as one word. They use three main numbers:

    • Gross speed - the total characters you type, divided by five and by the number of minutes. It shows your raw speed.
    • Net speed - your gross speed minus a penalty for mistakes. In some exams, each error can cost the value of ten words, so typing accurately really matters.
    • Accuracy - the percentage of words typed without mistakes. Higher accuracy means your net speed is closer to your gross speed.

    A good Hindi typing test doesn't just tell you your speed. It highlights which words cause the most trouble and encourages you to practise those words. Over time, repeating common patterns builds muscle memory, reduces errors and lifts your speed. If you're searching for a hindi typing test Mangal font or a hindi typing test Kruti Dev experience, understanding these metrics will help you interpret your results.

    Mangal and Kruti Dev

    Unicode Standard

    Mangal Font

    Most modern devices and websites use the Mangal font. It's a Unicode-based Devanagari font created by Microsoft. Because Mangal follows the Unicode standard, any text typed in Mangal can be copied and shared without needing special fonts.

    The associated InScript keyboard layout is phonetic: each key roughly matches the sound of the Hindi letter. This makes it intuitive to learn, and the layout has been standardized by the Indian government.

    Ideal for: Emails, websites, digital documents, and any situation where your text needs to display correctly on different devices.

    Legacy System

    Kruti Dev Font

    Kruti Dev comes from the era of typewriters. It's a non-Unicode font where Hindi letters are mapped to English keys. The layout, known as the Remington layout, is not phonetic - you have to memorise where each Hindi character sits.

    Many government exams still require Kruti Dev. Experienced typists appreciate that the layout allows high speeds once you know it well, but beginners can find it challenging.

    The font isn't widely supported online: you need to install it, and converting between Krutidev font and Unicode font doesn't always work perfectly.

    Mangal vs. Kruti Dev: Key Differences

    AttributeMangal (Unicode)Kruti Dev (Non-Unicode)
    CompatibilityWorks across modern web browsers, apps and devicesRequires installation; used mostly in legacy systems
    Keyboard layoutInScript, phonetic and standardizedRemington, non-phonetic; keys need memorisation
    Use casesEmails, blogs, social media, digital documentsGovernment exams, court typing, older data-entry systems
    Learning curveEasier to learn; intuitive mappingSteeper learning curve but can yield very high speeds
    Exam requirementsUsed in CPCT and many modern testsRequired in some SSC, UPSSSC and Rajasthan exams

    Our typing site supports both fonts. You can switch between Mangal and Kruti Dev at any time, so you're ready for whichever exam or job you're preparing for.

    CPCT and Other Government Exams: Typing Requirements

    Some government jobs require a certified typing test. The CPCT exam in Madhya Pradesh is a good example. It has a multiple-choice paper and separate typing tests in Hindi and English. The Hindi test lasts 15 minutes, and you need at least 20 net words per minute to pass. Once you earn the certificate, it is valid for seven years.

    A good score on the CPCT opens doors to roles such as Patwari (village revenue officer), Panchayat secretary, assistant grade-III, data-entry operator and jobs in the police department. Preparing for this exam means practising daily for at least 30 minutes. It's wise to practise on both the InScript and Remington layouts because different exams specify different keyboards.

    Feature Comparison

    FeatureOther WebsitesOur Hindi Typing Master
    Font SupportLimited or fixed Full support for Mangal + Kruti Dev
    Typing ExperienceBasic test only Full online Hindi typing test with interactive UI
    Practice VarietyRandom words or passages Real practice + smart exercises
    Games & Engagement Not available Word Catch, Speed Burst, Sentence Scramble
    Exam PreparationBasic simulation Advanced CPCT typing test Hindi style mode
    Feedback SystemOnly WPM & accuracy Deep insights + error tracking + improvement tips
    Progress Tracking None History, charts, performance trends
    CustomizationLimited Themes, fonts, timer control
    Device SupportMostly desktop-focused Fully responsive (mobile + desktop)
    CostFree but limited 100% free online Hindi typing test with full features
    ThemeOnly light mode Light Dark

    How to Use Our Typing Test

    Getting started is easy:

    • Choose a font - Select Unicode (Mangal) or Kruti Dev.
    • Pick a mode - Exam Mode for serious practice, or Word Catch, Sentence Scramble or Speed Burst for fun.
    • Set a time limit - Choose from 1 to 20 minutes. For CPCT practice, try 15 minutes.
    • Enter your name - This appears on your report.
    • Begin - The timer starts when you type your first letter. Follow the highlighted text. Our interface keeps your eyes on the screen, which helps you develop muscle memory.
    • Review and learn - After the test, check your report. It shows your speed, accuracy and errors. Use this to improve.
    • Practise regularly - Daily practice builds skill. Try different fonts and modes to keep it interesting.

    Tips to Improve Your Hindi Typing

    Here are some practical tips to help you type faster and more accurately:

    • Sit properly and use the right fingers - A stable posture and proper finger placement reduce fatigue and improve control.
    • Look at the screen, not the keyboard - At first, you may need to glance at the keys, but try to focus on the screen. This builds muscle memory.
    • Accuracy before speed - Experienced typists know that correct typing comes first. When you type accurately, speed follows.
    • Practise daily - Even 20-30 minutes a day makes a big difference.
    • Practise both fonts - If your exam uses Kruti Dev, start learning the Remington layout now. But also keep up with Mangal since it's widely used.
    • Analyse your mistakes - After each session, note which letters or words you often miss. Practise those specifically.
    • Read Hindi content - Reading newspapers, stories and poems improves vocabulary and comfort with the language.

    Conclusion

    Being able to type in Hindi quickly and accurately can open up many opportunities - whether you're sitting for a government exam, working in the private sector, or simply communicating online. A good online Hindi typing test is more than a stopwatch. It should help you understand the difference between Mangal and Kruti Dev, practise on the layout required for your exam and track your progress over time. The CPCT requirement of 20 net WPM and a certificate that lasts seven years shows how important regular practice and accuracy are.

    Our Hindi Typing Master gives you everything you need to succeed. With support for both fonts, fun practice games, an accurate exam simulator, deep analytics, flexible settings and free access, it's designed to help you improve quickly. Whether you're preparing for CPCT, SSC or other exams, or just want to type faster, we've got you covered.

    Ready to Practise?

    Start Your Free Hindi Typing Test

    Click here to try our test. Practise regularly, follow the tips above and watch your Hindi typing skills grow. For those looking for a free online Hindi typing test that supports both fonts, you won't find a better place.

    Scroll to Top