Skip to content
BinaryMeadow
All articles

Best OPDS Servers: An Honest Self-Hosted Comparison

Whilst integrating OPDS servers into OPDSy, I got to know the servers intimately, quirks and all. OPDSy now supports seven of them, and each takes a noticeably different view of how a library should be organised. Here is my OPDS server comparison.

The short answer

There is no single best OPDS server, and I would be suspicious of anyone who tells you otherwise. Each of these projects is built by people who clearly care, and each makes a different trade-off. The right one depends far more on what is in your library, and how it is already organised, than on any feature checklist.

If you want a starting point, this is where I would look first:

Where I would start, by type of reader
If you…Start withWhy
Mostly read comics or mangaKomga or KavitaBoth organise libraries around series and both support OPDS-PSE page streaming (Komga, Kavita).
Already curate your books in CalibreCalibre-WebIt runs on top of your existing Calibre database rather than asking you to migrate (Calibre-Web README).
Want your own folder tree to be the way you browseUbooquityIt shares the directories you choose, and in my integration work its catalogue mirrors those folders (installation guide, server-by-server guide).
Have ebooks, comics and audiobooks togetherBookOrbit, Grimmory or LazyLibrarianAll three put audiobooks and comics in their OPDS feeds (BookOrbit, Grimmory source, LazyLibrarian source). LazyLibrarian also handles magazines, and suits you best if you want it to manage your collection too (LazyLibrarian).

The rest of this article explains the reasoning, one topic at a time, so you can weigh up the parts that matter to you.

The seven servers at a glance

A quick introduction before we get into detail. These are the servers OPDSy integrates with, not every OPDS server in existence. If yours is not here, the general principles below still apply.

  • Komga is a media server for comics, manga, ebooks and PDFs, built around series. It is one of the few servers that publishes both an OPDS 1.x and an OPDS 2.0 feed (Komga OPDS guide).
  • Kavita reads comics, manga, ebooks and PDFs, and adds collections and reading lists on top (Kavita README). OPDS is switched on by default (Kavita OPDS guide).
  • Ubooquity is a lightweight Java server that shares the folders you point it at, with a preference for EPUB, CBZ, CBR and PDF. It is free for non-commercial use but is not open source (download page, FAQ).
  • Calibre-Web is a web front end and OPDS feed for an existing Calibre database, with shelves, metadata editing and Kobo sync.
  • BookOrbit is a Docker-based reading platform for ebooks, PDFs, comics and audiobooks, with dedicated Kobo and KOReader integrations.
  • Grimmory is a Docker-based library for ebooks, comics and audiobooks, with rule-based Magic Shelves and a Komga-compatible API (Grimmory OPDS guide).
  • LazyLibrarian is primarily a library manager that tracks authors and fetches metadata for ebooks, audiobooks, comics and magazines, with an OPDS feed on top (LazyLibrarian, source).

Books, comics and audiobooks

The most important thing to understand here is that what a server can do in its own web interface and what it hands to a reading app over OPDS are two different things. A server can have a lovely built-in audiobook player and still not list a single audio file in its OPDS feed. So the table below separates the two, and for audiobooks I only count a server when its OPDS feed actually offers the audio files.

What each server supports, and what reaches a reading app over OPDS
ServerEbooksComics and mangaAudiobooks over OPDS
KomgaEPUB, PDF (source)CBZ, CBR (source)Not in its supported formats
KavitaEPUB, PDF (source)Comic archives and images (source)Not in its supported formats
UbooquityEPUB, PDF and more (source)CBZ, CBR (source)Not documented as a feature
Calibre-WebWhatever is in your Calibre library (source)CBZ, CBR and other comic formats can be uploaded (source)Yes, for audio files attached to a book in the Calibre database, including MP3, M4B and FLAC (formats, feed)
BookOrbitYes (source)Yes (source)Yes: M4B, MP3, M4A, Opus, OGG and FLAC (formats, feed)
GrimmoryYes (source)CBZ, CBR, CB7 (source)Yes (formats, feed)
LazyLibrarianYes (source)Yes, with its own Comics and Recent Comics feeds (source)Yes, with separate audiobook lists. Multi-file audiobooks can be sent as one zip (source)

