Skip to content

Releases: jarynclouatre/bindery

v3.3.1 — Fix Startup Crash When SKIP_CHOWN Unset

Choose a tag to compare

@jarynclouatre jarynclouatre released this 16 May 07:02

What's new

This is a bugfix release. entrypoint.sh crashed on startup with
SKIP_CHOWN: unbound variable for any deployment that did not explicitly
set the SKIP_CHOWN environment variable — which is the default for
almost everyone. The script runs under set -u, and the SKIP_CHOWN
check had no default, so the container exited before the app started.

SKIP_CHOWN now defaults to false, matching how PUID / PGID are
already handled. Setting SKIP_CHOWN=true still behaves exactly as
before.

Changes

  • Fixed: entrypoint.sh startup crash (SKIP_CHOWN: unbound variable) when SKIP_CHOWN is not set — it now defaults to false, consistent with the existing PUID / PGID pattern
  • Note: behaviour is unchanged when SKIP_CHOWN is set explicitly

If you were affected, just pull the new image — no compose or config
changes needed.

v3.3.0 — PDF Support for Comics

Choose a tag to compare

@jarynclouatre jarynclouatre released this 09 May 22:42

What's new

Bindery now recognises .pdf as a comic input format. Drop a PDF into Comics_in alongside your .cbz / .cbr / .zip / .rar files and it gets picked up by both the poll scanner and the inotify watcher, then handed to KCC just like any other comic source.

A note on EPUBs since an issue mentioned them too: KCC does not accept EPUB as an input format (EPUB is one of its outputs). Graphic-novel EPUBs should go in Books_in — they'll be handled by the kepubify pipeline. They won't get KCC's image-optimisation treatment, but that's a KCC limitation, not something Bindery can route around.

Changes

  • New: .pdf added to the comic input extension set — recognised by both poll-mode and inotify-mode watchers
  • Note: EPUBs continue to be handled by the books pipeline via kepubify; KCC does not accept EPUB as input
  • Added: unit test covering PDF dispatch in scan_directories

