# Bookworm: an eBook reader for elementary OS that opens whatever format arrives

> Bookworm is a Vala and GTK application for elementary OS that reads EPUB, MOBI, FB2, PDF and comic archives without asking you to convert anything first. It builds with Meson and Valac against WebKit2GTK and Granite, ships translations through Weblate, and its newest tagged release is from 2019.

**babluboy/bookworm** — A simple ebook reader for Elementary OS

- Repository: https://github.com/babluboy/bookworm
- Stars: 1,387 · Forks: 106
- Language: Vala
- License: GPL-3.0
- Published: 2026-10-16 · Updated: 2026-10-16 · Language: en
- Canonical page: https://hysenlabs.com/projects/babluboy-bookworm

## The whole premise is that a book arrives in some format or another

Bookworm is described as a simple, focused eBook reader, authored by Siddhartha Das, and it is built for elementary OS.

The design goal is stated in the first line of the description: read the books you love without having to worry about the different format complexities like epub, pdf, mobi, cbr and so on. This version supports EPUB, MOBI, FB2, PDF and Comics in the CBR and CBZ archive formats, with more formats to follow soon.

That sentence tells you what the project is competing on. Every other ebook reader for the Linux desktop either focuses on one format done well or tries to be a library manager with a built-in reader. Bookworm's claim is the opposite: the format is not the interesting decision, so the reader should absorb it.

The format list is broader than it first appears, because it is implemented across several backends. EPUB and FB2 are markup formats, which is where html2text enters the picture. PDF goes through poppler, with libpoppler-glib-dev in the build dependencies. Comic archives are CBR and CBZ, which are archives of images, handled by unzip and unar. 

Two screenshots carry most of the product information in the readme: a library view and a reading view, plus a two page view, a dark mode library view, a dark mode reading view, a library list view and a preferences dialog. The presence of a dedicated dark mode set and a two page spread mode tells you this is a reading application rather than a document viewer, and the library list view says the library is a first class screen rather than a file open dialog.

The project also has a website at babluboy.github.io/bookworm, which the readme points to for details on features, shortcuts and installation guides for supported distributions.

## Building it needs a specific set of Debian and elementary packages

The build instructions are given for Ubuntu and Debian based distributions, and the dependency list is long enough that it is worth reading as a description of what the reader actually uses.

```bash
sudo apt-get install unzip poppler-utils unar html2text python2.7 libgtk-3-dev libgee-0.8-dev libgranite-dev libsqlite3-dev libxml2-dev webkit2gtk-4.0 libwebkit2gtk-4.0-37 libpoppler-glib-dev meson valac gettext curl ninja-build appstream git
```

The GTK side is the expected stack: libgtk-3-dev for widgets, libgee-0.8-dev for the GObject collection types Vala uses, and libgranite-dev for elementary's own widget set, which is what makes this an elementary application rather than a generic GTK one. libsqlite3-dev is the library database, and libxml2-dev handles XML parsing for the markup-based formats.

The content side is more telling. poppler-utils and libpoppler-glib-dev are the PDF engine. html2text converts the HTML inside EPUB and FB2 into something renderable. unzip and unar handle comic archives and, given the presence of MOBI, other archive formats too.

webkit2gtk-4.0 and libwebkit2gtk-4.0-37 are the reason the reader can render rich document content with embedded HTML rather than only plain text, and the pinned 4.0 series is a real constraint: those package versions do not exist on current distributions where WebKit2GTK has moved to 4.1 and later.

python2.7 in the same list is the strongest signal of age. It is listed as a build and run dependency, and Python 2 has been end of life for years. That single line tells you the build instructions describe a stack from a specific period, and a reader picking this up today should expect to update the dependency list rather than follow it literally.

## Meson, Valac and the run-it-from-source path

The build sequence is Meson and Ninja, which is the standard toolchain for GTK applications written in Vala.

```bash
git clone https://github.com/babluboy/bookworm.git
cd bookworm
meson build --prefix=/usr
mkdir -p build && cd build
ninja
```

The documented commands are slightly inconsistent, since the text says to run git clone to download the source code, meson build to configure the build environment and ninja test to build, and then gives a five line sequence that configures with meson build --prefix=/usr before creating the build directory and running ninja inside it. `meson build --prefix=/usr` configures the separate build directory; the following `cd build` enters it before `ninja` builds. The README prose mentions `ninja test`, while its command sequence uses `ninja`.

Installing is the second Ninja invocation, and the application is then launched by its desktop entry name rather than by a path.

```bash
sudo ninja install
com.github.babluboy.bookworm
```

Running com.github.babluboy.bookworm rather than bookworm is the Vala and elementary convention: the executable name is the reverse-DNS application ID, and the project ships that ID as a file at the repository root, com.github.babluboy.bookworm.yml. That YAML file should not be assumed to be AppStream metadata solely from its name; inspect the repository's packaging files for its purpose.

The packaging story goes further than a source build. There is a debian/ directory for the Debian package, a snapcraft.yaml for a Snap, po/ for the translation catalogue with gettext in the dependencies, and a meson/ directory for the build definitions. The Snap, the Deb and the AppStream metadata are all in the tree, which means the project was set up to be distributed through the channels elementary OS actually used, rather than only built from source by a developer.

