Fedor Kupryakov16 downloadsSync Kindle highlights with Calibre and read EPUB books side-by-side with your notes.
Desktop Obsidian plugin for syncing Kindle highlights and personal notes into your Obsidian vault and Calibre library, with an embedded side-by-side EPUB reader.
Supports both legacy Kindle USB drives (My Clippings.txt) and modern MTP Kindle firmware (ksdk_annotation_v1.db + .kfx), works without Python, and can also run offline from local files and a cached Kindle database snapshot.

Connect your Kindle (or keep a cached/local export ready) and trigger sync from the left ribbon (Sync Kindle highlights with Calibre) or Command Palette:
My Clippings.txt manually.My Clippings.txt, ksdk_annotation_v1.db (resolving KFX locations directly in TypeScript), or both combined without duplicating existing entries.metadata.db. Matched books without an .epub copy are queued and converted automatically via ebook-convert, then registered in metadata.db.sql.js-fts5 + jszip) and optionally writes annotations back into Calibre's metadata.db.kindle-title / kindle-bookId frontmatter or Kindle Highlights/), creates Author-Title.md notes, and appends only unseen highlights with deep links ([location](calibre://view-book/.../EPUB?open_at=epubcfi(...))).ePub.js pane scrolled to the exact quote.| Firmware / Mode | Source Files | Transport / Fallback |
|---|---|---|
| Legacy USB Mass Storage | documents/My Clippings.txt |
Linux (/run/media, /media, /mnt), macOS (/Volumes), Windows (D:–Z:) |
| Modern MTP Firmware (including Scribe / recent Kindles) | system/ksdk/.annotations/*/ksdk_annotation_v1.db + .kfx |
Linux GVFS (gvfs-mtp) / gio, Calibre MTP driver (calibre-debug), or libmtp |
| Mixed / Transitioning Devices | My Clippings.txt + ksdk_annotation_v1.db |
Automatically merged and deduplicated with personal notes preserved |
| Offline / Kindle Disconnected | Local My Clippings.txt + ksdk_annotation_v1.cache.db |
Configured paths, ~/, ~/Documents, ~/Downloads, ~/Desktop, vault root, and plugin cache |
Each live USB/MTP sync saves a local snapshot of ksdk_annotation_v1.db as .obsidian/plugins/kindle-calibre-sync/ksdk_annotation_v1.cache.db so later syncs continue working when the Kindle is unplugged.
ebook-convert CLI (.fb2, .fb2.zip, .azw3, .mobi, .rtf, .docx, .html, .htm, .xhtml, .txt, .odt, .lit, .prc, .kfx), registered under EPUB in metadata.db, and indexed before Markdown links are generated.search: or non-EPUB deep-link converts or picks up the EPUB with single-flight deduplication, indexes all highlights in memory and data.json, upgrades the note's links in place, registers EPUB in metadata.db, and opens the reader on that quote.A- / A+), arrow-key page navigation, active amber highlight + passive yellow highlights across the book, and an Open in Calibre button.Close desktop Calibre while syncing or converting so SQLite does not hold a lock on
metadata.db. Ifmetadata.dbis busy, Markdown updates and reading still complete and a non-fatal warning notice is shown.
divohub/kindle-calibre-sync in the BRAT plugin settings.main.js, manifest.json, and styles.css from Releases into <vault>/.obsidian/plugins/kindle-calibre-sync/.>= 1.0.0 (isDesktopOnly: true).metadata.db (auto-detected from Calibre config or ~/Calibre Library, ~/Documents/Calibre Library).ebook-convert CLI on PATH / standard install location for automatic conversion of non-EPUB formats.gvfs-mtp), libmtp, or Calibre's calibre-debug CLI.All fields are optional; leave them blank to use automatic detection:
metadata.db.kindle-title or kindle-bookId frontmatter, otherwise defaults to Kindle Highlights).My Clippings.txt path used when no Kindle is attached.ksdk_annotation_v1.db): Explicit path to an offline ksdk_annotation_v1.db or cached DB copy.metadata.db.calibre://view-book/... links inside Obsidian's embedded reader instead of forwarding to the OS handler.For headless automation without Obsidian open, the repository retains the standalone Python CLI scripts (kindle_sync.py, clippings_parser.py, calibre_adapter.py, obsidian_exporter.py):
pip install -r requirements.txt
python3 kindle_sync.py --watch
config.json for the standalone Python CLI{
"vault_path": "/path/to/your/ObsidianVault",
"highlights_folder": "Kindle Highlights",
"calibre_library_path": "~/Calibre Library",
"calibre_library_id": "Calibre_Library",
"clippings_file_relpath": "documents/My Clippings.txt",
"inject_calibre_annotations": true
}