Search...Search plugins and themes...
⌘K
Sign in
  • Get started
  • Download
  • Pricing
  • Enterprise
  • Account
  • Obsidian
  • Overview
  • Sync
  • Publish
  • Canvas
  • Mobile
  • Web Clipper
  • CLI
  • Learn
  • Help
  • Developers
  • Changelog
  • About
  • Roadmap
  • Blog
  • Resources
  • System status
  • License overview
  • Terms of service
  • Privacy policy
  • Security
  • Community
  • Plugins
  • Themes
  • Discord
  • Forum / 中文论坛
  • Merch store
  • Brand guidelines
Follow us
DiscordTwitterBlueskyThreadsMastodonYouTubeGitHub
© 2026 Obsidian

Kobo Highlights Importer

ogkevinogkevin12k downloads

Import highlights from Kobo devices.

Add to Obsidian
  • Overview
  • Scorecard
  • Updates25

This plugin aims to make highlight import from Kobo devices easier.

  • Obsidian Kobo Highlight Importer
    • How to use
    • Templating
      • Variables
      • Template Syntax
    • Helping Screenshots
    • Contributing

How to use

Once installed, the steps to import your highlights directly into the vault are:

  1. Connect your Kobo device to PC using a proper USB cable
  2. Check if it has mounted automatically, or mount it manually (e.g. open the root folder of your Kobo using a file manager)
  3. Open the import window using the plugin button
  4. Locate KoboReader.sqlite in the .kobo folder ( this folder is hidden, so if you don't see it you should enable hidden files view from system configs )
  5. Extract

Templating

The plugin uses Eta.js for templating. You can fully customize the output using Eta's template syntax. See the Eta.js template syntax documentation for details.

The default template is:

---
title: "<%= it.bookDetails.title %>"
author: <%= it.bookDetails.author %>
publisher: <%= it.bookDetails.publisher ?? '' %>
dateLastRead: <%= it.bookDetails.dateLastRead?.toISOString() ?? '' %>
readStatus: <%= it.bookDetails.readStatus ? it.ReadStatus[it.bookDetails.readStatus] : it.ReadStatus[it.ReadStatus.Unknown] %>
percentRead: <%= it.bookDetails.percentRead ?? '' %>
isbn: <%= it.bookDetails.isbn ?? '' %>
series: <%= it.bookDetails.series ?? '' %>
seriesNumber: <%= it.bookDetails.seriesNumber ?? '' %>
timeSpentReading: <%= it.bookDetails.timeSpentReading ?? '' %>
---

# <%= it.bookDetails.title %>

## Description

<%= it.bookDetails.description ?? '' %>

## Highlights

<% it.chapters.forEach(([chapterName, highlights]) => { -%>
## <%= chapterName.trim() %>

<% highlights.forEach((highlight) => { -%>
<%= highlight.text %>

<% if (highlight.note) { -%>
**Note:** <%= highlight.note %>

<% } -%>
<% if (highlight.dateCreated) { -%>
*Created: <%= highlight.dateCreated.toISOString() %>*

<% } -%>
<% }) -%>
<% }) %>

Variables

The following variables are available in your template:

Variable Type / Structure Description
bookDetails Object Book metadata:
title, author, publisher, dateLastRead, readStatus, percentRead, isbn, series, seriesNumber, timeSpentReading, description
chapters Array of [chapterName, highlights] Each highlights is an array of bookmarks for that chapter
ReadStatus Enum mapping Maps read status values to their string labels
highlight Object Each highlight/bookmark:
- bookmarkId: Unique ID
- text: The raw highlight text
- contentId: Content identifier
- note: Optional note/annotation (if any)
- dateCreated: Date when the highlight was created
- color: Optional color of the highlight (if any) (0 for yellow, 1 for red, 2 for blue, 3 for green)

Example usage

<% it.chapters.forEach(([chapterName, highlights]) => { -%>
## <%= chapterName %>
<% highlights.forEach(h => { -%>
<%= h.text %>
<% if (h.note) { -%>
**Note:** <%= h.note %>
<% } -%>
<% if (h.dateCreated) { -%>
*Created: <%= h.dateCreated.toISOString() %>*
<% } -%>
<% }) -%>
<% }) %>

Date formatting examples

<!-- YYYY-MM-DD format -->
*Created: <%= h.dateCreated.getFullYear() %>-<%= String(h.dateCreated.getMonth() + 1).padStart(2, '0') %>-<%= String(h.dateCreated.getDate()).padStart(2, '0') %>*

<!-- Localized date -->
*Created: <%= h.dateCreated.toLocaleDateString() %>*

<!-- Localized date and time -->
*Created: <%= h.dateCreated.toLocaleString() %>*

For more advanced syntax, see the Eta.js template syntax documentation.

Template example using Obsidian callouts to display color of highlights

---
title: "<%= it.bookDetails.title %>"
author: <%= it.bookDetails.author %>
publisher: <%= it.bookDetails.publisher ?? '' %>
dateLastRead: <%= it.bookDetails.dateLastRead?.toISOString() ?? '' %>
readStatus: <%= it.bookDetails.readStatus ? it.ReadStatus[it.bookDetails.readStatus] : it.ReadStatus[it.ReadStatus.Unknown] %>
percentRead: <%= it.bookDetails.percentRead ?? '' %>
isbn: <%= it.bookDetails.isbn ?? '' %>
series: <%= it.bookDetails.series ?? '' %>
seriesNumber: <%= it.bookDetails.seriesNumber ?? '' %>
timeSpentReading: <%= it.bookDetails.timeSpentReading ?? '' %>
---

# <%= it.bookDetails.title %>

## Description

<%= it.bookDetails.description?.replace(/<[^>]*>/g, '') ?? '' %>

## Highlights

<% it.chapters.forEach(([chapterName, highlights]) => { -%>
### <%= chapterName.trim() %>

<% highlights.forEach((highlight) => { const calloutMap = {'1': 'failure', '2': 'info', '3': 'success'}; const calloutType = calloutMap[highlight.color] ?? 'quote'; const calloutText = highlight.text.split('\n').map(line => '> ' + line).join('\n'); -%>
> [!<%= calloutType %>]
<%= calloutText %>

<% if (highlight.note) { -%>
**Note:** <%= highlight.note %>

<% } -%>
<% }) -%>
<% }) %>

Helping Screenshots

Contributing

Please feel free to test, send feedbacks using Issues and open Pull Requests to improve the process.

HealthExcellent
ReviewCaution
About
Import highlights and notes from a Kobo device's KoboReader.sqlite directly into your vault. Customize output with Eta.js templates to include book metadata, chapters, creation dates and personal notes, and generate Markdown-ready files for each book.
ImportTemplatingFiles
Details
Current version
5.0.0
Last updated
4 months ago
Created
4 years ago
Updates
25 releases
Downloads
12k
Compatible with
Obsidian 0.15.9+
Platforms
Desktop only
License
MIT
Report bugRequest featureReport plugin
Author
ogkevinogkevin
github.com/OGKevin
GitHubogkevin
  1. Community
  2. Plugins
  3. Import
  4. Kobo Highlights Importer

Related plugins

QuickAdd

Quickly add new notes or content to your vault.

Kindle Highlights

Sync your Kindle book highlights using your Amazon login or uploading your My Clippings file.

Make It Rain

Pull Raindrop.io bookmarks, highlights, and attachments into Markdown notes with rich metadata, smart folder structures, and native file support.

Create Note in Folder

Add commands to create a note in a specific folder.

Advanced Exclude

Enhances the Excluded files setting bringing gitignore syntax.

RSS Dashboard

A dashboard for organizing and consuming RSS feeds, YouTube channels, and podcasts with smart tagging, media playback, and seamless content flow.

Notebook Navigator

A better file browser and calendar inspired by Apple Notes, Bear, Evernote and Day One.

Importer

Convert your data to Markdown files you can use in Obsidian. Works with Apple Notes, OneNote, Evernote, Notion, Google Keep, and many other formats.

Templater

Create and use dynamic templates.

Recent Files

Display a list of recently opened files.