# EpubReader: a .NET library for reading EPUB books

> VersOne.Epub is a C# library for reading EPUB files, covering EPUB 2 and every EPUB 3 release up to 3.3, and running anywhere from .NET Framework 4.6 to .NET 10. It is published on NuGet, released under the Unlicense, and ships two demo applications and three worked examples, one of which walks a directory of books and gathers statistics from them.

**vers-one/EpubReader** — .NET library for reading EPUB files

- Repository: https://github.com/vers-one/EpubReader
- Website: https://os.vers.one/EpubReader/
- Stars: 551 · Forks: 106
- Language: C#
- License: Unlicense
- Published: 2026-10-22 · Updated: 2026-10-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/vers-one-epubreader

## A library, with demo applications kept separate

EpubReader is a .NET library for reading EPUB files, and it is worth being clear about what it is not: it is not a reader application.

The repository contains the library, a Documentation/ directory with the site and its images, the Source/ directory with the code, the licence, the README and a file called Release checklist.md. That last one is a small sign of a project with a real release process rather than an ad hoc one.

The library is published on NuGet as VersOne.Epub:

```bash
https://www.nuget.org/packages/VersOne.Epub
```

The download section offers that route plus DLL archives for .NET Framework and for .NET Standard, zipped and attached to the GitHub releases. So there is a package route for a normal application and a raw assembly route for a project that cannot take a package reference.

Two demo applications are attached to the releases as well, and they are deliberately different from each other. There is a WPF demo app, a .NET Framework application that demonstrates how to open EPUB books and extract their content using the library, and there is a .NET 10 console demo app that demonstrates how to open EPUB books and retrieve their text content.

The documentation site is at os.vers.one/EpubReader, and the README links three worked examples on it: how to extract the table of contents, how to extract the plain text of the whole book, and how to iterate over all EPUB files in a directory and gather some stats.

That third example is the one that shows the intended use. A library of books on disk, walked and measured, is a catalogue, a duplicate check or a migration job, and it is exactly the kind of batch task where a reading library earns its place.

## The standards it covers, and what that means in practice

The supported standards are listed precisely, and the list is the compatibility contract.

EPUB 2 is covered, both 2.0 and 2.0.1. EPUB 3 is covered in every version from 3.0 through 3.0.1, 3.1, 3.2 and 3.3.

The EPUB 2 support matters more than it looks in 2026. The second generation of the format is what a large part of the existing book catalogue was published in, and its structure differs from EPUB 3 in the places that matter to a parser: where the navigation document lives, how the spine and the manifest are arranged, and how the content documents are referenced. A reader written only for EPUB 3 handles the newer books and fails on the older ones, which is a bad trade for a catalogue tool.

Covering the EPUB 3 minor versions in sequence is the same kind of care. The 3.x line has accumulated revisions over the years, each one refining the package document and the navigation rules, and a parser that handles only 3.0 will produce incorrect tables of contents for books produced later.

What the list does not mention is worth noting too. There is no mention of DRM, and there is no mention of the media overlays or the fixed layout format. The stated scope is the two generations of the reflowable format, which is the scope you would expect from a library whose examples are about extracting text and a table of contents.

The Unlicense is the other fact that shapes use. The project is released under the Unlicense, which is a dedication to the public domain rather than a permission grant, so there is no attribution requirement and no patent grant and no copyleft obligation.

## The runtimes, from .NET Framework 4.6 to .NET 10

The supported runtimes list is short and it covers an unusual range, because the target is .NET Standard rather than a specific framework version.

The library targets .NET Standard 1.3 or later, which includes .NET Core 1.0 and later and .NET 5 and later, and it also supports .NET Framework 4.6 or later.

The .NET Standard target is the interesting choice. It is the compatibility surface that lets one assembly run on the full framework and on the modern runtime, and by targeting the early 1.3 surface rather than a later one, the library keeps a wide reach. The cost is the API surface available to the implementation, since the older standard does not have everything the newer ones do.

The demo applications show the two ends of that range in practice. The WPF demo is a .NET Framework application, so it runs on the old stack, and the console demo targets .NET 10, the current one. Same library, two very different hosts.

The NuGet badge in the README tracks the published version, and the coverage badge points at Codecov for the master branch. The build and test workflows have their own badges, which together give the usual picture of a library with continuous integration covering both compilation and the test suite.

So for a reader of the README, the practical question is whether your runtime is on the list. A .NET 8 or .NET 10 service, a .NET Framework 4.8 desktop application, and a Xamarin or Mono target are all covered by that one standard target.

## What the examples actually show you

The three linked examples are a good summary of what a reading library is for, and they are ordered from smallest to largest job:

```bash
https://os.vers.one/EpubReader/examples/example-1.html
https://os.vers.one/EpubReader/examples/example-2.html
https://os.vers.one/EpubReader/examples/example-3.html
```


The first is how to extract the table of contents. That is the operation most applications need first, because a table of contents is the structure of the book, and it is what a reader interface needs to draw a navigation pane and what a catalogue tool needs to record.

The second is how to extract the plain text of the whole book. That is the operation a search index or a text analysis pipeline needs, and it is the one that separates a reading library from a rendering library, because the plain text has to be assembled from the content documents in spine order rather than from any single file.

The third is how to iterate over all EPUB files in a directory and gather some stats. That is a batch operation, and it is the example that shows how the library composes with the file system and with the .NET type system: you point it at a directory, it reads each file, and you accumulate whatever you want to know, file size, page count, word count, author, publication date.