What this means in practice

For comics and manga, all seven will serve your CBZ files. That includes LazyLibrarian, which gives comics their own lists in its feed once you use it to manage them (source). The real differences are how they organise a series and whether they can stream pages, which I cover in the OPDS-PSE and file structure sections.

For audiobooks, the field narrows to four. Komga, Kavita and Ubooquity do not list audiobooks amongst their supported formats, so if your library includes them you would end up running a second server alongside. BookOrbit, Grimmory, Calibre-Web and LazyLibrarian all put audio files in their OPDS feeds. Calibre-Web is the one with an asterisk: it serves the audio files attached to books in your Calibre database, so it suits people who already file audiobooks in Calibre rather than people who want to point a server at a folder of M4Bs.

One more thing worth knowing: a server offering an audio file does not guarantee that your reading app can play it. You need a client that understands audiobooks too. OPDSy plays audiobooks from BookOrbit, Grimmory, Calibre-Web and LazyLibrarian, including M4B chapters (OPDSy features).

Look and feel: which one is modern?

This is the part of any comparison where it is easiest to pass off taste as fact. Whether a dashboard feels modern is personal, so rather than score screenshots, here is what can actually be checked: how recently each project shipped a release, and how you run it.

Release activity and deployment, as of 17 October 2026
ServerLatest releaseHow you run itSource code
Komga1.29.1, 14 October 2026 (release)Java or Docker (source)Public on GitHub
Kavitav0.9.1.4, 2 September 2026 (release)Docker (source)Public on GitHub
Ubooquity3.1.0, 10 August 2025 (download page)A Java 17 JAR file (source)Not open source (FAQ)
Calibre-Web0.6.27, 8 August 2026 (release)Python (pip) or Docker, pointed at a Calibre library (source)Public on GitHub
BookOrbitv3.4.0, 13 October 2026 (release)Docker Compose with PostgreSQL (source)Public on GitHub
Grimmoryv3.5.0, 21 September 2026 (release)Docker Compose with MariaDB (source)Public on GitHub
LazyLibrarianNo tagged release used; the main branch was updated on 16 October 2026 (commits)Python or Docker (source)Public on GitLab

If modern to you means active development and newer ideas, BookOrbit and Grimmory stand out on paper. Both shipped within the last month, and both offer rule-based smart shelves (BookOrbit calls them SmartScopes, Grimmory calls them Magic Shelves) that fill themselves from filters you set (BookOrbit, Grimmory). Komga and Kavita are just as actively maintained, with releases in October and September.

Ubooquity moves at a gentler pace: its current version dates from August 2025. That is not the same as abandoned, and there is a lot to be said for a server that stays put. A server that rarely changes is simply one that has stopped asking for your weekends.

My honest advice is to look at each project’s own screenshots or demo before you decide. Your eyes are a better judge of your taste than my table is. And remember that if you mostly read on your phone, the server’s interface is something you will see while setting it up. Day to day, you will mostly be looking at your reading app.

OPDS-PSE: what it is and why it matters

Plain OPDS is a catalogue. It tells a reading app what books exist, and gives it a link to download each one (OPDS 1.2 specification). For a novel that works well enough, because you want the whole book anyway.

Comics are different. A comic archive is a bundle of page images, and without page streaming your app has to download the whole thing before it can show you page one (PSE introduction). You want to start reading, not watch a progress bar with literary ambitions.

The OPDS Page Streaming Extension, OPDS-PSE for short, fixes this. It adds a page count and a link template to each comic, so a reading app can ask the server for one page at a time (PSE 1.2 specification). The practical benefits are:

  • You start reading almost immediately, rather than waiting for a full download.
  • You only transfer what you read. Flick through ten pages of a 200-page omnibus and you have fetched ten pages, which matters on mobile data.
  • Your phone’s storage stays free, because nothing has to be saved to read it.

PSE is an unofficial extension, and it was originally created for Ubooquity (PSE history). Both the server and the reading app need to support it. Here is where each server stands:

