cbzmanager

A comic archive manager for CBZ and CBR files: browse the library, validate every page, convert to WebP, merge chapters into volumes, edit pages in place — on the desktop, on Android and over SMB shares.

Flutter CI status Lazarus CI status Latest release MIT license
cbzmanager application icon

Two front-ends, one toolkit

The Lazarus application is the reference implementation; the Flutter port reuses the same documented behaviour and ships to mobile. Both expose the same commands in headless mode.

Desktop

Lazarus (Qt6) application

The original comic manager: a two-pane browser with thumbnails, an in-place page editor with staged changes, a volume sequence builder, a job monitor and internet cover search.

  • Linux and Windows builds from one codebase
  • ZIP operations entirely in RAM — no temp files
  • CLI mode inside the same binary
Mobile & desktop

Flutter port

A mobile-first rewrite with the same engine semantics, plus SMB share browsing so a library can live on a NAS and be edited from a phone or tablet.

  • Android, Linux and Windows
  • SMB2/3 shares with safe replace-on-write
  • Batch edit, page editor, merge, convert, validate

What it does

Every operation is per-file safe: one broken archive never aborts a batch, failures are reported per file, and originals are kept as *_OLD.cbz unless deletion is requested.

Validate

A deep check: the archive must be a valid ZIP and every image entry must decode. Pages are checked in parallel with identical results at any thread count.

Convert to WebP

Re-encode at quality 75, keeping the WebP version only when it is smaller. Existing WebP pages stay byte-identical, pages are renumbered, ComicInfo.xml is handled explicitly.

CBR → CBZ

RAR archives are read through libarchive and rewritten as CBZ entirely in memory. Sources are kept unless you ask for them to be deleted; .cbr previews are read-only.

Merge chapters into volumes

Series - 0001.cbz becomes Series V001.cbz, with chapters-per-volume derived from the existing volumes or set by hand. Volumes build in parallel; a failed run rolls its own output back and never touches files that predate it.

Page editor

Resize, adjust colours (invert, grayscale, sepia, RGB gains, saturation, contrast, brightness, gamma) and split pages — staged in memory and written only when you save.

Batch page edit

Apply the same resize, colour pipeline and split to a whole selection of archives, one worker per core, with a live preview of the first page.

ComicInfo.xml

View, edit, remove or generate the metadata embedded in an archive, per file or across a selection.

Internet image search

Search key-less sources (Openverse, Wikimedia Commons, museum collections, and more) for a cover and stage it as a new first page. Nothing is written until you save.

Headless CLI

validate, convert-webp, merge and cbr-to-cbz with a strict exit-code contract (0 success, 1 runtime error, 2 usage error) for scripting and cron jobs.

Install

Prebuilt binaries come from the release workflow; the Arch package and source builds cover the rest. Optional runtime dependencies (libwebp, libarchive, OpenSSL) are loaded dynamically and only needed by the features that use them.

Binaries

From the releases page

Lazarus build for Linux and the Flutter port for Linux, Windows and Android.

# Linux tarball
tar xf cbzmanager-*-linux-x86_64.tar.gz
sudo cp -r usr /
cbzmanager --version
Arch Linux

Build a package

Uses the PKGBUILD in pkg/.

# from the repository root
make pkg
sudo pacman -U cbzmanager-*.pkg.tar.zst
Source

Build it yourself

Lazarus 2.2+/FPC 3.2+ for the desktop app, Flutter for the port.

make release   # Lazarus, Linux
make test      # FPCUnit suite

cd flutter/app && flutter build apk

Command line

The same operations without a GUI. Flags may precede or follow the directory; --threads 0 means automatic.

$ cbzmanager validate "/library/Saga"
Checking 12 CBZ file(s)...
  OK   Saga - 0001.cbz (24 image(s))
  FAIL Saga - 0007.cbz: 23/24 images valid
Valid: 11  Invalid: 1  Total: 12

$ cbzmanager convert-webp "/library/Saga" --delete
Found 12 CBZ file(s)
  Saga - 0001.cbz: 24 page(s) converted
Summary: Converted: 12  Skipped: 0

$ cbzmanager merge "/library/Saga" --chapters-per-volume 7
Writing volume 1/3
Writing volume 2/3
Writing volume 3/3
Saga: 3 volume(s) created

$ cbzmanager cbr-to-cbz /library/old --delete
Found 2 CBR file(s)
  old - 01.cbr: 20 page(s) -> .cbz
Summary: Converted: 2  Skipped: 0

The Flutter port exposes the same four commands through dart run bin/cbzmanager.dart <command> with the same exit codes; run it with --help for the port's own summary.

Built to be trusted with a library

In RAM, always

Archives are read, transformed and rewritten in memory; the only disk writes are the final file and the optional *_OLD.cbz backup. Failures restore the original instead of leaving a half-written book.

Deterministic parallelism

Workers claim inputs and fill their own result slots, so the output is byte-identical whether you run one thread or eight. The test suites assert exactly that.

Documented parity

Behaviour follows a Python reference CLI and the Lazarus application, including the intentional divergences — all recorded in PARITY.md.

Tested on every push

FPCUnit for the Lazarus side and the Flutter suite (unit, service, widget and CLI integration tests, with live-SMB tests behind a flag) run in CI, together with formatting and static analysis.

Documentation