by ptk2010
Send notes, or sync folders and a tag, to an Xteink e-reader running CrossPoint firmware as EPUB, over Wi-Fi or through an Xteink Lover shelf.
Xteink Sync
Send Obsidian notes to an Xteink X3/X4 e-reader running CrossPoint firmware, as EPUB. No pandoc, no desktop app, works on desktop and mobile.
Two destinations
| Reader on Wi-Fi | Xteink Lover shelf | |
|---|---|---|
| How | Pushes the EPUB straight into the reader | Uploads to your online shelf; the reader downloads it over OPDS |
| Needs | Reader in File Transfer → Join Network, on the same network | A free account at Xteink Lover (or your own self-hosted copy) and an app token |
| Works from anywhere | No | Yes, even when the reader is off |
Pick the destination in Settings → Xteink Sync → Send to.
Three ways to send
- Send by hand: right-click a note or folder → Send to Xteink, or run Send current note. With the reader on Wi-Fi and the reader not reachable, EPUBs wait in a queue (
.obsidian/plugins/xteink-sync/outbox); run Send queued files later. - One-click sync: the ribbon icon or Sync folders and tag sends new and changed notes from the folders and tag you choose. Optionally removes files for notes that left the sync scope (only files this plugin sent).
- Auto-send new notes: turn on Send new notes automatically and new notes in the watched folder are sent a few seconds after they appear. The default folder is
Clippings, where Obsidian Web Clipper saves, so clipping an article in the browser puts it on your reader in one step. Existing notes and edits are not sent.
Scope is inclusive: a folder includes all its subfolders. Notes outside the chosen folders are only sent if they carry the sync tag.
Conversion
Notes are rendered with Obsidian's own Markdown renderer, so callouts, tables, embeds and links look like reading view. Images are scaled for e-ink and re-encoded as baseline JPEG (CrossPoint cannot show progressive JPEG or GIF). Mermaid diagrams and math are kept as source text, because the reader cannot draw them. Footnotes stay clickable.
Setting up the Xteink Lover shelf
-
Sign in at https://app.xteinklover.workers.dev (password or Google).
-
Account → App tokens → Create, copy the token.
-
In Obsidian: Send to → Xteink Lover shelf, paste the token, press Check.
-
On the reader: add the OPDS server shown under ⚡ Connect on the website.
-
Optional, instead of step 4: put the reader in File Transfer → Join Network and run Connect reader to Xteink Lover shelf (or the Connect reader button in settings). The plugin creates a new OPDS key and saves the "Xteink Lover" server on the reader over Wi-Fi (CrossPoint 1.6+), so you don't type anything on the reader. Readers still using the old key need the new one.
The token can list, add and remove books on your shelf, and create a new OPDS key for Connect reader. It cannot change your password or account, and you can revoke it on the website at any time.
Network use
This plugin makes network requests only when you send or sync, or press Check:
- Reader on Wi-Fi: plain HTTP to the reader on your local network (
crosspoint.localor the IP you set):/api/status,/api/files,/upload,/mkdir,/delete. CrossPoint has no login and no encryption, so only use this on a network you trust./deleteis only called for files this plugin sent, when Remove when a note leaves the sync scope is on. - Connect reader: plain HTTP to the reader on your local network,
GET/POST /api/opds, to save the shelf address, your username and the new OPDS key on the reader. - Xteink Lover shelf: HTTPS to the server you set (default
https://app.xteinklover.workers.dev), with your app token: list, upload and remove books. The EPUBs (your note content) are stored on that server. The hosted service runs on Cloudflare; you can self-host it instead (source). - Images from the web: off by default. If you turn on Download images from the web, images that notes link with
https://addresses are downloaded while converting (up to 10 MB each). Otherwise they are replaced by their alt text and nothing is fetched.
No telemetry, no analytics. Settings and sync history stay in the plugin's data.json in your vault.
Development
npm install
npm test # unit tests, no Obsidian needed
npm run lint # Obsidian's plugin review rules
npm run build # main.js
npm run install-vault -- <path-to-vault> # copy into a vault and enable
Releasing: bump version in manifest.json and package.json, add it to versions.json and a section to CHANGELOG.md, commit, then push a tag with the same number (no v). GitHub Actions tests, builds, attests and publishes the release.
Reader endpoints: docs/webserver-endpoints.md in crosspoint-reader.
License
MIT
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.