---
title: "Keyword Density Checker & Word Counter"
description: "Free keyword density checker. Analyze text for word count, reading time, sentence count, and repeated terms with phrase-aware density checks in browser."
url: https://frontendhelpers.com/keyword-density-checker
updated: 2026-10-12
---

# Keyword density checker

Paste your copy for word count, reading time and the terms you actually repeat most — analysed entirely in your browser.

## How to use this tool

There is no magic percentage that ranks a page. Keyword density as a ranking factor died years ago — modern search engines model topics and meaning through language models, not term frequency. Anyone selling you a "2.5% optimal density" is selling 2005.

What density analysis is genuinely useful for is **diagnosis**. It reveals things you can't see while writing: that your "ultimate guide to CSS Grid" mentions grid exactly twice, that one filler word dominates your copy, or that you've unconsciously used four different terms for the same concept — which dilutes the topic signal and confuses readers as much as crawlers.

## What a natural density looks like

Well-written long-form content usually lands between **0.5% and 2%** for its main phrase without any deliberate effort. If yours is far below that, the page may genuinely not be about what you think. If it's far above, it will read badly — and awkward repetition is far more likely to cost you readers than to gain you rankings.

Rather than hitting a number, aim for natural coverage: the phrase in the title, once in a heading, in the opening paragraph, and wherever it genuinely fits in the body. Then use related terms and synonyms freely — search engines understand them, and readers prefer them.

## Reading time and matching search intent

The reading-time figure here uses 200 words per minute, a deliberately conservative rate: a 2019 meta-analysis by Marc Brysbaert put the average adult silent reading speed for English non-fiction at about 238 words per minute. It's useful for two reasons: it's what readers see on Medium-style layouts and it sets expectations, and it's a proxy for whether your content depth matches the query.

That match matters more than length itself. Someone searching "what is a rem unit" wants a two-minute answer; someone searching "css grid complete guide" expects fifteen. Publishing a 4,000-word essay for a quick-answer query performs badly, and so does a thin page for a research query. Check what currently ranks for your target phrase and aim for comparable depth.

## Reading the most-used words table

The table excludes stop words and very short terms, so what remains is the vocabulary your page actually emphasises. Read it as a summary of your topic — if a stranger saw only that list, would they know what the page is about? If the top entries are generic ("things", "make", "good"), the writing is probably vaguer than it should be.

It's also a useful check for accidental repetition. Seeing the same verb eight times usually means the prose needs varying, which is a readability win regardless of what any search engine thinks.

## Counting multi-word phrases, in any language

Most density snippets tokenise with `\w` or `[a-z]`. Both are ASCII-only in JavaScript, so `café` becomes `caf` and a French or German page is quietly miscounted. Match letters and digits by Unicode property instead, with `/[\p{L}\p{N}'’]+/gu`, and include the typographic apostrophe so `s’il` and `don’t` stay single words.

The other gap is phrases. A target keyword is usually two or three words, and counting each word separately tells you nothing about whether the phrase itself appears. Slide a window along the token list, compare word by word, and count each match as many words as the phrase contains, so density remains a share of the total word count:

```javascript
const tokenise = text => text.toLowerCase().match(/[\p{L}\p{N}'’]+/gu) ?? [];

function phraseDensity(text, phrase) {
  const words = tokenise(text);
  const target = tokenise(phrase);
  if (!words.length || !target.length) return { hits: 0, density: 0 };

  let hits = 0;
  for (let i = 0; i <= words.length - target.length; i++) {
    if (target.every((t, j) => words[i + j] === t)) hits++;
  }
  // Each hit accounts for target.length of the total words
  return { hits, density: (hits * target.length / words.length) * 100 };
}

const text = 'Le café crème est prêt. Un café crème, s’il vous plaît!';
console.log(tokenise(text).length, phraseDensity(text, 'café crème'));
// 11 { hits: 2, density: 36.36… }

// Languages written without spaces need a real word segmenter
const seg = new Intl.Segmenter('ja', { granularity: 'word' });
console.log([...seg.segment('東京でコーヒーを飲む')]
  .filter(s => s.isWordLike).map(s => s.segment));
```

Comparing tokens rather than searching the raw string also avoids false hits inside longer words: a search for `art` should not match `start`. Chinese, Japanese and Thai do not put spaces between words, so no regex will tokenise them; [Intl.Segmenter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter) uses the same word-breaking rules as the browser and has been available in every major engine since 2024.

## Frequently asked questions

### What is a good keyword density?

There is no target to hit. Well-written long-form content naturally lands between roughly 0.5% and 2% for its main phrase. Density is useful for diagnosing under-coverage or awkward over-repetition, not as a number to optimise toward.

### Does keyword stuffing still work?

No — it actively harms you. Search engines have modelled meaning rather than term frequency for years, and stuffed text reads badly enough to lose the readers you were trying to attract.

### How is reading time calculated?

At 200 words per minute, a deliberately conservative figure — research puts the average adult silent reading speed for English non-fiction nearer 240 words per minute. Technical material with code samples typically reads slower, so treat it as an estimate.

### Is my text sent to a server for analysis?

No. The entire analysis runs in your browser using JavaScript. Nothing you paste is transmitted, stored or logged anywhere — you can disconnect from the internet and the tool still works.

## Related tools

- [Meta Tag Generator](https://frontendhelpers.com/meta-tag-generator): Turn your target phrase into a title and description that get clicked.
 
- [Lorem Ipsum Generator](https://frontendhelpers.com/lorem-ipsum-generator): Placeholder text for layouts while the real copy is written.
 
- [URL Slug Generator](https://frontendhelpers.com/url-slug-generator): Turn your headline into a clean, keyword-dense slug.

---

This page is a free interactive tool. Use it in your browser at https://frontendhelpers.com/keyword-density-checker