The third example is also the one that scales into production use, because the same code with a file list from a database instead of a directory is a catalogue backfill.

The demo applications sit alongside these examples and show the two ends of the API. The console demo retrieves text content, and the WPF demo extracts content into a rendered view, which is where the README's own caveat appears: the HTML renderer used in that demo app may have difficulties while rendering content for some of the books if the HTML structure is too complicated. That is a limitation of the demo's renderer, not of the library, and it is the kind of thing that only shows up when you point a real library at real books.

## Where the library stops and your application starts

The boundary between a reading library and a reader application is the thing to understand before you adopt this one.

EpubReader gives you the structure of the book: the table of contents, the content documents, the text. It does not give you a rendered page. Rendering is the application's problem, and the WPF demo's caveat about complicated HTML structures is the visible edge of that line, because the demo's renderer is a simplified one and a real application would use a browser engine or a full HTML layout engine for the content.

That is a reasonable division for a library. A rendering engine is a large piece of software with its own opinions, and shipping one inside a reading library would tie the library to a rendering technology. The cost for you is that if your application needs to display the book, you now have to choose a renderer, and the library's contribution stops at the parsed content.

The alternative approach is to treat an EPUB file as what it is at the container level, a ZIP archive with an XML package document inside, and parse it yourself with an XML reader and a ZIP library. The difference in approach is that this library has already dealt with the details: the container.xml file that says where the package document is, the package document with the manifest and the spine, the difference between the navigation document of EPUB 3 and the older NCX table of contents of EPUB 2, and the ordering of the spine. Reimplementing that is possible, and it is the kind of work that looks like a day and turns into a week of edge cases.

So the question is not whether you could read the files yourself, but whether the specific structure handling that EpubReader already implements is the part you would rather not own.

## A small project with a release process

The maintenance picture is modest and consistent.

The recent releases are v3.3.4 from 2025-05-03, v3.3.5 from 2026-01-27 and v3.3.6 on 2026-03-15, and the last push to the repository was on 2026-04-18. The version numbers move in patch steps, which is what you would expect for a library whose public surface is stable and whose work is in handling more books and more editions of the format.

The repository itself is small, which is a good sign for a library like this: .github/ for the workflows, .gitignore, the Documentation/ directory, the licence, the README, the release checklist and the Source/ directory. There is no separate test project directory at the top level, because the tests live with the source they cover, and there is no example directory either, because the examples are the two demo applications and the three documented snippets.

The Unlicense deserves one more word, because it is unusual in this ecosystem. Most .NET libraries ship under MIT or Apache, and the Unlicense is a dedication: the authors waive copyright and place the work in the public domain. For a commercial application that means no attribution requirement in your notices and no obligation to track the licence text. For a contributor it means the same terms apply to anything they contribute. The trade is that some corporate legal teams are more comfortable with a recognised permissive licence than with a public domain dedication, so it is a question for your organisation rather than a technical one.

The documentation site is the place to look for the API detail, and the release checklist in the repository root tells you that the maintainer has a repeatable process for cutting one.

## Conclusion

EpubReader suits a .NET developer who needs to read books out of EPUB files, whether that is a catalogue tool that walks a library directory and gathers statistics, a service that extracts the text of a purchased book, or an application that needs the table of contents rather than the rendered pages. It does not suit somebody who needs a rendering engine, because the library extracts content and leaves the HTML rendering to the application, as the WPF demo's own caveat about complicated HTML structures shows. Check three things before you adopt it: that your books are within the covered standards, since EPUB 2 and EPUB 3 up to 3.3 are listed, that your target runtime is on the supported list, which runs from .NET Framework 4.6 through .NET Standard 1.3 to .NET 5 and later, and whether you want to take the Unlicense terms, which place the code in the public domain rather than requiring attribution. The last push to the repository was on 2026-04-18 and the newest release is v3.3.6.

## FAQ

### What is VersOne.Epub?

It is a .NET library for reading EPUB files, published on NuGet as VersOne.Epub and released under the Unlicense. It covers EPUB 2 including 2.0 and 2.0.1, and EPUB 3 from 3.0 through 3.0.1, 3.1, 3.2 and 3.3.

### Which runtimes does EpubReader support?

It targets .NET Standard 1.3 or later, which includes .NET Core 1.0 and later and .NET 5 and later, and it supports .NET Framework 4.6 or later. The two demo applications are a .NET Framework WPF app and a .NET 10 console app.

### What can I do with the EpubReader library?

The documented examples show extracting the table of contents, extracting the plain text of the whole book, and iterating over all EPUB files in a directory to gather statistics. The demo applications show opening books in a WPF window and retrieving text content from the console.

### Does EpubReader render the books it reads?

No, it extracts content and leaves rendering to the application. The README notes that the HTML renderer used in the WPF demo application may have difficulties rendering content for some books if the HTML structure is too complicated, which is a limitation of that demo's renderer rather than of the library.

### How do I get EpubReader?

From nuget.org as the package VersOne.Epub, or as a DLL archive attached to the GitHub releases, with separate zips for .NET Framework and for .NET Standard. The documentation is at os.vers.one/EpubReader.

## Sources

- [License: Unlicense](https://github.com/vers-one/EpubReader/blob/master/LICENSE)
- [Project website](https://os.vers.one/EpubReader/)
- [README](https://github.com/vers-one/EpubReader/blob/master/README.md)
- [Releases](https://github.com/vers-one/EpubReader/releases)
- [vers-one/EpubReader on GitHub](https://github.com/vers-one/EpubReader)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/vers-one-epubreader
