A modern calibre for people who love ebooks

calibre-zen rethinks calibre's interface so the hard things get easy and the easy things get trivial. Same library manager, far less friction.

It installs as a separate app, so calibre stays untouched. Run both at once. Your libraries, settings and plugins do not move.

Why I forked calibre

A fork of calibre, by Nadeem Siddique

The parts a stylesheet cannot reach

A stylesheet reaches a widget only as far as the widget allows. calibre’s tag browser, book list, cover grid and status bar all paint themselves, so no rule was ever going to change them. Those get widgets of our own: built by composition, put in front of calibre’s existing models and signals, with the behaviour left exactly where it was.

Keeping it that way is what keeps the fork pullable. Nothing here edits calibre. Each piece wraps a method from the outside and can be turned off with an environment variable, so an idea that does not work out costs one variable rather than a merge conflict.

Improvements

  • The tag browser’s tree replaced with a filter panel: one screenful of rows at a time, counts beside each value, and a Reset that clears the lot
  • The centre split in two, a preview of the selected book above the list, with the search bar and a Grid/Table switcher in the strip between them
  • The book list rebuilt around a composite Details column on tall row cards, while sorting, inline editing, column resizing and the header menu stay calibre’s own
  • Three cover-grid densities, and every cover cropped to one shape so a shelf has a straight edge rather than a ragged one
  • A status bar that reports what is happening behind your back: the current library, the sort, whether the content server is sharing and on which port, and any job still running
  • Every piece switchable: CALIBRE_ZEN_FILTERS=0, CALIBRE_ZEN_CENTRE=0 and CALIBRE_ZEN_STATUS=0 each give calibre’s own back

Consistent icons, typography and themes

The numbers all come from one place. A colour ramp, a radius scale, a type scale and a single density sit behind the whole stylesheet, so a button, a menu row, a text field and a tab agree on their padding, their corner and their weight instead of each having been drawn on its own day. Variants sit on top of that, which means a primary button and a destructive one differ because their intent differs, not because they were styled apart.

Icons follow the same rule. Every one of calibre’s top-level icons is redrawn as a line glyph and inked in the palette colour at paint time, so nothing is a small colour photograph sitting next to a label. An unmapped name falls through to calibre’s own icon, so a pack is never required to be complete.

Improvements

  • One token set behind the sheet: colour ramp, radius scale, type scale, density
  • All 179 of calibre’s top-level icons redrawn as line glyphs, rendered from SVG in the palette colour and re-inked whenever the palette changes
  • Inter for the interface, Literata for anything being read, both bundled so the app looks the same on every machine
  • Menus, buttons, fields and tabs share one padding and one corner radius, with primary and destructive variants where intent differs
  • Six colour schemes, and a switcher for match system, light, dim or dark, both on the toolbar and both applied without a restart
  • Chevrons in place of Qt’s arrow triangles, and a rounded window behind every rounded popup

Why I forked calibre

calibre is the best library manager there is, and it looks like it was designed in 2008, because it was.

I have used calibre for years and it is genuinely powerful. But the onboarding is rough and the interface is inconsistent enough that simple things feel hard. Buttons that look the same behave differently. Spacing changes from one panel to the next. I have OCD and ADHD, and the more I used calibre the more that inconsistency pulled my attention away from what I was actually trying to do.

I do not mean this unkindly. calibre is Kovid’s labour of love and it does more than any other tool in its category. I had let this idea go several times before, because the answer was always the same: it is old Qt, that is just how it is. But it kept bothering me, so I opened the codebase to see how far I could get.

I mostly build web applications and I am not a Qt expert. What I do have is a sense of how to model an interface and move around one. I used AI to throw together some cheap prototypes, pulled theme tokens from shadcn and Tailwind, and built a consistent layer first, so every button, label, menu and icon shares the same padding and sizing. Then I added variants so each one can match its intent. Once that held up, I spent a weekend getting it into a state other people could try.

I hope you find it useful.

Key decisions

  • Everything is built around themes and variants, so the fork touches form and not functionality
  • Custom widgets use composition and stay modular, which makes pulling upstream changes much easier
  • The restyling lives in an overlay package that patches calibre from the outside instead of editing it, so upstream stays pullable and any part of it can be switched off with an environment variable

Improvements

  • A full palette and stylesheet, with six colour schemes and a light, dim and dark switcher
  • Every top-level icon redrawn as a line glyph, inked in the palette colour
  • Inter and Literata bundled, so the interface reads the same on every machine
  • The tag browser tree replaced with a filter panel
  • Primary and destructive button variants, rounded popups, chevrons instead of triangles