Autonomous Agentic AI Pipeline

Free tool, runs in this tab, paste mode sends nothing anywhere

Keyword density checker that shows what real pages have

Paste a draft or a whole page and the counter below gives you the word count, the most frequent single words, and the two and three word phrases, each with its count and its density. Every figure comes out of a rule printed further down the page, so you can reproduce it by hand.

Most density checkers hand you a number and then tell you to aim for something. This one shows you the distribution instead. The same counting rule was run over the served HTML of the homepages of a fixed list of major hosts on 2026-09-06, one HTTPS GET each, and the median and the ninetieth percentile of their top term density sit in section 03. Your number lands next to real numbers.

No target density appears anywhere on this page. Google's spam policy defines keyword stuffing in words, and the words carry no threshold, so quoting a percentage would be inventing one.

  • 58major homepages measured on 2026-09-06, one HTTPS GET each
  • 948.5median words in the served HTML of the ones carrying text
  • 3.86%median density of the most frequent non stop word
  • 7.82%ninetieth percentile of that same density

01Paste the text and count it

Paste text or page source, or type an https address and press Fetch. Script, style and noscript blocks go first, then every remaining tag, then the entity references are unescaped, which is the order the census used, and the same three steps run on plain prose, where they have nothing to remove. Fetch is the one network request this page can make. It asks this site's relay for the served HTML of the address you typed, drops the answer into the box, and counts it by the same rule as a paste. Nothing is fetched until you press the button, and the relay's answer, including any error, is printed under the field word for word.

Once you have counted something, the result adds one line placing your top term density against the median and the ninetieth percentile from the census in section 03. Read that as a comparison and not as a target, because nothing on this page recommends a density.

The stop word list, in full

Below is the list the toggle uses, and the counter reads it out of this page rather than carrying its own copy, so the printed list and the running code cannot disagree. It holds the words shown words. Stop words stay in the denominator either way, and the toggle only decides whether they can appear in the ranked output.

the a an and or of to in on for with is are was were be been by at from as that this it its into your you we our us they their them he she his her not no if but so than then there here what which who how when where why can will would should could may might do does did have has had about over under more most very just also all any some such only own same one two new get use per via

Any fixed list is a choice. Snowball publishes an English stop word list as a plain text file, and its own header says the comments begin with a vertical bar, which is what a citable list looks like. Ours is the list the census ran with, printed here so a figure on this page can be reproduced rather than trusted. See the Snowball list for a published alternative.

02How every figure here is computed

Four steps, and each one is a line you can run yourself.

  1. Strip. Script, style and noscript blocks are removed whole, then every remaining tag becomes a space, then entity references are unescaped, the five named ones for ampersand, less than, greater than, quote and apostrophe to their character and every other reference to a space. The three steps run on everything in the box, pasted or fetched, so prose with no markup passes through unchanged apart from entity references. The HTML Standard says the script element lets authors include dynamic script, instructions to the user agent, and data blocks, and that the style element embeds CSS style sheets, so neither is text a reader sees. The same standard says a noscript element represents nothing if scripting is enabled, and its rendering rules set noscript to display none where scripting is supported.
  2. Tokenise. Every run matching an ASCII letter followed by one or more ASCII letters or apostrophes becomes one token, lowercased. So a token is at least two characters, an apostrophe inside a word keeps the word whole, and digits, other punctuation and lone letters never count as words. The census ran the identical expression, and the test folder behind this page recounts the stored census HTML with the code on this page and gets the census figures back to the digit.
  3. Count. Term frequency is the raw number of occurrences of a term in the text, which is what the information retrieval literature calls term frequency before any weighting is applied.
  4. Divide. Density is that count divided by the total token count, expressed as a percentage and rounded to two decimal places. Phrase density uses the same denominator, so a two word phrase counted four times in a thousand token page reports the same way a single word counted four times does.
  5. Phrases, when the toggle is on. A two or three word window that contains a stop word is dropped whole, rather than the stop word being deleted and its neighbours glued together. Deleting would invent an adjacency your text does not have.

The stop word toggle changes the ranked lists and the phrases, never the denominator. That matters because the census divided by every token, and a page here would be worthless if its arithmetic did not match the arithmetic it is being compared to.

One consequence worth knowing before a phrase surprises you. Tags become spaces, so all the text on a page arrives as one stream, and a phrase can straddle the end of your title and the start of your first heading. Every tool that strips markup this way does it. Few of them say so.

What the title and heading rows mean