## Translations through Weblate and an AppCenter history

The readme carries a Weblate badge for the translation status, linking to the hosted Weblate project for Bookworm, and there is a po/ directory in the repository with gettext in the build dependencies.

That combination is the standard open source translation workflow: strings live in the source as gettext catalogues, Weblate provides the web interface where contributors translate them, and the build compiles the result. For a reading application, translation matters more than the badge suggests, because the entire reading interface, the library labels, the preferences and the format labels are what a non-English reader sees every time they open the app.

The release history tells a different story, and it is the one to weigh. The listed releases are 1.1.0, an Appcenter Release for 1.1.0 dated 2018-10-02, 1.1.1, an Appcenter Juno Release for 1.1.0 dated 2018-10-10, and 1.1.2, an Appcenter Release for 1.1.2 dated 2019-08-10.

Two things follow. First, the distribution channel was AppCenter, elementary's own app store, and the AppCenter releases carried their own names and numbering, which is why the tag names and versions do not line up cleanly. Second, the newest tagged release is 1.1.2 from 2019-08-10, more than seven years old.

The last push was on 2026-10-14, so the source tree is still being worked on. That gap between the last release and the last commit is the honest signal: this is a project that is being maintained in the repository without a package being cut, so if you want the newest code you are building from source rather than installing a release. The documentation does not describe a distribution channel that has been updated since 2019, and it points to the project website for installation guides for supported distributions, so that page is where you would look for what is currently packaged.

## Where Bookworm stops and something else fits better

Three limits are structural rather than fixable, and they come from the same place.

The first is the platform. This is an elementary OS application built against Granite, the elementary widget set, with libgranite-dev as a hard build dependency and the AppStream metadata and AppCenter release lineage. The README also provides Ubuntu and Debian build instructions, so Granite alone does not establish that other Linux desktops cannot run it. Appearance and package availability can vary by distribution.

The second is the dependency vintage, already noted. python2.7 in the build list and a pinned WebKit2GTK 4.0 series mean the build instructions target a distribution generation that has moved on. Anyone trying to build this today on a current Ubuntu or Debian release will hit the WebKit package names first, and probably the Python 2 requirement.

The third is scope. The documentation does not mention DRM handling, and the dependency list has nothing resembling a DRM library. Readers with DRM-protected books should verify compatibility before relying on it. There is also no mention of sync between devices, no account system and no annotation feature in the visible documentation, so treat this as a local, single-device reader.

The alternative approach depends on what you actually need. For format coverage without an elementary dependency, an ebook reader built on Qt or Electron reads the same formats and runs on any desktop, and a headless tool such as calibre's command line converters covers the cases where you want to convert rather than read. For someone who wants a reading experience with a synced library across devices, that is a different class of application entirely, and Bookworm is not competing for that user.

For the specific case of an elementary OS user who wants to open whatever file arrives without converting it, there is not much else in the same category.

## Conclusion

Bookworm suits an elementary OS user who wants a native, focused reading application that opens the format a book happens to be in without a conversion step, and the multi-format handling is the whole point of the project. It uses elementary's Granite widgets, but the project also documents Ubuntu and Debian builds; check whether the older dependencies are available on your distribution. The README does not establish DRM handling or device sync. Before building it, check the dependency list against your distribution, because the documented build requires python2 and python2.7, and note that the last tagged release is 1.1.2 from 2019-08-10 while the last push was on 2026-10-14.

## FAQ

### What file formats does Bookworm support?

The project states this version supports EPUB, MOBI, FB2, PDF and Comics in the CBR and CBZ formats, with more formats to follow soon. The aim is that you read books without dealing with format conversions.

### How do I build Bookworm from source?

Install the listed dependencies with apt-get, clone the repository, then configure with meson build --prefix=/usr and build with ninja inside the build directory. The build uses Meson and Ninja with Valac, and you run ninja test for the test suite.

### Which desktop environment is Bookworm built for?

elementary OS. The build requires libgranite-dev, which is elementary's widget set, and the project ships AppStream metadata at com.github.babluboy.bookworm.yml alongside a debian/ directory, a snapcraft.yaml and AppCenter release history.

### How is Bookworm translated into other languages?

Through Weblate, with a translation status badge in the readme and a po/ directory holding the gettext catalogues. The build dependencies include gettext, which compiles the translations.

### When was the last Bookworm release?

The newest tagged release is 1.1.2, an Appcenter Release dated 2019-08-10, preceded by 1.1.1 from 2018-10-10 and 1.1.0 from 2018-10-02. The last push was on 2026-10-14, so the source tree is worked on without a package having been cut since 2019.

## Sources

- [babluboy/bookworm on GitHub](https://github.com/babluboy/bookworm)
- [Issues](https://github.com/babluboy/bookworm/issues)
- [License: GPL-3.0](https://github.com/babluboy/bookworm/blob/master/LICENSE)
- [README](https://github.com/babluboy/bookworm/blob/master/README.md)
- [Releases](https://github.com/babluboy/bookworm/releases)

---

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