Doug (FIRE University)42 downloadsImport your Kobo highlights into Obsidian: one clean note per book, sorted by true reading order and grouped by chapter, with your own notes protected. Reads from a connected Kobo eReader or the Kobo desktop app.
English | 繁體中文
Import your Kobo highlights into Obsidian: one clean note per book, sorted by true reading order, grouped by real chapter names, with anything you write yourself left untouched.
Works with a Kobo eReader over USB, with the Kobo desktop app (no cable needed), and — optionally — over your local network so your Kobo can push highlights with a single tap.
Desktop-only. Everything stays on your machine: no accounts, no servers, no telemetry.

Most importers give you a flat dump of highlights. PaperFolio focuses on the things that make the notes actually usable months later:
bodymatter_0_5.xhtml. When a store book has no TOC entry in the database, the book's EPUB is read to recover the real names.
You can use any combination; a single sync merges them.
Connect your Kobo and let it mount, then click the ribbon icon or run Sync Kobo highlights to Obsidian. The plugin auto-detects the default mount path, or you can set the path to KoboReader.sqlite yourself.
If you read on your computer with the Kobo desktop app, its highlights are imported too. The plugin auto-detects its local database; leave the setting empty for auto-detection, or type off to disable this source.
While Obsidian is open, the plugin can listen on a port so a Kobo on the same Wi-Fi pushes its highlights with one tap — no cable at all.
http://192.168.1.20:8321/sync) and a key.KoboReader.sqlite to that address with the key. See kobo/INSTALL.md.Chapter names are cached from earlier USB syncs, so wireless syncs keep full chapter grouping even though the EPUB files are not available.
| Setting | What it does |
|---|---|
| Language | Interface and note language (Auto / English / Traditional Chinese) |
| Kobo database path | Empty = default mount path |
| Kobo Desktop database path | Empty = auto-detect, off = disable |
| Output folder | The only folder the plugin ever writes to |
| Import threshold | Skip books with fewer highlights than this |
| Highlight style | Callout / Blockquote / Bullet list |
| Group by chapter, show date, color as tag, filename format | Formatting |
| Import dogears, dogear label | Dogears (off by default) |
| Wireless receiver | Enable, port, key, sync address |

Generated highlights are wrapped in a sentinel block:
# Book title
Anything you write here is yours and is never modified.
<!-- KOBO:START Auto-maintained; do not edit text inside this block. -->
...generated highlights...
<!-- KOBO:END -->
Re-syncing replaces only the content between the markers and refreshes last_synced in the frontmatter. Everything outside is left exactly as you wrote it.
0.0.0.0 so another device on your LAN can reach it — that is what makes one-tap sync from the Kobo possible. It is protected by a randomly generated key sent in the X-PaperFolio-Token header, accepts only a SQLite upload on POST /sync (200 MB limit) plus a GET /ping health check, and stops when Obsidian closes or the setting is turned off.isDesktopOnly: true), because it uses Node APIs (fs, http, os, crypto) to read the database and run the optional receiver.sqlite3 broken.sqlite ".recover" | sqlite3 rescued.sqlite, then imported by pointing the plugin at the rescued file.npm install
npm run dev # watch mode, outputs main.js
npm run build # type-check + bundle
To test a build, copy main.js, manifest.json, and styles.css into <vault>/.obsidian/plugins/paperfolio-kobo/ and reload Obsidian.
SQLite parsing uses sql.js; EPUB table-of-contents reading uses fflate. Both MIT.
Kobo is a trademark of Rakuten Kobo Inc. This project is not affiliated with or endorsed by Rakuten Kobo Inc.
MIT — see LICENSE.