Word & Character Count
Count words, characters, sentences and reading time as you type — nothing you write is sent anywhere.
Why this one cares about privacy more than most
A file converter handles your holiday photos. A word counter handles your cover letter, your legal complaint, your resignation email, your unpublished chapter — text that is often far more sensitive than any image, and that people paste into the first search result without thinking.
Most online counters send every keystroke, or at least the finished paste, to a server. There is no technical need for that: counting words is arithmetic a browser has always been able to do. The only reason to transmit the text is that the site was built that way.
Nothing you type here leaves this tab. You do not have to take that on faith — open your browser's network panel and type.
Counting that works in every language
Splitting text on spaces and counting the pieces works fine for English and fails completely for Chinese, Japanese and Thai, which do not put spaces between words. Counters built that way report an entire Chinese paragraph as one word.
This one uses the browser's own text segmentation, which understands where words actually begin and end in each writing system. Characters are counted as code points, so an emoji counts as one character rather than two.
Reading time, and where the number comes from
Reading time uses 238 words per minute, from Brysbaert's 2019 meta-analysis of 190 studies of silent reading of English prose. Speaking time uses 150 wpm, the conventional presentation pace.
Both are averages across many readers, and your particular reader is not average — dense technical writing runs slower, familiar prose faster. Treat them as scale, not stopwatch. What this tool will not do is quote a page count: pages are a property of layout, not of text, so any site claiming to tell you how many pages your words fill is guessing at a font and a margin it cannot see.
About the token estimate
Tokens are how language models measure text, and the count decides what fits in a model's context and what an API call costs.
This tool shows a range, not a number, and that is deliberate. Each model family tokenizes differently, several of the tokenizers are unpublished, and they change between versions — so a single confident figure would be false precision dressed up as a measurement. The range is built from the widely used rule of thumb of roughly four characters per token for English prose. Code, non-Latin scripts and unusual formatting all run denser, so expect the true figure to sit at the higher end for those.
If you need an exact count for a specific model, use that provider's own tokenizer. What this gives you is a reliable sense of the order of magnitude, which is what the question usually actually is.
For machines
window.AOTextStats.count(text) -> {characters, charactersNoSpaces, words, sentences, paragraphs, lines, bytes, readingSeconds, speakingSeconds, tokens:{low,high}, longestWord, averageWordLength} — Full statistics for a string. Words are segmented with Intl.Segmenter, so scripts without spaces (Chinese, Japanese, Thai) count correctly. Tokens are returned as a RANGE, never a single number.window.AOTextStats.limits(characterCount) -> [{name, max, remaining, over}] — How the text measures against common platform limits (X/Twitter 280, SMS 160, meta description 160, AO claim 256).
A machine-readable description lives at index.md.