The previous approach read each unknown book's metadata by downloading it over HTTP. The device's web server streams whole files synchronously and can't serve a partial/early-aborted read, so streaming just the OPF stalled the single-threaded server and a connect with side-loaded books took minutes. Since a book can only be marked on-device if it exists in the library, match locally instead: index the current library by normalized title and resolve each device file by its file name, attaching the library book's uuid so Calibre marks it. Same-title collisions are disambiguated by an author appearing in the device path (order-independent, so author-sort folders match); ambiguous files are left unmarked rather than mismatched. No network transfer is involved. The download path is kept only as an opt-in last resort (Fetch metadata, off by default) for library books whose on-device name doesn't resemble the title. Also adds per-book progress during books() and removes the unused streaming reader.
Calibre Plugins
Calibre plugins for CrossPoint Reader.
Plugins
CrossPoint Reader
A wireless device plugin that uploads EPUB files to CrossPoint Reader over WebSocket. The plugin auto-discovers devices on the local network via UDP broadcast.
It can also optimize EPUBs before transfer — mirroring the optimizer built into the CrossPoint web server — by resizing images to the device screen (X4 480×800 / X3 528×792, auto-detected), converting them to grayscale JPEG, and rewriting the container. The optimizer is based on the initial work by @zgredex, ported here from the firmware. Enable it in the plugin's settings; see the usage instructions.
See crosspoint_reader/README.md for protocol details, the optimizer, and configuration.
Installation
Download the latest release from the releases page, then in Calibre: Preferences > Plugins > Load plugin from file.
Development
Setup
# Build and install the plugin into Calibre
make install
# List all installed plugins
make list
# Remove the plugin
make remove
See calibre-customize docs for more options.
Releasing
The version is read from the version tuple in crosspoint_reader/driver.py.
# Bump the version (updates driver.py in place)
make bump-patch # 1.0.0 -> 1.0.1
make bump-minor # 1.0.0 -> 1.1.0
make bump-major # 1.0.0 -> 2.0.0
# Package the plugin into a zip (crosspoint_reader-vX.Y.Z.zip)
make zip
# Create a GitHub release with the zip attached (runs `make zip` first)
make release
make release uses the GitHub CLI (gh) to create a tagged release with auto-generated notes.
Typical workflow:
make bump-patch(orbump-minor/bump-major)- Commit the version change
make release
Project structure
crosspoint_reader/
__init__.py # Plugin entry point
driver.py # Device driver (discovery, upload, delete)
ws_client.py # WebSocket client and UDP discovery
config.py # Settings UI and preferences
log.py # Logging utilities