Methodology

This page documents exactly how the tools on this site work: how text is split into sentences, how syllables are counted, the exact formula behind each score, and what triggers each diagnostic finding. Where a method is a heuristic rather than an exact measurement, we say so, and we describe the specific cases it gets wrong.

How sentences are split

There's no dictionary or grammar model behind sentence splitting — just a set of rules applied character by character. A period, exclamation mark, question mark, or ellipsis ends a sentence when it's followed by whitespace and then an uppercase letter, a digit, a quotation mark, or the end of the text. A newline always ends the current sentence too, so headings and list items with no punctuation still split correctly.

Two cases suppress a period from ending a sentence: a decimal number (a period sitting between two digits, as in "3.14"), and a period immediately after a known abbreviation ("Dr.", "U.S.", "etc.", and similar). The abbreviation list has about 60 entries, covering titles, common Latin abbreviations, and a handful of unit and organization abbreviations.

Known limitation: the abbreviation rule can't tell an abbreviation used mid-sentence from one that happens to end a sentence. "He moved to the U.S. His family stayed behind." reads as one sentence to this splitter, because "U.S." is always treated as an abbreviation, regardless of what follows it. This is a deliberate trade-off: the same rule that correctly keeps "the U.S. economy" from splitting mid-sentence also occasionally merges two real sentences when an abbreviation genuinely ends one.

How syllables are counted

Syllable counts come from a vowel-group heuristic, not a pronunciation dictionary. The word is cleaned to lowercase letters only, then a small set of rules strip silent letters before counting groups of consecutive vowels:

A small exception dictionary of about 70 common words overrides the heuristic where it's known to get the wrong answer — words like "business," "every," and "science," whose spelling misleads a vowel-group count.

Stated accuracy: against our internal test list of roughly 180 common English words, the heuristic (with its exception dictionary) matches the standard dictionary syllable count for all of them. That list can't cover every English word, and real text will include some the heuristic gets wrong by one syllable, particularly rare words with unusual vowel combinations.

The three scores

All three formulas take the same two inputs — words per sentence, and syllables per word — and weight them differently.

Flesch Reading Ease

206.835 − 1.015 × (words ÷ sentences) − 84.6 × (syllables ÷ words)

Higher is easier to read. The scale runs roughly 0–100, though the math can push very simple text above 100 or very dense text below 0.

Flesch-Kincaid Grade Level

0.39 × (words ÷ sentences) + 11.8 × (syllables ÷ words) − 15.59

The result reads as a U.S. school grade level. It uses the same two inputs as Reading Ease, so the two scores always move in opposite directions.

Gunning Fog Index

0.4 × [(words ÷ sentences) + 100 × (complex words ÷ words)]

A "complex word" is any word of three or more syllables, with three exclusions applied as implemented in this codebase:

These are the standard Gunning Fog exclusions, simplified for a heuristic pipeline with no real part-of-speech tagging. The trade-offs are documented directly in the source code alongside the implementation.

The diagnostic rules

Every rule below follows the same principle:when we're not confident, we stay silent. A checker that flags things that aren't actually problems loses a reader's trust the first time it's wrong, so every rule is built to favor missing a real issue over flagging a false one.

Long sentence

Triggers: a note at more than 20 words in a sentence, a warning at more than 28.

Limitation: word count is the only signal. A 25-word sentence with simple, well-ordered clauses can read easily; a 15-word sentence with a buried subject can read badly. Pair this rule's count with the subject-verb gap rule below for the fuller picture.

Passive voice

Triggers: a be-verb (optionally preceded by a modal or "have" auxiliary, optionally followed by up to two adverbs) immediately before a past participle. The message names the missing actor when no "by" phrase follows, and suggests moving the actor to the front when one does.

Limitation: adjectival copulas ("was tired," "is interested") are excluded via a stoplist of roughly 30 words, unless a following "by" phrase makes a genuine passive reading likely ("was determined by the vote"). The stoplist can't cover every adjective that doubles as a participle, so a handful of genuine passives may go unflagged, and a handful of edge-case adjectives may still slip through.

Nominalization

Triggers: a word of at least 8 letters ending in "-tion," "-ment," "-ance," "-ence," "-ity," "-ness," or "-al," not on a whitelist of about 40 lexicalized words ("information," "government," "business," and similar). Words with a known verb form ("utilization" → "use") get that suggestion; others get a generic message.