OPDS-PSE page streaming support
ServerPage streaming over OPDSNotes
KomgaYesPSE 1.2 on its OPDS 1.x feed (Komga OPDS guide)
KavitaYesFor non-EPUB files (guide, source)
UbooquityYesThe original PSE server (PSE 1.0 specification)
Calibre-WebNot foundIts OPDS feed template offers whole-file downloads only (source)
BookOrbitNot foundIts OPDS feed builder offers whole-file downloads only (source)
GrimmoryNot over OPDSStreams comic pages through a separate Komga-compatible API instead (Grimmory OPDS guide)
LazyLibrarianNot foundNo PSE links in its OPDS catalogue code (source)

“Not found” means I checked the current source code and found no PSE support, not that it can never arrive. The Grimmory row is worth a second look: it can stream comic pages, but through its Komga-compatible API rather than its OPDS feed, so you need an app that speaks the Komga API to benefit (Grimmory OPDS guide). In my view that is not ideal. Most reading-app developers build to the OPDS specification and will hesitate to bolt on a second, server-specific API, so I would not count on many OPDS apps streaming Grimmory comics this way.

If you read lots of comics on a phone, I would weigh PSE heavily. One caveat: streaming means reading online. If you are heading somewhere without signal, download the comic first. OPDSy streams over PSE where the server supports it, prefetching the next page so it is ready before you swipe, and lets you download anything for offline reading (OPDSy features).

OPDS 2.0 versus OPDS 1.x

OPDS comes in two generations, and the version number tempts people into assuming 2.0 must be better. The difference is mostly in the format, not in what you can do with your books.

  • OPDS 1.x (1.2 is the current revision) describes the catalogue as Atom feeds, which are XML. It defines navigation feeds for browsing and acquisition feeds for downloading (OPDS 1.2 specification).
  • OPDS 2.0 describes the same kind of catalogue in JSON, based on the Readium Web Publication Manifest. The specification describes itself as a living standard, so it is still evolving (OPDS 2.0 specification).

Both let a reading app browse your library and download books. Crucially, OPDS 2.0 does not by itself give you page streaming, audiobooks or reading sync. The PSE specification is written as an extension to the Atom feeds of OPDS 1.x (PSE 1.2 specification), which is why Komga documents PSE on its 1.x feed specifically (Komga OPDS guide).

Only one of the seven speaks OPDS 2.0, and that is Komga. It publishes both versions side by side, at /opds/v1.2/catalog and /opds/v2/catalog (Komga OPDS guide). The other six are OPDS 1.x servers. Kavita, Calibre-Web, BookOrbit, Grimmory and LazyLibrarian all build Atom feeds in their source code (Kavita, Calibre-Web, BookOrbit, Grimmory, LazyLibrarian), and Ubooquity’s feeds are the Atom feeds its own page streaming extension was written for (PSE 1.0 specification).

My take: do not choose a server on its OPDS version. Choose it on how it organises your library and what it exposes to your reader. A well-built OPDS 1.x feed with PSE will serve a comic reader better than an OPDS 2.0 feed without it. OPDSy reads both versions, so either way it is covered (OPDSy FAQ).

Reading progress and sync

Here is a common misconception: connecting two apps to the same OPDS server does not mean they share your place in a book. The core OPDS specifications cover finding and downloading books, not syncing reading positions (OPDS 1.2, OPDS 2.0). PSE can hint at the last page read, but it does not define a way for an app to send your progress back (PSE 1.2 specification).

So “sync” can mean four quite different things, and it helps to know which one you are after:

  1. Your app remembers your place on one device.
  2. Your app syncs itself between your devices, say from your phone to your tablet.
  3. The server tracks progress in its own web reader, or through its own API or a dedicated device integration.
  4. Your app writes progress back to the server, so the server’s web reader and other apps pick up where you left off.

For an OPDS reading app, the fourth kind is the one that matters, and it is where the servers differ most. Komga is the only one of the seven that lets an OPDS app publish your reading position back to it (Komga read progress, OPDSy FAQ). Kavita comes a close second in a quieter way: when an app streams a comic page by page over PSE, Kavita saves the page you reached as your progress (Kavita source). That only works while you are streaming, so a book you downloaded and read offline will not move your place on the server.