Paste HTML with a keyword filled in and the result reports whether that keyword appears in the title element and in the first heading. The two checks are separate on purpose. The HTML Standard says the title element represents the document's title or name, and it notes that a document's title is often different from its first heading, so a term can sit in one and be missing from the other. The first heading row reads whichever of h1 to h6 comes first in the source, since the standard says those elements represent headings for their sections. Google, for its part, says Search uses several listed sources to determine the title link it shows, and the main visual title shown on the page is one of them.

Sources for this section. WHATWG HTML, scripting, WHATWG HTML, document metadata, WHATWG HTML, rendering, WHATWG HTML, sections, Introduction to Information Retrieval, term frequency, and Google Search Central, title links.

03The density real homepages carry

Of the 58 homepages that answered with HTTP 200 and were measured on 2026-09-06 by a single HTTPS GET each, 48 served at least two hundred words in their HTML, and across those the median word count was 948.5 words. The rest served almost nothing before script ran, which is a finding in itself and the reason the text figures are reported over the smaller group.

Across that same set of 48 homepages, captured 2026-09-06 with one HTTPS GET per host, the median density of the most frequent non stop word was 3.86 percent, and the ninetieth percentile of that density was 7.82 percent. 33 of the 48 carried a top term above three percent. 13 of them carried one above five percent.

Homepage text census, 58 hosts measured, one HTTPS GET each, captured 2026-09-06
FigureValueRead from
Homepages measured58headline.hostsMeasured
Of those, serving at least two hundred words48headline.hostsTextMeasured
Median word count of those homepages948.5headline.wordsMedian
Median top term density, percent3.86headline.topTermDensityMedianPct
Ninetieth percentile top term density, percent7.82headline.topTermDensityP90Pct
Homepages with a top term above three percent33headline.hostsDensityOver3Pct
Homepages with a top term above five percent13headline.hostsDensityOver5Pct

Every row is read by the build from the census file, served from this origin, at the key named beside it. Nothing in that table was typed by hand. If the file and the page disagree, the file wins and the page gets fixed.

What Google's documentation actually says

The reason this page reports a distribution rather than a target is that the policy everyone is worried about does not contain a number. Google's spam policies say keyword stuffing refers to the practice of filling a web page with keywords or numbers in an attempt to manipulate rankings in Google Search results. The test that follows is written in words, not in arithmetic. Google says these keywords often appear in a list or group, unnaturally, or out of context, and its own worked example is repeating the same words or phrases so often that it sounds unnatural.

The examples that follow are equally concrete. Google names blocks of text that list cities and regions that a web page is trying to rank for, and lists of phone numbers without substantial added value. Read the whole section and no percentage appears in it.

The length question gets the same treatment. Google's SEO starter guide says there is no magical word count target, minimum or maximum, and its helpful content guidance answers the question of a preferred word count with no, we don't. The starter guide does warn that excessively repeating the same words over and over, even in variations, is tiring for users. And on the tag people still ask about, Google says Search does not use the keywords meta tag.

Quoted from Google Search Central, spam policies, the SEO starter guide, and the helpful content guidance, all fetched 2026-09-06.

04Questions people bring to this tool

Whether an ideal keyword density exists

Not one that Google publishes. The spam policy defines keyword stuffing with a contextual test, and the starter guide says there is no magical word count target, minimum or maximum. The helpful content guidance is blunter still, answering the preferred word count question with no, we don't. So the honest answer a checker can give is a measurement and a comparison. Yours is in section 01, the distribution it sits in is in section 03, and the judgement about whether your draft reads unnaturally stays yours.

Why the stop word toggle moves the phrases more than the words

Dropping the commonest words costs you very little on single term ranking, since those words carry almost no selective value, and the information retrieval literature calls them stop words for exactly that reason. Phrases are a different matter. The same text notes that what holds for keyword search is not true for phrase searches, and gives the example that the meaning of flights to London is likely to be lost if the word to is stopped out. Toggle the box on this page and watch your two and three word lists change while the single word list barely moves.

One more thing worth knowing before you treat a stop list as a description of search. The same reference states that web search engines generally do not use stop lists. A stop list here is a measurement convenience, chosen so the top term is a word that means something, not a claim about how anything indexes your page.

Why a homepage number is a poor yardstick for an article

The census on this page is homepages, and a homepage is the least typical page on any site. HTTP Archive hits the same wall and says so plainly. Its crawl included only home pages, and its own methodology warns that a home page is not necessarily representative of the entire website. Its 2022 SEO chapter reports a separate median raw word count for desktop and for mobile, measured from source HTML before JavaScript runs, and a separate median count of rendered words on mobile, which tells you how much the answer depends on where you stand when you measure.

