Doug (FIRE University)92 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.
A firmware update wipes this. Kobo firmware updates clear
.adds/, which takes NickelMenu and this plugin's scripts with them — the sync button simply disappears. Reinstall NickelMenu, then generate the package again. (Verified 2026-08-31: NickelMenu v0.6.0 works on firmware 4.45.23697.) Syncing over USB is unaffected.
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.
Your Kobo can save every word you look up with its built-in dictionary. Turn it
on at More > Beta Features > My Words on the eReader — without it the list
stays empty. Then switch on Vocabulary > Sync looked-up words here, and each
sync writes those words to <output folder>/.kobo-words.json, ready for a
vocabulary plugin (such as WordFolio)
to import as flashcards.
On a Kobo you cannot look a word up once the text is selected — the selection takes over the long press. So while reading: long-press the word, read the definition, close it, and only then highlight the sentence.
That order matters because Kobo saves the word but not the sentence it came from. PaperFolio recovers the sentence in two ways, in this order:
If neither is available the word still syncs — the card simply has no example sentence, and a later sync can fill it in.
| 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) |
| Sync looked-up words, word list file | Vocabulary (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.