Can an OPDS reading app keep your place on the server?
ServerProgress from an OPDS appWhat it offers instead
KomgaYesTracks read progress per user (guide)
KavitaOnly while streaming over PSESaves the page you stream as progress (source)
UbooquityNoNone documented (manual)
Calibre-WebNoKobo sync for Kobo e-readers (README)
BookOrbitNoKobo and KOReader integrations (overview, KOReader guide)
GrimmoryNoKOReader sync through a separate API (KOReader guide)
LazyLibrarianNoRead and To Read lists in its OPDS feed (OPDS guide)

To be fair to the others, several of them have put real work into sync, just aimed at a particular device or app rather than at OPDS. If you read on a Kobo or in KOReader, those integrations may be exactly what you need. If you read in an OPDS app on your phone, though, most of these servers will not know where you got to.

This is a gap OPDSy fills. Whichever server a book came from, you can turn on optional sync through your own Google Drive, end-to-end encrypted, which carries your reading progress, favourites, highlights and bookmarks between your devices. The server never needs to support it. If you use Komga, a separate per-library switch also publishes your page back to Komga, so its web reader shows the same place (OPDSy features, OPDSy FAQ).

Folders or metadata: how each server organises your library

This is the difference that shapes everyday browsing most, and it is the one I would think about hardest. Imagine a library on disk like this:

/comics
  Saga/
    Volume 1/
      Saga #01.cbz
      Saga #02.cbz
    Volume 2/
      Saga #07.cbz

Broadly, servers take one of two approaches with that tree. Some keep your folders as the way you browse. Others read your folders and file names, work out what is a series, and then present a catalogue organised by series, author or other metadata.

Your folders, mirrored: Ubooquity

Ubooquity is set up by choosing the directories you want to share (installation guide). In my integration work, its catalogue mirrors those folders as they are, with separate entry points for comics and books, however deeply you have nested them (server-by-server guide). If your folder tree is already the way you think about your collection, that is a genuinely good reason to choose it. You get exactly what you built, no more and no less.

Folders become series: Komga and Kavita

Komga does use your folders, but differently. It creates a series for each folder that contains books, at any depth, and puts each book into the series of its parent folder (Komga scanning guide). Your library becomes a list of series, not a tree. In the example above, Volume 1 and Volume 2 would become two separate series. If you want to group them, Komga’s collections let you bundle series together yourself (server-by-server guide).

Kavita works out series from file names, metadata inside the files and some folder names, rather than mirroring every folder level, and it has some layout rules worth reading before you import (Kavita scanner guide). Kavita tracks volumes, but in its main OPDS series view every issue arrives in one list, rather than as a separate volume level (Kavita source). If tidy volume grouping matters to you, it is worth testing with a few of your own files first.

Metadata first: Calibre-Web, BookOrbit, Grimmory and LazyLibrarian

These four are book-first. A series is a label on a book rather than a folder you open, and you browse by author, series, shelf and similar lists.

  • Calibre-Web reads everything from your Calibre database, and its OPDS feed lets you browse by author, publisher, category, series, language, rating and format (README, source).
  • BookOrbit offers All Books, Libraries, Collections, SmartScopes, Authors and Series in its OPDS feed (OPDS guide).
  • Grimmory offers Libraries, Shelves, Magic Shelves, Authors, Series and a Surprise Me list of random books (OPDS guide). Its Series list is built from book metadata, so it stays empty until your files carry a series name (server-by-server guide).
  • LazyLibrarian builds its catalogue from its own database, so a file only appears once LazyLibrarian knows about it, and empty sections are hidden (OPDS guide, source).

Neither approach is better. Folder-first rewards people who already keep their files tidy. Metadata-first rewards people who are happy to tag their books, and it is much more forgiving of a download folder that has been “temporary” for several years. Be honest with yourself about which one you are.

Ease of use and entry points

When a reading app connects to an OPDS server, the first thing it sees is the server’s root catalogue: a menu of entry points such as Recently Added, Series or Continue Reading. That first screen decides how quickly you get from opening the app to reading something, and every server fills it differently. Here is what each one puts there (server-by-server guide):