So use section 03 the way you would use any reference distribution. It tells you what large homepages looked like on one day under one rule. Your article is a different animal, and the counter above will happily measure it, but the comparison line is a rough bearing rather than a verdict.

Whether any of your text leaves the browser

Not in paste mode. The counter is a script in this page, it runs on the string in the textarea, and no beacon or form post exists in it. Open the network panel and count the requests while you paste. The page loads two font files from this origin and nothing else, which also means paste mode works with the network cable out.

Fetch mode is the one exception, and it happens only when you press the Fetch button. The page then makes a single GET to this site's relay at awp-fetch.lipmichal.workers.dev carrying the address you typed, and the relay returns the served HTML of that address, which lands in the box and is counted here like a paste. Your own pasted text is never sent. The relay accepts https addresses only, caps the size it returns, follows a short chain of redirects and gives up on a slow host, and whatever it answers, an HTTP status, a truncation flag or an error, is printed under the field word for word rather than smoothed over.

What the counter gets wrong outside English

Word boundaries are the hard part. Unicode Annex 29 states that it is not possible to provide a uniform set of rules that resolves all word boundary issues across languages, and that reliable detection of word boundaries in languages such as Thai, Lao, Chinese, or Japanese requires the use of dictionary lookup. A letter run tokeniser has no dictionary, so treat any figure it gives for those scripts as meaningless rather than merely approximate.

Sources for this section. Google spam policies, Introduction to Information Retrieval, stop words, Web Almanac 2022, SEO, Web Almanac methodology, and Unicode Annex 29.

Read before acting on any number above

05What this tool and this census cannot tell you

  • LIMITA density figure is a description of your text and nothing more. No number here predicts or explains a ranking, and the page states no target because the documentation it quotes states none.
  • LIMITThe census is a fixed list of large, well resourced hosts, not a random sample of the web, and homepages only, which are the least typical page of any site.
  • LIMITOne fetch per host from one network location with a desktop browser user agent, served HTML only, nothing rendered by script, so tags injected by JavaScript are not seen.
  • LIMITThe top term density is a homepage figure under one stop word list and says nothing about ranking. Text figures count only hosts whose served HTML held at least 200 words, because a homepage that renders by script serves almost no text.
  • LIMITThe counter reads the string in the box, whether you pasted it or the relay fetched it. It does not run JavaScript, so it sees what a server sends rather than what a browser finally paints, and a fetched page is the relay's view from its network location, which can differ from what the same address serves to you.
  • LIMITTokens are runs of Latin letters, so the counts are wrong in scripts that need dictionary lookup to find a word boundary, and the tool says so rather than printing a confident figure.
  • LIMITNo ranking, indexation, traffic, or revenue outcome is promised by this site or by the product it sells.
  • LIMITNo end to end run from intake through indexation has been completed by anyone, including the seller, and there are currently no customers, so there are no reviews and no case studies.
  • LIMITThe sixty day refund covers whether the software is what this site describes and whether it runs, and never whether a search engine chose to index or rank anything built with it.

06Where these numbers come from

I fetched the homepage of every host on the list this site already used for its robots.txt census, one HTTPS GET each on 2026-09-06, redirects followed, and kept the served HTML. A separate implementation then recounted every headline figure from that stored HTML, and a figure the two computations disagreed on is held rather than shown. The build reads the agreed values out of the census file and substitutes them into this page, so no census number on it was typed by a person or by a model. A value that could not be fetched is held as null and rendered as unknown, never quietly replaced with something flattering.

The detail that changed how I report this. A good number of those homepages came back with almost no text at all, because everything a reader sees is assembled by script after the HTML arrives, and a density computed over a couple of dozen words is noise. So the text figures are reported over the hosts whose served HTML held at least two hundred words, and the count of hosts that fell short is in the census file rather than quietly dropped. The same habit comes from reading crawler traffic in raw server logs, where a request calling itself Googlebot has to be checked against Google's published IP range files, because a user agent string is free text that anything can send.

I run four small utility sites through Search Console and publish their impression and click counts on this site rather than a forecast. Every table on a page here is recomputed by code from a dataset file published beside the page, with the capture date and the instrument stated in the same sentence as the figure. Where the page and the repository disagree, the repository is right.

Built by the thing it sells

The pipeline that produced this page refuses to type a number

The tool, the census and the tokens on this page are output from the build pipeline sold here. It will not let a page state a figure that code did not compute from a validated dataset, it blocks a draft that only restates what already ranks, and it runs on your machine with no hosted service and no account. Read the limits above first, then the terms.