Tools

SEO Text Analyzer.

Real-time metrics, keyword density, readability scoring, and content recommendations.

01 / Content optimization

Live analyzer

Editor

Drop a .txt or .docx file or click to upload

Ready to analyze
0Words
0Chars
0Sentences
0Paragraphs
Readability--
-
Grade Level
Reading Time0m 0s
Speaking Time0m 0s
Avg Word Length0
Sentiment
Neutral (0.00)
Density
Type to see analysis...
Quick Actions
Quick Tip: Your content appears to be well-optimized.

02 / Capabilities

What it measures

Every signal,
in one panel.

The analyzer computes each metric locally, as you type.

01

Readability

Flesch-Kincaid scoring with grade level, reading time, speaking time, and average word length.

↗
02

Sentiment

Positive, neutral, or negative tone detection with a scored indicator.

↗
03

Keyword Density

One, two, and three-word phrase density with visual frequency bars and copyable reports.

↗
04

Quick Actions

Duplicate finder, space cleaner, capitalization, word and character counters — plus JSON export.

↗

Make the next move yours.

Make every word
earn its rank.

Optimize with HGM ↗
'; }).join(''); } function updateSuggestion(wordCount, sentenceCount, readingLevel) { var box = document.getElementById('suggestionBox'); var text = document.getElementById('suggestionText'); if (wordCount === 0) { box.style.display = 'none'; return; } box.style.display = 'block'; var suggestions = []; if (wordCount < 300) suggestions.push('Aim for at least 300 words for better SEO performance.'); else if (wordCount > 2000) suggestions.push('Consider breaking this into multiple articles for better readability.'); if (sentenceCount > 0 && wordCount / sentenceCount < 12) suggestions.push('Consider varying sentence length for better flow.'); if (readingLevel.indexOf('College') > -1 || readingLevel.indexOf('Grad') > -1) suggestions.push('Your content is quite complex. Consider simplifying for a broader audience.'); if (suggestions.length === 0) suggestions.push('Your content appears to be well-optimized. Great job.'); text.textContent = suggestions.join(' '); } document.getElementById('clearBtn').addEventListener('click', function () { input.value = ''; countStats(); input.focus(); }); document.getElementById('importBtn').addEventListener('click', function () { document.getElementById('fileInput').click(); }); [1, 2, 3].forEach(function (n) { document.getElementById('btn-n' + n).addEventListener('click', function () { currentN = n; [1, 2, 3].forEach(function (id) { document.getElementById('btn-n' + id).classList.toggle('active', id === n); }); countStats(); }); }); document.getElementById('copyDensityBtn').addEventListener('click', function () { if (input.value.length === 0) return; var textToCopy = 'Keyword Density (x' + currentN + '):\n'; var items = densityContainer.querySelectorAll('.density-item'); items.forEach(function (item) { textToCopy += item.querySelector('.d-word').innerText + ': ' + item.querySelector('.d-count').innerText + '\n'; }); navigator.clipboard.writeText(textToCopy).then(function () { alert("Analysis copied to clipboard"); }); }); document.getElementById('qa-add').addEventListener('click', function () { if (input.value.length > 0) { input.value = input.value + '\n\n[New paragraph added]'; countStats(); } }); document.getElementById('qa-count').addEventListener('click', function () { var words = (input.value.match(/\b[\w'-]+\b/g) || []).length; alert('Total word count: ' + words); }); document.getElementById('qa-dupes').addEventListener('click', function () { var words = input.value.toLowerCase().match(/\b[\w'-]+\b/g) || []; var freq = {}; words.forEach(function (w) { freq[w] = (freq[w] || 0) + 1; }); var duplicates = Object.keys(freq).map(function (k) { return [k, freq[k]]; }) .filter(function (e) { return e[1] > 2; }).sort(function (a, b) { return b[1] - a[1]; }); if (duplicates.length === 0) { alert('No significant duplicates found.'); } else { var msg = 'Most repeated words:\n'; duplicates.slice(0, 10).forEach(function (e) { msg += '- ' + e[0] + ': ' + e[1] + ' times\n'; }); alert(msg); } }); document.getElementById('qa-spaces').addEventListener('click', function () { input.value = input.value.replace(/\s+/g, ' ').trim(); countStats(); }); document.getElementById('qa-caps').addEventListener('click', function () { var text = input.value; input.value = text.split('. ').map(function (s) { return s.charAt(0).toUpperCase() + s.slice(1); }).join('. '); countStats(); }); document.getElementById('qa-chars').addEventListener('click', function () { alert('Character count: ' + input.value.length); }); document.getElementById('fileInput').addEventListener('change', function (event) { var file = event.target.files[0]; if (!file) return; var reader = new FileReader(); reader.onload = function (e) { input.value = e.target.result; countStats(); }; reader.readAsText(file); }); document.getElementById('exportBtn').addEventListener('click', function () { var text = input.value; if (!text) { alert('No content to export.'); return; } var words = (text.match(/\b[\w'-]+\b/g) || []).length; var chars = text.length; var sentences = (text.match(/[^\.!\?]+[\.!\?]+/g) || []).length || (text.length > 0 ? 1 : 0); var report = { title: 'SEO Text Analysis Report', timestamp: new Date().toISOString(), metrics: { wordCount: words, characterCount: chars, sentenceCount: sentences, readingTime: Math.round(words / 275) + ' min', readability: document.getElementById('readingLevel').textContent, sentiment: document.getElementById('sentimentLabel').textContent, avgWordLength: document.getElementById('avgWordLength').textContent }, density: [] }; densityContainer.querySelectorAll('.density-item').forEach(function (item) { report.density.push({ keyword: item.querySelector('.d-word').innerText, stats: item.querySelector('.d-count').innerText }); }); var blob = new Blob([JSON.stringify(report, null, 4)], { type: 'application/json' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'seo_analysis_' + new Date().toISOString().slice(0, 10) + '.json'; a.click(); URL.revokeObjectURL(url); }); var dropArea = document.getElementById('fileUploadArea'); dropArea.addEventListener('click', function () { document.getElementById('fileInput').click(); }); dropArea.addEventListener('keydown', function (e) { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); document.getElementById('fileInput').click(); } }); dropArea.addEventListener('dragover', function (e) { e.preventDefault(); }); dropArea.addEventListener('drop', function (e) { e.preventDefault(); var file = e.dataTransfer.files[0]; if (file) { var reader = new FileReader(); reader.onload = function (ev) { input.value = ev.target.result; countStats(); }; reader.readAsText(file); } }); countStats(); })();