0words

Word Counter

Advanced text analysis with real-time insights. All processing happens in your browser.

Text is analysed locally — nothing you type is ever uploaded.
Paste or type your text here...
Text Cleaning
Analysis Highlights
Primary Metrics
Words0
Characters0
Characters (no spaces)0
Sentences0
Paragraphs0
Time Estimates
Reading (200 wpm)0 min
Speaking (130 wpm)0 min
Advanced Metrics
Avg word length0 chars
Avg sentence length0 words
Unique words0
Lexical diversity0%
Word Goal
Export
Runs entirely in your browser. No uploads. Your files stay private.

How the Word Counter Calculates Each Statistic

Word Counter computes its statistics with native JavaScript String methods and a small set of RegExp patterns. The character count uses text.length (which counts UTF-16 code units, not graphemes — see below for the emoji caveat). Characters-without-spaces strip whitespace using /\s/ before counting. Word counting lowercases the input, replaces non-word, non-apostrophe, non-hyphen characters with spaces, splits on /\s+/, and filters empty strings.
The whitespace-split approach is the standard newsroom and word-processor word count and matches Microsoft Word and Google Docs within a few percent. It works for any language that separates words with whitespace — English, French, German, Spanish, Russian, and so on — but it produces incorrect counts for Chinese, Japanese, Korean, and Thai, which write words contiguously without spaces. For accurate CJK word boundaries you would need Intl.Segmenter with the 'word' granularity, which is more expensive and currently not used here for performance reasons.
Sentence detection splits on /[.!?]+/ and filters empty fragments. This is fast but naive: 'Mr. Smith arrived at 3 p.m.' counts as four sentences because of the abbreviation periods. If your text has many abbreviations, the sentence count and the average words-per-sentence statistic will be skewed. Paragraph detection uses /\n\s*\n/ to split on blank lines, which matches the convention used by Markdown and most word processors.
Keyword density excludes a built-in stopword list (the most common articles, conjunctions, prepositions, and pronouns) and considers only words of three or more characters. Frequency is counted in a JavaScript Map keyed by the lowercased word. The top five keywords are selected by sorting the entries by count and slicing — O(n log n) over the unique-word count, which is fast even for tens of thousands of words.
Reading time uses 200 words per minute (the conservative end of the adult silent-reading range; the academic average is closer to 238 wpm but 200 leaves a buffer for unfamiliar material). Speaking time uses 130 wpm, which matches the typical conversational pace and is slightly slower than a presentation pace of 150 wpm. Both numbers round up so partial minutes show as the next whole minute.
Lexical diversity is the ratio of unique words to total words, presented as a percentage. A short text trivially has high diversity (every word is likely unique); a long text with a low diversity score signals repetitive vocabulary. This is a rough version of the Type-Token Ratio used in linguistics and is most informative when comparing two texts of similar length rather than as an absolute measure.
All statistics recompute via a useMemo hook on every text change, so the panel updates as you type. Each pass is O(n) over the input, which means even multi-thousand-word essays stay interactive. Settings, including the live tab, persist via localStorage. No fetch call is made and no analytics on the input is sent — the page operates entirely client-side.

Common Use Cases

01

Essay length tracking

Watch live word and sentence counts as you write to hit a 1500-word essay target without trimming the final paragraph.

02

Twitter and Bluesky drafts

Track exact character counts (including emoji-aware UTF-16 surrogate pairs) so a thread post fits the 280 or 300 character cap.

03

SEO content briefs

Hit the recommended 800 to 2200 word range for ranking blog posts and check the top-5 keywords match the target query.

04

LinkedIn article calibration

Aim for the 1900 to 2000 word sweet spot LinkedIn algorithm research suggests for native articles, with sentence-length checks.

Frequently Asked Questions

The text is lowercased, non-word characters (other than apostrophes and hyphens) are replaced with spaces, then the result is split on /\s+/ and empty strings are filtered out. Hyphenated compounds (state-of-the-art) count as one word. Contractions (don't, it's) count as one word. Numbers count as words. The match against Microsoft Word's count is typically within one or two percent.
Characters are counted as UTF-16 code units via String.prototype.length. Most ASCII text counts intuitively. Emoji and some CJK characters above the Basic Multilingual Plane occupy two UTF-16 code units (a surrogate pair), so a single visible emoji can show as 2 characters. For grapheme-accurate counting you would need Intl.Segmenter; this tool prioritizes speed and matches the count Twitter and most APIs report.
Word count divided by 200 words per minute, rounded up to the next whole minute. Speaking time uses 130 wpm. Two hundred is on the conservative end of the adult silent-reading range — the academic average from Brysbaert (2019) is 238 wpm, but 200 leaves a margin for unfamiliar vocabulary.
Sentences are detected by splitting on /[.!?]+/. Abbreviations like 'Mr.', 'i.e.', and 'p.m.' end up counting as sentence boundaries because the regex does not understand them. If your text has many abbreviations, expect the count to be inflated. The average-words-per-sentence statistic will be deflated as a result.
Words are lowercased and checked against a built-in stopword list (common articles, conjunctions, prepositions, and pronouns). Words shorter than three characters are excluded. The remaining words are counted in a Map and the top five by frequency are displayed with both count and percentage of total word count. Useful for spotting whether your target query actually appears in the text.
The ratio of unique words to total words, as a percentage. A 100-word passage with 80 unique words has 80% diversity. Short passages have high diversity by default, so the score is most useful for comparing two texts of similar length. Below 40% on a long article suggests heavy repetition.
It works for any language that separates words with whitespace — most European, Slavic, and Indic scripts. It does not produce correct word counts for Chinese, Japanese, Korean, or Thai, which write words contiguously without space delimiters. For those languages, use Intl.Segmenter or a language-specific tokenizer.
No hard limit. The statistics computation is O(n) and memoized, so multi-thousand-word essays stay interactive. Tens of thousands of words still update on each keystroke without noticeable lag on modern hardware. Memory use is dominated by the keyword frequency Map.
No. The counter runs synchronously inside the browser tab. There is no fetch call and no analytics on the input. You can disconnect from the network after the page loads and the counter keeps working — useful for checking the length of unpublished or NDA-covered material.
View preferences (which tab is active, whether the keyword panel is expanded) are saved to localStorage so the layout is consistent on your next visit. The text itself is intentionally not persisted — refreshing the page clears it, which is the correct privacy default for a tool that often sees draft material.

Step-by-step guide

How to check word count online

Walk through every step with screenshots, format-specific tips, and the platform-by-platform limits you need to know.

Advertisement