What each server offers on its first OPDS screen
ServerPick up where you left offWays to browseLists you curate
KomgaKeep Reading, On DeckAll series, All libraries, Latest series, Latest books, PublishersCollections, Read lists
KavitaOn Deck, Want to ReadAll Libraries, Recently Updated, Recently Added (source)Collections, Reading Lists
UbooquityNoneComics by folder, Books by folder, latest comics, latest booksNone
Calibre-WebRead Books, Unread Books, Hot BooksAlphabetical, Recently added, Random, Top Rated, Authors, Publishers, Categories, Series, Languages, Ratings, File formats (source)Shelves
BookOrbitNoneAll Books, Recent Books, Random Books, Libraries, Authors, SeriesCollections, SmartScopes
GrimmoryNoneAll Books, Recently Added, Surprise Me, Libraries, Authors, Series (source)Shelves, Magic Shelves
LazyLibrarianRead and To Read lists (guide)Recent eBooks, Recent AudioBooks, Recent Comics, Recent Magazine Issues, Best Rated, Authors, Series, Genres, Magazines, Comics (source)None

A few things stand out. Komga and Kavita are the only two with true “carry on reading” entries, which makes them the quickest to get back into a series you are halfway through. Calibre-Web offers the most ways to slice your library, which is wonderful if your metadata is tidy and a little overwhelming if you just want your books. Ubooquity is the simplest of the lot: your folders, plus a list of the latest additions. BookOrbit and Grimmory sit in the middle, with an All Books list as the obvious way in and curated shelves for people who like to organise (server-by-server guide).

Two things catch people out. Lists you curate, such as collections and shelves, start empty until you create something on the server. And metadata-driven entries like Series stay empty on Grimmory until your files carry a series name (server-by-server guide). Neither is a fault, even if an empty list on day one can look like one.

Connecting your app

To get that far, your app needs the right address and the right sign-in. Here is where each server publishes its feed:

Where each server publishes its OPDS feed
ServerOPDS addressWorth knowing
Komga/opds/v1.2/catalog or /opds/v2/catalog, on port 25600 by default (source)Use the v1.2 address if you want PSE page streaming (source).
KavitaA personal URL containing an auth key, copied from your user settings (source)OPDS is on by default. Treat that URL like a password (source).
UbooquitySee the server-by-server guideAdministration is local-only unless you enable remote access (source).
Calibre-Web/opds, on port 8083 by default (source)Books must be in the Calibre database to appear.
BookOrbit/api/v1/opds (source)Switch OPDS on and create a separate OPDS account (source).
Grimmory/api/v1/opds, on port 6060 by default (source)Switch OPDS on and create a separate OPDS user (source).
LazyLibrarian/opds, on port 5299 by default (source, source)OPDS is off by default and needs a restart after you enable it (source, source).

For a visual map of each server’s first screen and the quickest route into your books, see my server-by-server guide to each library’s entry points.

Five things worth checking before you commit

A few things that are not on most comparison lists but are worth a moment’s thought.

  1. Reading away from home. A server on your home network is not reachable on mobile data just because your app speaks OPDS. Most people use a VPN such as Tailscale or WireGuard, or a reverse proxy with HTTPS (OPDSy FAQ). Keep authentication switched on rather than exposing an open server.
  2. How your app signs in. Your normal web login is not always what a reading app uses. BookOrbit and Grimmory use separate OPDS accounts, and Kavita uses a personal URL with a key in it (BookOrbit, Grimmory, Kavita). Keep those URLs out of screenshots and forum posts.
  3. Metadata quality. Series, author and smart shelf lists are only as good as the metadata behind them. A blank Series list is often a tagging problem, not a bug (server-by-server guide).
  4. Backups. For the database-backed servers, back up the database as well as your books. Grimmory’s KOReader sync, for example, depends on files staying byte-for-byte identical, so re-encoding or replacing files can affect it (Grimmory KOReader guide).
  5. Licensing. Six of these servers publish their source code. Ubooquity is free for non-commercial use but is not open source (download page, FAQ). That may or may not matter to you, but it is worth knowing up front.

Where OPDSy fits

