Send books from KOReader to your Xteink (CrossPoint) e-ink reader over Wi-Fi — no cable, no cloud.
📦 Also available in the Storefront plugin — open Tools → Storefront, search "CrossDrop", and tap Install. No manual file copying needed.
- A full-screen CrossDrop dashboard (Connections / Send A File / Collections / Delete Files) inside KOReader's Tools menu.
- Send A File scans your device and lists only what the reader can actually open — EPUB, XTC/XTCH, TXT, and BMP (case-insensitive): search and multi-pick from the list, or send the file you're currently reading.
- Collections tab: create named collections, add/remove books, send a whole collection at once.
- Delete Files is its own tab on purpose: deleting never lives among the send controls. It browses the reader as the same folder tree (files and folders), asks "Delete file?" / "Delete folder and its contents?" first, then removes it — a folder that still holds anything is purged depth-first first (the reader's WebDAV DELETE does not recurse), and the tree refreshes in place.
- Instructions page: step-by-step setup guide accessible from the Connections tab, with a back button to return.
- visibleTextOffset sync: precise read-position restore on the reader using the same ParagraphStreamer logic as CrossPoint's KoSync (spine + visibleTextOffset in progress.bin).
- A "… please wait" screen while a file streams, and a toast when it lands. There's deliberately no progress bar: the transfer drains faster than e-ink can repaint.
| Connections — set the reader's IP, check it reads Reachable | Send A File — pick files and the destination folder |
|---|---|
![]() |
![]() |
| Collections — create, manage, and send collections | Delete Files — its own screen, away from the send controls |
|---|---|
![]() |
![]() |
- On the reader: open File Transfer → Join Network — it shows its IP address.
- On your device, copy
crossdrop.koplugin/into KOReader'splugins/folder and restart KOReader — or install straight from Storefront (search "CrossDrop"). - Open Tools → CrossDrop → Connections → Set WiFi IP… and enter the reader's IP. Tap the WiFi row to check it reads Reachable.
- Use the Send A File tab to pick files and choose a destination folder.
- Instructions page — dedicated guide with scrollable text and back button
- visibleTextOffset sync — precise read-position restore using the same ParagraphStreamer logic as CrossPoint's KoSync
- 4-tab dashboard — Connections, Send A File, Collections, Delete Files
- Collections tab — create, manage, and send named collections
- Row label update: "Set WiFi IP (may change)" clarifies dynamic vs fixed IP
- Guide text updated — Steps 4 & 7 distinguish dynamic IP vs router-fixed Stored Devices
- Scrollable Instructions page — no more overflow on small screens
- Widget dedup — shared
crossdrop_widgets.luafor separator/caption/menuRow - Deduped position sync — single
maybeSyncPosition()method - Lua scoping fix —
visibleModule()declared before use - All 470 tests pass, byte-identical deployments
./scripts/build-zip.sh # → releases/CrossDrop-Plugin.zip
luajit koreader-plugin/test/harness_crossdrop.luaSee AGENTS.md for repo conventions. GitHub Actions checks the Lua, runs the
harness, and builds the zip on each push/PR.




