apps/readest-calibre-plugin/README.md
A calibre GUI plugin that pushes selected books — with their metadata — into your Readest cloud library. Re-pushing a book updates its existing entry instead of creating a duplicate, so you can edit metadata in calibre and re-send it any time.
Implements readest/readest#4863.
customColumns) and into the uploaded file's OPF
(calibre's own embedding, so custom columns travel as
calibre:user_metadata). Your calibre library files are never modified —
embedding happens on a temporary copy.Download Readest-<version>.calibre-plugin.zip from the
latest release, or build
it yourself:
make zip # builds dist/Readest-<version>.calibre-plugin.zip
calibre-customize -a dist/Readest-*.calibre-plugin.zip # or: make install
Or in calibre: Preferences → Plugins → Load plugin from file, then restart calibre and add the Readest button to the main toolbar if it is not visible.
Release zips are versioned from apps/readest-app/package.json by the release
workflow, which stamps PLUGIN_VERSION in __init__.py before zipping; the
version committed in git is a development placeholder.
For each book the best Readest-supported format is pushed, preferring
EPUB > PDF > AZW3 > MOBI > AZW > FB2 > FBZ > CBZ > TXT > MD.
At upload time the plugin embeds your current calibre metadata (including custom columns) into a temporary copy of the book file, so the copy in your Readest library is self-describing. Pushed books are then tracked by two keys:
urn:uuid:...) — this recognizes "this calibre book is already in
Readest" across pushes, even when the file bytes change;calibreSourceHash), which
detects whether the file itself changed since the last push — no local
state, so it works from any machine.Re-push behavior:
Pure-logic modules (api.py, wire.py, oauth.py) have no calibre or Qt
dependencies and are covered by unit tests:
make test # python3 -m unittest discover -s tests
The wire protocol mirrors what the Readest apps and readest.koplugin use:
Supabase auth (/auth/v1), GET/POST /api/sync for library rows, and
POST /api/storage/upload + presigned PUT for file blobs.