Existing setups need no changes — drop a PDF in Comics_in and it just works. Thanks to @ponchohoncho for the report (#X).

v3.2.0 — Optional chown Skip

Choose a tag to compare

@jarynclouatre jarynclouatre released this 09 May 08:35

What's new

By default, Bindery chowns its data folders on every container start so files end up owned by your PUID/PGID. That works everywhere a privileged container can write ownership — but on NFS shares mounted into unprivileged LXC containers, the kernel blocks chown even when normal reads and writes work fine. The result was Bindery aborting at startup over a step it didn't strictly need.

This release adds a SKIP_CHOWN environment variable to opt out. Set it to true in your compose file and the chown step is bypassed entirely — Bindery trusts that whatever ownership the volumes already have is good enough.

Changes

  • New SKIP_CHOWN environment variable — set to true to skip the initial chown step entirely
  • Useful for NFS/SMB mounts in unprivileged LXC containers, or any setup where the container can read and write but not change ownership
  • Default behaviour is unchanged — chown still runs unless SKIP_CHOWN=true is explicitly set

Disabled by default. Existing setups need no changes. Thanks to @ponchohoncho for the report (#7).

v3.1.1 — Skip Dot-Folders

Choose a tag to compare

@jarynclouatre jarynclouatre released this 20 Apr 02:05

What's fixed

Syncthing (and similar sync tools) create hidden dot-folders inside watched directories — .stfolder, .stversions, etc. Bindery was scanning inside them and attempting to convert whatever files it found there.

Changes

  • Any directory whose name starts with . is now skipped universally in both poll and inotify modes — covers .stfolder, .stversions, .archive, and anything else like them

No config changes needed. Existing setups will pick this up automatically on container restart.

v3.1.0 — Preserve Originals

Choose a tag to compare

@jarynclouatre jarynclouatre released this 20 Apr 01:46

What's new

By default, Bindery deletes source files from Comics_in after a successful conversion. For most setups that's fine — but if you're running Bindery as part of a larger workflow and need the originals to stick around, there was no way to stop it.

This release adds a Preserve Originals toggle in Bindery Settings. When enabled, source comics are moved to Comics_in/.archive instead of deleted. The subfolder structure is mirrored — a file at Comics_in/Marvel/issue01.cbz archives to Comics_in/.archive/Marvel/issue01.cbz. The .archive folder is never scanned or reprocessed.

Changes

  • New Preserve Originals toggle in Bindery Settings — moves source comics to Comics_in/.archive after conversion instead of deleting them
  • Comics_in/.archive is excluded from both the poll scanner and the inotify watcher — files there are never reprocessed

Disabled by default. No config changes needed for existing setups. Has no effect on book conversions.

v3.0.2 — Fix premature processing of in-progress file transfers

Choose a tag to compare

@jarynclouatre jarynclouatre released this 19 Apr 00:04

What's fixed

Bindery was processing files that hadn't finished copying yet.

When dropping files into /Comics_in via FileBrowser, the file watcher would start a conversion before the transfer was complete. FileBrowser (and most copy tools) briefly pause between write chunks — if that pause hit Bindery's 2-second poll window, the file appeared stable when it wasn't. KCC then tried to convert a partial/corrupt CBZ, failed, and renamed it to .failed, which blocked FileBrowser from finishing the copy.

Changes

  • wait_for_file_ready now requires 3 consecutive stable size readings (~6 seconds) instead of 1 before passing a file to the converter
  • inotify mode now also handles on_closed (IN_CLOSE_WRITE), which fires only after the writing process fully closes the file — a definitive "transfer complete" signal for clients like FileBrowser

No config changes needed. Existing setups will pick this up automatically on container restart.

v3.0.1 — Bug Fixes & Housekeeping

Choose a tag to compare

@jarynclouatre jarynclouatre released this 11 Mar 05:32

What's new

  • Fixed: entrypoint.sh crashed on startup when PUID/PGID matched an existing system UID/GID
  • Fixed: wait_for_file_ready waited up to 2s less than configured on odd timeout values
  • Fixed: _notify used hardcoded fallback values instead of DEFAULT_CONFIG
  • Improved: comic conversions now log STARTING when conversion begins, matching book log style
  • Added: .dockerignore to reduce Docker build context
  • Added: apprise to requirements-dev.txt so notification tests run in CI
  • Added: 5 unit tests covering _notify paths

v3.0.0 — Status, File Browser & Notifications

Choose a tag to compare

@jarynclouatre jarynclouatre released this 10 Mar 17:40

What's new

  • Added: Processing Status card — live table showing every conversion job with state, timestamps, duration, and a Retry button for failed files; history persists across restarts
  • Added: File Browser card — browse and download files from Books Out and Comics Out directly from the WebUI; no Samba or SSH required
  • Added: Notifications via Apprise — send push notifications on success and/or failure to ntfy, Discord, Slack, Telegram, Pushover, email, and 60+ other services
  • Fixed: Save Configuration button moved below all settings cards so it clearly applies to both KCC and Bindery Settings

v2.8.2 — Inotify Initial Scan Fix

Choose a tag to compare

@jarynclouatre jarynclouatre released this 10 Mar 04:43

What's new

  • Fixed: inotify watcher mode did not scan existing files on startup — files already sitting in Comics_in, Books_in, or Comics_raw when the container started were silently ignored; an initial scan now runs before the observer starts

v2.8.1 — Bug Fixes & Project Structure

Choose a tag to compare

@jarynclouatre jarynclouatre released this 08 Mar 22:59

What's new

  • Fixed: Dockerfile was hardcoding pip dependencies instead of installing from requirements.txt — now uses COPY requirements.txt + pip install -r for proper layer caching
  • Fixed: CI workflow hardcoded pip install flask pytest instead of using requirements-dev.txt
  • Fixed: requirements-dev.txt only contained pytest — added flask and watchdog so it reflects what tests actually need
  • Added: pyproject.toml with project metadata and pytest configuration