Reading grade
Flesch–Kincaid grade level, plus a 0–100 reading-ease score.
"Is this book too hard for me?" is a measurable question.
Give it any EPUB and you get a reading grade level, a reading-ease score, vocabulary richness, and the chart that actually matters to a learner: the coverage curve showing how few distinct words you need to follow most of the book. The EPUB is unzipped in the browser with a native API — no server, no upload, and no third-party libraries.
uploaded. The ZIP is decompressed by the browser itself, so the book never touches a network.
No unzip library, no charting library, no framework. One HTML file.
distinct words for 95% coverage of Alice. The top 100 alone carry 59% of the book.
to try it — a public-domain sample is bundled so you don't need a file to hand.
↓ the trick
Every EPUB is a ZIP archive of HTML files. The usual way to read one in a web page is to pull in a JavaScript unzip library, and the usual way to analyse a book is to send it to a server. Both are avoidable.
This uses DecompressionStream,
a native browser API, to decompress the archive in place. The text is then
extracted with the browser's own HTML parser, tokenized and scored. The
consequence is the privacy claim: there is no upload path in the code
at all, so the promise is architectural rather than a policy you have
to believe.
Flesch–Kincaid grade level, plus a 0–100 reading-ease score.
Type–token ratio, with total and unique word counts alongside it.
The twenty most frequent meaningful words once stopwords are removed.
How much of the book you can read knowing the N most common words. The most useful chart for a learner.
↓ why the coverage curve
A grade level compresses a whole book into one figure and tells you almost nothing actionable. The coverage curve answers the real question: how much vocabulary do I need before this stops being exhausting?
For Alice, the answer is 1,397 distinct words for 95%. The top 100 words alone already carry 59%. That shape — steep at first, then a long flat tail — is the same shape I measured across a season of television in the Love Island lexical analysis, which is where this tool came from. That study needed a Python pipeline; this turns the same lens into something anyone can point at their own book.
↓ before you drop a file
Empty state on the left, phone layout on the right. The drop zone doubles as a file picker on touch devices, and the bundled sample means the tool is usable in one tap without hunting for an EPUB first.
↓ what this cannot tell you
Flesch–Kincaid is essentially sentence length and syllable count. It has no idea whether the ideas are hard, whether the vocabulary is archaic, or whether the sentences are doing something structurally difficult. A book of short sentences about difficult things scores as easy.
Type–token ratio is also sensitive to length: longer texts tend to score lower simply because they have more running words. Comparing TTR between a novella and a doorstop is not comparing like with like, and the tool does not correct for it.
The coverage curve is the most robust thing here and even it counts word forms rather than word families, so "run", "running" and "ran" are three words. That inflates the count somewhat against the word-family figures used in language-teaching research.
Finish · what it is built on
DecompressionStream, no third-party library<canvas>.epub and plain text