Here is the plug, and I have tried to earn it. Most readers make you choose between the files on your device and a self-hosted server. OPDSy is built so you do not have to, and it is available on Google Play. Everything below is described on the OPDSy page (features, FAQ):

  • One library for everything. Local folders and any number of servers, including all seven in this article, are merged into a single home, with Continue Reading, favourites and search working across all of them.
  • OPDS 1.2 and 2.0, with page-by-page comic streaming over OPDS-PSE wherever your server offers it.
  • Books, comics and audiobooks. EPUB, MOBI, AZW3, FB2, PDF, CBZ and CBR, plus M4B, MP3 and other audiobook formats with chapters, playback speed and a sleep timer.
  • Offline reading. Download anything from a server and read it with no connection.
  • Private sync on any server. Optional, end-to-end encrypted sync through your own Google Drive keeps your place across devices even when your server cannot, plus optional progress publishing back to Komga.
  • A one-time purchase. No subscription, no ads, no tracking and no account with us.

You do not need OPDSy to use any of these servers, and plenty of good readers exist. But if you are self-hosting on Android and are tired of running one app for your server and another for your local files, OPDSy is designed for exactly that.

So, which is the best?

Having integrated all seven, my honest answer is that the best OPDS server is the one that matches how your library already works.

  • Comics first? Komga or Kavita, for series organisation and page streaming.
  • Calibre already runs your life? Calibre-Web, without a migration.
  • Love your folder tree? Ubooquity, which leaves it exactly as you built it.
  • Books, comics and audiobooks in one place? BookOrbit, Grimmory or LazyLibrarian.

Try your shortlist with a small sample of your own files, not a tidy demo library. Your real collection will tell you very quickly which server suits it. And if I have got anything wrong or out of date, email hello@binarymeadow.com and I will fix it.

Sources

Every source below was checked on 17 October 2026. Where a link points to source code, it is pinned to a specific release or commit where one was available, so it will still show the code I checked even after the projects move on.

  1. OPDS Catalog 1.2 specification
  2. OPDS Catalog 2.0 specification
  3. OPDS Page Streaming Extension 1.2 specification
  4. OPDS-PSE introduction and history (Anansi Project)
  5. Original OPDS-PSE 1.0 specification
  6. Komga: introduction and supported formats
  7. Komga: OPDS guide
  8. Komga: scanning, analysis and metadata
  9. Komga: read progress guide
  10. Komga 1.29.1 release
  11. Kavita: official README
  12. Kavita: OPDS guide
  13. Kavita: scanner guide
  14. Kavita v0.9.1.4: OPDS page streaming saves reading progress
  15. Grimmory v3.5.0: OPDS controller (Atom feeds and entry points)
  16. OPDSy on Google Play
  17. Kavita v0.9.1.4: OPDS service source
  18. Kavita: Docker installation
  19. Kavita v0.9.1.4 release
  20. Ubooquity: official site
  21. Ubooquity: installation guide
  22. Ubooquity: user manual
  23. Ubooquity: FAQ
  24. Ubooquity: download page
  25. Calibre-Web: official README
  26. Calibre-Web: OPDS feed template source
  27. Calibre-Web: OPDS routes source
  28. Calibre-Web: supported upload formats source
  29. Calibre-Web 0.6.27 release
  30. BookOrbit: what is BookOrbit?
  31. BookOrbit: OPDS guide
  32. BookOrbit v3.4.0: OPDS feed builder source
  33. BookOrbit: KOReader sync guide
  34. BookOrbit: installation guide
  35. BookOrbit v3.4.0 release
  36. Grimmory: getting started
  37. Grimmory: OPDS and Komga API guide
  38. Grimmory v3.5.0: OPDS feed service source
  39. Grimmory: KOReader sync guide
  40. Grimmory: official repository
  41. Grimmory v3.5.0 release
  42. LazyLibrarian: official introduction
  43. LazyLibrarian: OPDS guide
  44. LazyLibrarian: interface configuration
  45. LazyLibrarian: OPDS catalogue source
  46. LazyLibrarian: Comics and Recent Comics OPDS feeds
  47. LazyLibrarian: default configuration source
  48. LazyLibrarian: installation guide
  49. LazyLibrarian: commit history
  50. OPDSy: features
  51. OPDSy: your library, server by server
  52. OPDSy: frequently asked questions