SkyWalker541/CrossDrop

Send books from KOReader to your Xteink (CrossPoint) over Wi-Fi. Four tabs: Connections (IP + reachability), Send A File (pick files, choose folder), Collections (create/manage/send collections), Delete Files (browse & remove). Instructions page. Precise read-position restore matching CrossPoint's sync.

โ˜… 4Forks 0LuaGitHub โ†—Compare
collectionscrosspointeinkepubkoreaderkoreader-pluginpluginwebdavxteink

README

CrossDrop

CrossDrop

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.

What it does

  • 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.

Screenshots

The four tabs of the dashboard:

Connections โ€” set the reader's IP, check it reads Reachable Send A File โ€” pick files and the destination folder
The Connections tab: WiFi row, Set WiFi IP, Stored Devices, Instructions button The Send A File tab: file list, search, destination folder row
Collections โ€” create, manage, and send collections Delete Files โ€” its own screen, away from the send controls
The Collections tab: create, view, edit, send collections The Delete Files tab: folder tree, files inline, paged

Setup

  1. On the reader: open File Transfer โ†’ Join Network โ€” it shows its IP address.
  2. On your device, copy crossdrop.koplugin/ into KOReader's plugins/ folder and restart KOReader โ€” or install straight from Storefront (search "CrossDrop").
  3. Open Tools โ†’ CrossDrop โ†’ Connections โ†’ Set WiFi IPโ€ฆ and enter the reader's IP. Tap the WiFi row to check it reads Reachable.
  4. Use the Send A File tab to pick files and choose a destination folder.

What's new in 2.0.0

  • 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.lua for separator/caption/menuRow
  • Deduped position sync โ€” single maybeSyncPosition() method
  • Lua scoping fix โ€” visibleModule() declared before use
  • All 470 tests pass, byte-identical deployments

Build & test

./scripts/build-zip.sh             # โ†’ releases/CrossDrop-Plugin.zip
luajit koreader-plugin/test/harness_crossdrop.lua

See AGENTS.md for repo conventions. GitHub Actions checks the Lua, runs the harness, and builds the zip on each push/PR.

Contributors

SkyWalker541

Issues