Limitation: the "-al" suffix also matches ordinary adjectives ("national," "hospital") that aren't nominalizations at all. To keep precision high, "-al" words are only flagged when we have a confident verb mapping in our list of about 105 entries — an "-al" word with no known verb form is left alone, even if it's a genuine nominalization.

Subject-verb distance

Triggers: when the subject sits within the first three words of a sentence (after skipping leading determiners) and at least 8 words separate it from the first recognized verb.

Limitation: there's no real parser behind this rule — just a curated list of common verbs and auxiliaries. It doesn't skip adjectives before the subject noun, so "a large number of employees…" identifies "large" as the subject rather than "number." The verb search also stops at a coordinating conjunction ("and," "but," "or"), since continuing past one risks pairing a subject with a verb from an unrelated clause. Both trade-offs favor silence over a wrong pairing.

Wordy phrase

Triggers: a case-insensitive, whole-word match against a fixed list of 80 wordy phrase-to-replacement pairs ("in order to" → "to," "due to the fact that" → "because," and similar).

Limitation: the list only matches exact phrases as written. It won't catch a wordy phrase with different verb conjugation ("has an impact on" won't match if the list only has "have an impact on"), and it won't catch a wordy pattern that isn't on the list at all. A handful of sentence-initial phrases that used to live in this list — "it is important to note that," "as a matter of fact," "for all intents and purposes," and "there is a need to" — moved to the throat-clearing and expletive rules below instead, so the same text isn't flagged twice.

Throat-clearing opener

Triggers: a case-insensitive match against a fixed list of 40 sentence-initial deadweight phrases ("It is worth noting that," "Needless to say," "At the end of the day," and similar), anchored strictly to the start of the sentence.

Limitation: the anchor to sentence-start is deliberate — it's what keeps this rule from double-flagging text the wordy-phrase rule already catches mid-sentence — but it also means the same phrase used mid-sentence ("The report notes that, needless to say, the deadline moved") goes unflagged. The list only matches exact phrases; it won't catch a paraphrase.

Expletive construction

Triggers: "there" or "here" immediately followed by a form of "be" ("there is," "there are," "here was"), or "it is" / "it was" followed by "that" within 40 characters ("it is clear that").

Limitation: unlike every other rule on this page, this one is never a warn — expletive constructions are frequently the correct choice ("There are four required fields" needs no rewrite), so the finding always reads as a prompt to check for a stronger subject, not an assertion that the sentence is wrong. A "there is/are" immediately followed by a number is suppressed entirely ("There are 12 factory settings" produces no finding at all), since a concrete count is usually the clearest phrasing available.

Meta title & description pixel limits

The meta length checker measures rendered pixel width withCanvasRenderingContext2D.measureText() rather than counting characters, because that's what actually determines where Google cuts a title or description. None of the figures below are published by Google or any social platform — they're observed conventions, gathered by checking live search results, and they can change without notice.

SERP pixel limits (verified 2026-08-03): desktop title ≈580px, mobile title ≈920px, desktop description ≈920px, mobile description ≈1,300px. Titles are measured in 20px Arial on desktop and 18px Arial on mobile; descriptions in 14px Arial on both. Measurement waits for document.fonts.ready before the first calculation and re-measures whenever a font finishes loading, since measureText() returns different results before and after a webfont swaps in.

Known limitation: these numbers are Latin-text metrics. CJK, Arabic, and Hebrew scripts render at very different widths per character, so the tool detects non-Latin script and shows a calibration warning instead of pretending the same pixel budget applies.

Social card limits (verified 2026-08-03): unlike Google's SERP, social platforms don't expose a rendering surface a browser can measure against, so these are character-count conventions instead of pixel measurements — Open Graph title 60 chars / description 155 chars, X (Twitter) card title 70 chars / description 200 chars, LinkedIn title 200 chars / description 100 chars. Treat these as looser guidelines than the SERP figures above.

Truncation: whichever limit applies, the cut always lands on the last word boundary that still fits, with an ellipsis appended — never mid-word. A single word too long to fit under any boundary falls back to a hard cut, which is the one case this tool truncates mid-word.

Methodology last changed: 2026-08-03, when the meta length checker's pixel and character-count assumptions were added.