KO

Koodo Reader

Cross-platform ebook reader with annotations and sync

E-books & Media Library ★ 28.3k stars Easy setup AGPL-3.0

Koodo Reader is an open-source ebook reader supporting EPUB, PDF, MOBI, and many other formats, with annotations, highlights, and a personal library. It can be self-hosted as a web app to read books from any browser.

Key features

  • Supports many ebook formats
  • Annotations and highlights
  • Self-hostable web reader
  • Cross-platform desktop apps

Pros & cons

Strengths

  • Many formats supported
  • Rich annotation tools
  • Works fully offline

Trade-offs

  • Sync needs manual setup
  • Electron app weight

Koodo Reader replaces

Last reviewed Aug 26, 2026 · 756 words

The self-hosted Koodo Reader does not store your library on the server. It serves a static web app, and every book, highlight, and reading position lives in that browser's IndexedDB. Clear site data and it is gone; open it on another device and it is empty. Understand that before deploying, because the 256 MB container is only half of a working setup. The other half is a WebDAV target that Koodo syncs to, and that is what turns a nice reader into a library you can trust.

What Koodo is: a reader, not a library server

Koodo Reader started as a desktop app, and the desktop apps for Windows, macOS, and Linux are still the primary product. The web build is the same React code without the Electron wrapper. It opens EPUB, PDF, MOBI, AZW3, FB2, TXT, Markdown, and comic archives, renders them with a proper paginated or scrolled layout, and layers highlights, notes, and a dictionary on top. The reading experience is the point. Apple Books users, whom the catalogue names as the target audience, will recognise the feel.

What it is not is a server that indexes a folder of ebooks and serves them to clients. That is Calibre-Web or Kavita, and most of the ebooks category is that shape. Koodo is the thing you read in; those are the things you store in.

Docker in four lines, then the part that matters

The container is trivially small, which is why the catalogue calls this Easy:

services:
  koodo:
    image: ghcr.io/koodo-reader/koodo-reader:master
    ports:
      - "8085:80"
    restart: unless-stopped

Open port 8085, drag an EPUB onto it, and you are reading. Now do the thing that makes it durable: in Settings, enable sync and point it at a WebDAV server. Koodo supports WebDAV plus several cloud drives, and for a self-hoster the WebDAV target is usually Nextcloud, where the URL is https://cloud.example.com/remote.php/dav/files/USERNAME/ with your Nextcloud app password. Koodo then uploads books and its metadata to a folder there, and every other Koodo instance, desktop or web, pointed at the same folder gets the same library and progress.

Sync is manual by default. The catalogue's "sync needs manual setup" con is putting it politely: you press the sync button, and if you forget, your phone and your laptop diverge. There is an auto-sync option in recent builds, and I turn it on, but I still treat the WebDAV folder as the source of truth and the browsers as caches.

Pair it with Calibre-Web, do not replace one with the other

My working arrangement is Calibre-Web as the library, Koodo as the reader. Calibre-Web owns the metadata, covers, series ordering, and the OPDS feed for e-ink devices. When I want to read on a laptop or a tablet browser, I download the EPUB from Calibre-Web and open it in Koodo, whose annotation tools are better than Calibre-Web's built-in reader by a wide margin. Highlights and notes stay in Koodo's sync folder, which I back up with everything else in Nextcloud.

If you have never run desktop Calibre itself, the short version is that most people end up with Calibre-Web for the library and something else for reading, and Koodo is the something else I would choose on a desktop or in a browser.

The Electron weight is a desktop complaint, not a server one

The catalogue's other con, Electron app weight, applies only to the desktop builds, which are 150 MB-plus installs that use a few hundred MB of RAM while open. The web build sidesteps that entirely. On a server the container idles at a few tens of MB, and the reading itself happens in whichever browser you already have open. For an old laptop or a shared family machine, the web build behind a bookmark is the lighter choice.

What I'd do

Deploy the container behind your reverse proxy with HTTPS, because IndexedDB and clipboard features behave better in a secure context. Point sync at a Nextcloud WebDAV folder on day one, turn auto-sync on, and press sync manually anyway before closing a session. Keep Calibre-Web as the library and treat Koodo as the reading surface, and you get an AGPL, 28,000-star reader with annotations that work on every device you own and a library that survives a cleared browser.

Compare Koodo Reader

3 head-to-head comparisons.

Similar e-books & media library apps