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.




