An opinionated comparison
Why Tome?
There are several good self-hosted ebook servers. This page explains what Tome does differently, how every alternative compares, and where each one is the better choice.
10 min read
The problem
Most self-hosted library servers were built to serve files. They're very good at it — scanning folders, extracting metadata, exposing an OPDS catalog, rendering pages in a browser. What they don't do is care whether you actually read any of it.
Tome was built around a different premise: a library server should know how you read. When you pick up your Kobo at night and read for an hour, Tome should record that session, sync your position to the web reader, update your streak, and surface it in stats the next morning. That's the foundation — not a feature bolted on later.
What Tome does
TomeSync — a real KOReader plugin, not just a protocol
Every other self-hosted library that supports KOReader does it the same way: they implement the KOSync protocol on the server side, and you point KOReader's built-in sync plugin at it. That gets you progress sync — where you left off — and nothing else. CWA ships a plugin, but it's a lightly modified clone of the stock KOSync plugin with different auth. Kavita, Komga, and Stump all just expose KOSync-compatible endpoints.
Tome ships TomeSync, a purpose-built .koplugin that goes
well beyond progress sync:
- Reading-session recording — every time you close the lid or close a book, TomeSync records a session: start time, end time, duration, pages turned, device. This is what powers Tome's stats (streaks, heatmaps, pace, completion estimates). No other tool captures this data from KOReader.
- Series browser — browse your entire library's series from inside KOReader. Tap a series to bulk-download every volume, organized into folders by book type and series name (
manga/One Piece/Vol. 1 — One Piece.epub). Or download just the rest of a series from your current volume forward. - Bidirectional position sync — read on your Kobo, pick up on the web reader, come back to KOReader the next night. Position follows you both directions automatically.
- Stable book IDs — TomeSync matches books by Tome's internal IDs, not MD5 file hashes. Rename a file, re-download it, reorganize your library — the link doesn't break.
- Offline-first — when your server is unreachable, sync silently skips with zero delay. Sessions are saved locally and flush automatically when the connection returns. Up to 50 sessions can queue offline.
- Pre-configured — download the plugin from Tome's settings page and it comes with your server URL and API key baked in. No manual configuration.
Stats
Stats aren't an afterthought. Three tabs: Overview (totals, streak, currently reading, daily pace), Habits (hour-by-day-of-week heatmap, session timeline, reading pace, monthly comparison), Library (series completion, author affinity, completion by type, library growth). A 365-day heatmap shows your year at a glance. All of it built on actual session data from your e-reader, not estimated from page counts.
Series
Books group into series, series have statuses (ongoing, completed, hiatus), and volumes can be organized into arcs within a series. This matters for manga and light novels where you might have 30+ volumes in a single series spread across multiple story arcs.
Free metadata
Metadata fetching is free and built in. Google Books, OpenLibrary, and Hardcover (with an optional API key) — no subscription required. The Scribe tool (a Claude Code skill) can batch-ingest hundreds of books, auto-match metadata, and audit your library for weak spots.
The stack
Python/FastAPI on the backend, React 19 with Tailwind CSS 4 on the frontend, SQLite under the hood. One Docker image, three volume mounts, no external services. It runs on a Raspberry Pi.
What Tome doesn't do
Before getting into comparisons — an honest list of things other tools handle that Tome currently does not:
- Calibre integration — Tome has its own database. It won't read an existing Calibre library.
- Kobo device sync — Tome syncs via the TomeSync KOReader plugin, not the Kobo store API.
- Send-to-Kindle / email delivery — no email integration.
- Format conversion — Tome serves what you upload.
- LDAP / OIDC / SSO — JWT auth with three roles (admin, member, guest) and Quick Connect codes.
- Annotations and highlights — the web reader doesn't persist highlights.
- Reading lists — Tome has libraries and shelves (saved filters), not ordered cross-series playlists.
- Scrobbling — no sync to AniList or other tracking services.
- Age rating restrictions — visibility is library-based, not rating-based.
- Localisation — the UI is English only.
Some of these will land eventually. Some won't — they're outside the scope of what Tome is trying to be. If any of them are dealbreakers, keep reading — one of the tools below is a better fit.
Calibre-Web
Calibre-Web is the default recommendation on every self-hosting forum, and for good reason. It wraps an existing Calibre database in a web UI, supports OPDS, has built-in readers for EPUB, PDF, CBZ, and even DJVU and audiobooks, offers send-to-Kindle, Google Drive hosting, LDAP and OAuth login, and speaks 20+ languages. Its ecosystem is massive.
The trade-off is that Calibre-Web is fundamentally a database viewer. It reads
Calibre's metadata.db and presents it in a browser. The UI is Bootstrap 3
(released 2013) with Jinja2 server-rendered templates. There are no reading sessions, no
time tracking, no streaks, no stats beyond "how many books and authors do I have." The
web EPUB reader stores your position in browser localStorage — not on the server. Switch
browsers and you lose your place.
There's no native KOReader support. KOSync doesn't exist in stock Calibre-Web. It does have Kobo device sync (emulating the Kobo store API), which is a feature Tome doesn't have.
The CWA fork
Calibre-Web Automated (5.7k stars) is a more ambitious fork that adds a lot of what stock Calibre-Web lacks: KOSync support with a downloadable KOReader plugin, automatic file ingest with format conversion, metadata enforcement that writes changes back into actual ebook files, smart duplicate detection, magic shelves with dynamic rules, and a multi-tab stats center with ECharts charts and CSV export. It's a serious project.
But it's still built on the same Flask/Bootstrap 3 foundation. The roadmap lists a
Svelte-based frontend rewrite as a high priority, which tells you where the current UI
stands. And the core requirement remains: you need a Calibre metadata.db to
start. Tome has its own database schema and doesn't depend on any external binary.
Kavita
Kavita is the most feature-rich self-hosted reading server available. It has everything: built-in readers for EPUB, comics, and PDF, OPDS with page streaming, reading lists, collections, smart filters with 30+ criteria, dashboard streams, EPUB annotations and highlights, reading profiles, age rating restrictions, OIDC single sign-on, custom themes with a community theme browser, real-time UI updates via SignalR, and i18n.
Since v0.8.9 (January 2026), Kavita also tracks reading sessions — time spent, pages read, words read (EPUB only), daily activity graphs, and reading pace. It's the only other self-hosted tool that takes session tracking seriously.
KOReader sync landed in v0.8.7 (July 2025) via the standard KOSync protocol — there's no custom plugin, just server-side endpoints that KOReader's built-in sync connects to. It supports EPUBs, CBZ/CBR, and PDF. Worth noting: Kavita's own wiki includes the warning "The automatic sync can potentially undo reading progress. We strongly advise against using it." The protocol relies on MD5 file hashes for book matching — rename or re-download a file and the link breaks. No session recording, no series browsing from the device.
The biggest caveat is metadata. Kavita's free tier only reads embedded metadata from your files (ComicInfo.xml, OPF). External metadata fetching — looking up covers, descriptions, and tags from AniList, MAL, or Hardcover — requires Kavita+, a paid subscription. Scrobbling to AniList is also behind the paywall. Tome fetches metadata from Google Books and OpenLibrary for free, no subscription needed.
Kavita is a .NET/Angular application. If you're comfortable with that stack and want the widest feature set, it's an excellent choice. It does things Tome doesn't — annotations, reading lists, OIDC, age restrictions, scrobbling — and probably always will, because those aren't on Tome's roadmap.
Komga
Komga is purpose-built for comics and manga, and within that niche it's arguably the best tool available. Its comic reader supports left-to-right, right-to-left, vertical scroll, and webtoon modes with spread layouts. It has Collections (group related series) and Read Lists (ordered book playlists across series). It handles one-shots as a first-class concept, detects duplicate pages within archives, and offers both OPDS v1.2 and v2 with page streaming extensions.
KOReader sync is supported via the standard KOSync protocol (no custom plugin) with a significant limitation: EPUB progress syncs at chapter boundaries only, not mid-chapter. For comics and PDFs, page-level accuracy works fine. No session recording, no series downloading from the device. Kobo sync is also built in (EPUB only).
What Komga doesn't have: stats. No reading sessions, no time tracking, no heatmaps, no reading pace, no streak counter. The only insight it offers is read/unread/in-progress badges. It also has no external metadata fetching — no Google Books, no OpenLibrary, no AniList lookups. Metadata comes entirely from embedded sources (ComicInfo.xml, EPUB OPF, Mylar series.json).
The frontend is Vue 2 with Vuetify 2 — Vue 2 reached end-of-life in December 2023. The EPUB reader uses a Readium 2 fork and is functional but minimal compared to dedicated EPUB tools (two themes only: white and black). Development is steady with a single dedicated maintainer and only 18 open issues, which speaks to code quality.
Other tools worth knowing about
The three above are the main alternatives for a general-purpose self-hosted ebook library. These are more specialised:
Audiobookshelf
Audiobookshelf (12.9k stars) is the dominant self-hosted audiobook server, and it handles ebooks too — EPUB, PDF, and CBZ/CBR. But ebook support is explicitly described as "basic." There's no OPDS, no KOReader sync, and the stats system is built around listening time, not reading. If your library is primarily audiobooks with some ebooks on the side, it's a great choice. For an ebook-first library, look elsewhere.
Stump
Stump (2.4k stars) is the most interesting newcomer. It's written in Rust with a React frontend, has KOReader sync, OPDS v1.2 and experimental v2, reading session tracking, and a clean architecture. The README is honest: "under active development and is an ongoing WIP. DO NOT expect a fully featured or bug-free experience." At v0.1.3 it's not production-ready, but it's one to watch.
LANraragi
LANraragi (3k stars) has been around for 12 years and is excellent at one thing: managing manga and doujinshi archives. It has a plugin system for metadata scraping, tag namespaces, Prometheus metrics export, and OPDS with page streaming. The limitation is single-user only — one admin password for the whole instance. If you're a solo manga reader with a large archive, it's battle-tested.
Ubooquity
Ubooquity is a closed-source Java application that was popular years ago. It still runs — the LinuxServer.io Docker image is maintained — but development appears stagnant, the documentation site is mostly broken, and there's no public source code. Not recommended for new setups.
Try it
Tome is free, open-source (AGPL-3.0), and deploys in under a minute.