██╗███╗ ██╗██╗ ██╗██████╗ ██████╗ ██╗ ██╗███╗ ██╗██████╗
██║████╗ ██║██║ ██╔╝██╔══██╗██╔═══██╗██║ ██║████╗ ██║██╔══██╗
██║██╔██╗ ██║█████╔╝ ██████╔╝██║ ██║██║ ██║██╔██╗ ██║██║ ██║
██║██║╚██╗██║██╔═██╗ ██╔══██╗██║ ██║██║ ██║██║╚██╗██║██║ ██║
██║██║ ╚████║██║ ██╗██████╔╝╚██████╔╝╚██████╔╝██║ ╚████║██████╔╝
╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚═════╝
Inkbound exports your Obsidian notes as EPUB ebooks, so you can read them comfortably on an e-ink device instead of a laptop screen.
Website: kidpeterpan.github.io/inkbound
Export from the command palette or a right-click menu, in three ways:
- A single note becomes a one-chapter book.
- A folder of notes becomes a book, with chapters in the order your index note links them, and subfolders as nested Parts.
- A note plus everything it links to — the active note and the notes it links to, out to a depth you choose, become one book, with real links between the chapters that came from the same export.
Every export produces a real, valid EPUB 3 file. Images in your notes come through, and so do Mermaid diagrams — as pictures rather than live diagrams, since most e-ink readers cannot draw them otherwise. Any language works, including Thai.
Books get covers. Set cover: in a note's frontmatter (a vault path, a
[[wikilink]], or a URL) and the finished book carries that artwork: it shows
on your e-reader's library shelf, and the book opens on a full-page cover
before the first chapter. No cover:? The first image of the note becomes
the cover automatically.
The table of contents navigates to the section. Every chapter's headings appear as sub-entries in the book's TOC, so on an e-ink reader you can jump straight to a section instead of scrolling a long chapter. The setting TOC heading depth (default level 3) controls how deep the sub-entries go; set it to Off for the plain chapter-only TOC.
Math typesets as pictures. Inline $...$ and display $$...$$ LaTeX in
your notes renders at export time (MathJax) and embeds as plain images — the
same strategy as Mermaid — so it displays identically on every reader,
including e-ink devices that cannot draw inline SVG. Display math sits
centered on its own line; inline math rides the text baseline. Expressions
that cannot render (broken LaTeX, or non-Latin text such as Thai inside the
delimiters) degrade to a readable fallback with an export warning instead of
failing the book — write prose outside the delimiters for Thai text.
Thai books carry their own font. Any book whose chapters contain Thai gets Noto Sans Thai (Regular + Bold, SIL OFL 1.1) embedded automatically, so Thai renders consistently on e-ink readers even when the device has no Thai font of its own — correct compound vowels included. The license text ships inside the book; Latin text keeps the reader's normal reading font. Books without Thai stay fontless and byte-stable, and the Embed Thai font setting turns the whole behavior off if you ever want it.
Images are shrunk to fit the screen. Screenshots and phone photos are far larger than any e-ink screen can show, and every extra pixel makes the book bigger, slower to send to your device and slower to turn pages. So a PNG or JPEG from your vault that is wider than the Image width setting (1200 px by default) is scaled down to that width as it goes into the book, keeping its proportions and its file type. Images already that narrow, SVG, GIF and WebP files, animated PNGs, covers, and the diagrams and math Inkbound draws itself are left exactly as they are, and an image whose smaller version would come out larger keeps its original bytes, so optimization never makes a book bigger. An image that cannot be processed goes in as it is and the export report names it. Turn Optimize images for e-ink off to get your images exactly as they are in your vault, and turn Convert images to grayscale on for a black-and-white screen: it removes the color from the images that are shrunk.
Footnotes work as footnotes. Numbered [^1], named [^note] and inline
^[…] notes become real EPUB footnotes: tap the small raised number to reach the
note, and the arrow at the end of the note to come back. Readers that show
footnotes as pop-ups can show them that way. A chapter's notes are gathered at its
end and numbered in the order you meet them — including notes that arrive through
embedded notes — and a note you refer to more than once gets a back-arrow for each
reference (↩︎1, ↩︎2). A footnote that cannot be carried across, such as a
reference with no note or a note nothing refers to, is left out just as Obsidian's
own reading view leaves it out, and the export report says which note it was in.
A book's index note in Obsidian, with its chapters as linked notes:
Right-click it and export the note plus everything it links to:
With Push after export turned on, the finished book lands straight in the Boox library over Wi-Fi and reads like any other EPUB — Thai text, tables and all:
| On the shelf | Open on the device |
|---|---|
- Obsidian 1.5.0 or newer.
- Desktop and mobile — Inkbound runs on Windows, macOS and Linux, and on iOS and Android. Where books are saved differs by platform (see "On a phone or tablet" below).
From Obsidian's Community plugins browser — the easiest way, and the one that keeps Inkbound updated for you:
- Settings → Community plugins → Browse.
- Search for Inkbound, then Install.
- Enable it.
That works on desktop and on mobile alike.
From a GitHub release, if you would rather install manually:
- Download
main.jsandmanifest.jsonfrom the latest release. - Copy both files into
<vault>/.obsidian/plugins/inkbound/(create the folder if it doesn't exist). - In Obsidian, go to Settings → Community plugins and enable Inkbound.
Warning
If Obsidian was already running when the plugin folder was added, the new plugin will not appear in the Community plugins list until you click the refresh icon at the top of that list (or restart Obsidian).
Three export commands, available from the command palette and from a right-click context menu:
- Export note to EPUB — exports the active note (or the note you right-clicked) as a single-chapter book.
- Export folder as EPUB (active note's folder) — exports the notes in the active note's folder as one book. Right-clicking a folder directly offers the same export for that folder.
- Export note + linked notes to EPUB — exports the active note plus the notes it links to as one book.
Preview before you export. Two more commands, in the command palette and the same right-click menus, show the book first and build it only if you say so:
- Preview folder export (active note's folder), or Preview folder export on a folder you right-click.
- Preview note + linked notes export, on the active note or a note you right-click.
A window lists the chapters in the order the book will have, with Parts nested the way its table of contents will nest them, each line with the note it comes from, above a summary of the book's title, author, language, where its cover will come from and any book details it will carry. Choose Export to write exactly that book, or Cancel (or press Escape) to write nothing. A preview renders no note, fetches no cover and writes no file. It is a plan, not a proof: warnings about images, links and math, a chapter that fails to render, whether the Thai font is embedded and the backlink trails are only known once the book is built, and the window says so. The one-step export commands above are unchanged.
Export all books at once. Export all books, in the command palette, finds every
book in your vault and exports each one exactly as exporting its folder would: the same
chapters, order, Parts, metadata, file name and output folder, and the same push to your
Boox when Push after export is on. Use it to refresh a whole library after updating
Inkbound or after adding properties such as description or series to many books.
- What counts as a book: a folder with a note tagged
bookandmain(written as a list,tags: [book, main]). A folder inside a book is one of its Parts, never a book of its own. A note that is only named after its folder does not count, and neither does the top level of the vault. - Nothing happens until you confirm. A window lists every book it found, by title and folder; Export all runs them one after another, Cancel writes and pushes nothing.
- Two books with the same file name: the first one in the list is written and the
second is marked as skipped in the list, so neither silently replaces the other.
Titles that differ only in case or punctuation (
Tidal Notes,tidal notes) name the same file. - One book failing never stops the rest. One notice counts through the books; at the end, one summary says how many were exported, with warnings, skipped or failed. Tap it (or run Show last export report) for the report of the whole run, every book with what happened to it and its warnings.
The finished .epub is written to the folder set in Settings → Inkbound →
Output folder (~/Downloads by default), and a notice in Obsidian confirms
the path once the export finishes. If Push after export is turned on,
the same notice reports whether the send to your Boox device succeeded.
When something in your notes could not be carried into the book, the export still finishes — that is deliberate — and the notice says how many things degraded. Tap it to open the export report, which lists every one of them grouped under the note it came from, so you know exactly which note to go fix:
- a missing or unsupported image,
- an embed that could not be resolved, or a Bases view that has no book equivalent,
- an expression that would not typeset,
- a chapter that failed to render at all,
- and anything that applies to the whole book rather than one note, such as the Thai font not loading, listed separately at the end.
The notice disappears after a few seconds. Show last export report in the command palette brings the same report back for the most recent export, for as long as Obsidian stays open. A Copy report button in the report copies it as plain text, which is what to paste into a bug report. A clean export shows its usual notice with nothing extra, and the report simply says there were no warnings.
Add export: false to a note's properties and that note is left out of the book:
not a chapter, not in the table of contents, not a Part. Every other note keeps
its place, and the note itself stays in your vault where it is, with every link
to it intact — so a chapter template, a scratch note or last year's draft can
live in the book's folder without being shipped to your reader.
---
export: false
---- Only the real
falsecounts.export: "false"(quoted) is text, and the note stays in the book — as doesexport: true, or any value that is notfalse. A typo therefore ships a note rather than silently dropping one. - Folder books and note + linked notes books both honour it. A marked note reached by the link walk is not walked through either, so a note that only it links to is not pulled in. The note you asked for by name is always in the book: exporting a marked note on its own writes its book, and a linked export still starts with the note you ran it on.
- The note a book takes its title from keeps that job. Marking a book's index note removes its page, not its role: the book keeps the title, author, language and cover that note gives it, and its links still decide the chapter order. A Part whose index note is marked keeps that note's title and opens on its first chapter.
- You are told what was left out. The preview and the export report each carry one line naming the notes, so a note you marked months ago is never missing from a book without you knowing.
- A book whose every note is marked is not written. The export says the folder has no Markdown notes, exactly as it does for an empty folder.
Books with no marked notes are unchanged, entry for entry.
Found under Settings → Community plugins → Inkbound:
| Setting | Default | Purpose |
|---|---|---|
| Output folder | "" (empty → ~/Downloads) |
Absolute path or ~/… folder the EPUB is written to. Existing files of the same name are overwritten. |
| Output folder (mobile) | "Exports" |
Vault-relative folder books are saved into on a phone or tablet, since mobile has no filesystem-folder-anywhere (see "On a phone or tablet"). Desktop never reads or writes it. |
| Default link depth | 1 |
How many hops of wikilinks Export note + linked notes follows outward from the active note (1–3, via a slider). |
| Backlink listing position | start (Start of chapter) |
Where each chapter shows its "Linked from:" list of the chapters in the same book that link to it — at the start of the chapter, the end, both, or none (disables the list entirely). Chapters nothing links to show no list. |
| TOC heading depth | 3 (Level 3) |
Deepest heading level listed under each chapter in the book's table of contents (0–6, via a dropdown). Off restores the flat chapter-only TOC. |
| Embed Thai font | true |
When ON, books whose chapters contain Thai text get Noto Sans Thai embedded (Regular + Bold, with its OFL license file inside the book). OFF keeps every book fontless. |
| Optimize images for e-ink | true |
When ON, PNG and JPEG images wider than Image width are shrunk to it as they enter the book. SVG, GIF and WebP are never changed. OFF embeds every image exactly as it is in your vault. |
| Image width (px) | 1200 |
The widest an image may be in the book (600–3000, in steps of 100). Images already this narrow are left alone. |
| Convert images to grayscale | false |
For black-and-white e-ink screens: the images that are shrunk also lose their color. Leave off for a color e-ink device. Only applies while image optimization is on. |
Language (dc:language) |
"th" |
Fallback language used when a note has no usable language frontmatter field. |
| Fallback author | "" (empty → "Unknown") |
Used as dc:creator when a note/index has no usable author frontmatter field. |
| Device URL | "" |
The BooxDrop device's address as shown in the BooxDrop app, e.g. http://192.168.1.42:8085. Required for pushing. |
| Push after export | false |
When enabled (and a Device URL is set), every export is uploaded to the device after being saved locally. Below this toggle is a Test connection button to verify the Device URL. |
Say you keep book notes like this, one folder per book, one note per chapter:
Reading/
└── grokking-algorithms/
├── grokking-algorithms.md <- the index note
├── 01_introduction.md
├── 02_selection_sort.md
├── 03_recursion.md
├── 10_where_to_go_next.md
└── assets/
└── fig02-1_arrays.png
Give the index note this frontmatter:
---
aliases:
- Grokking Algorithms
author: Aditya Y. Bhargava
language: english
cover: assets/grokking-cover.png
coverUrl: https://example.com/grokking-cover.jpg
tags:
- book
- main
---Then right-click the grokking-algorithms folder and choose Export folder
to EPUB. You get a single Grokking Algorithms.epub containing:
- The index note first, then the chapters in the order the index note links
them — list
[[03_recursion]]before < 8000 code>[[01_introduction]] and the book follows. Only regular links count (an embed![[…]]does not), the first link to a note wins, and links to notes outside the folder are ignored. - Notes the index note never links are still included, after the linked ones,
in the old order: numeric
NN_prefixes first (10after03, because the prefix is read as a number), then the rest by name. So the prefixes still work — they are just no longer the only way to order a book. - Grokking Algorithms as the book title, taken from
aliasesrather than the filename, with Aditya Y. Bhargava as the author. - The cover image downloaded from
coverUrland embedded, so it shows on your reader's shelf. - Every figure from
assets/embedded in the chapter that references it, whether you wrote it as![[fig02-1_arrays.png]]or. dc:languageset toen, fromlanguage: english.
The index note is found by its book + main tags. If you would rather not
tag it, name it after the folder instead — grokking-algorithms.md inside
grokking-algorithms/ is detected the same way. Without either, the folder
name becomes the title and every note is treated as a chapter.
A longer book can be split into subfolders, and each subfolder that contains notes becomes a Part in the table of contents:
Reading/
└── clean-architecture/
├── clean-architecture.md <- the index note
├── 00_preface.md
├── Part I – Introduction/
│ ├── Part I – Introduction.md <- optional sub-index (same detection rules)
│ ├── 01_what_is_design.md
│ └── 02_a_tale_of_two_values.md
├── Part II – Programming Paradigms/
│ └── 03_paradigm_overview.md
└── assets/ <- no notes → no Part
- Every note under the folder, at any depth, is a chapter; the reading order is the table of contents read top to bottom.
- A subfolder with its own index note (tagged
book+main, or named after the folder) uses that note's title as the Part title, puts it first, and orders the Part's chapters by its links. Without one, the folder name is the Part title and its notes follow the numeric-then-name order. - Tapping a Part in your reader opens its first chapter. Its chapters (and any nested Parts) are listed beneath it.
- The root index note can place whole Parts too: linking to any note inside
Part II/before[[00_preface]]puts Part II before the preface. Parts it never mentions follow, ordered by folder name alongside unlinked notes. - Folders with no notes beneath them (an
assets/folder) produce nothing.
Note that this is a change from earlier versions, which ignored subfolders
entirely: a drafts/ folder inside a book folder now shows up as a Part. Mark
the notes you don't want in the book with export: false (see
Keeping a note out of a book), or move the
folder out of the book folder.
Chapter titles come from each note's first # heading when there is one, so
03_recursion with an # Recursion heading appears in the table of contents
as Recursion. No heading? The note's frontmatter aliases are used next,
then the filename as a last resort. One consequence: in a folder export, the
index note's own heading (often the book title itself) becomes the first TOC
entry — that is expected, not a bug.
The table of contents also lists each chapter's own headings underneath it —
the ## and ### sections inside a long chapter — as links that jump
straight to that section when tapped. Use the TOC heading depth setting
to include deeper levels, or turn it off for the plain chapter list.
Every export scope resolves its book metadata from the exporting note's own frontmatter (the active note for single/linked exports, the detected index note for folder exports). Recognised fields:
-
aliases— sets the book title (dc:title). The first non-empty string, or first non-empty string in the list ifaliasesis a list, is used; otherwise the note's filename is used. This is the book title only — chapter titles come from each note's first#heading, falling back toaliasesand then the filename. -
author— setsdc:creator. A string is used as-is; a list of strings is joined with", "; anything else falls back to the Fallback author setting, or"Unknown". -
language— setsdc:language. A BCP-47 tag (e.g.en,en-GB,th) is used as-is (lowercased). Otherwise, one of these names is matched, case-insensitively:Frontmatter value dc:languagethaithenglishenjapanesejachinesezhkoreankoAnything else falls back to the Language setting.
-
coverUrl— the book's cover image, as a fullhttp://orhttps://URL. The downloaded file must really be a PNG, JPEG or WebP: Inkbound goes by the file itself, not by what the server says it is, so an address that answers with a web page (a hotlink-protected image, a login wall) or with a GIF or AVIF gives a book with no cover and a warning in the export report. A cover that fails to download degrades the export to coverless rather than failing it. -
tags: [book, main]— for folder exports, marks which note in the folder is the index/metadata source. If no note is tagged this way, Inkbound looks for a note whose filename matches the folder name. -
export—falseleaves that note out of the book: not a chapter, not in the table of contents, not a Part. Every other value (including the quoted"false", which is text) leaves the note in. See Keeping a note out of a book.
Six more fields describe the book in your e-reader's library. They are read from the same note as the title, author and language, and each one is optional:
description: A field guide to tidal pools and the life on rock shelves.
publisher: Tide Press
date: 2024-01-15
series: Tidal Notes
series_index: 2
subjects: [history, marine biology]description— the book's blurb (dc:description), as plain text. Markdown and markup characters are kept as typed, not formatted.publisher—dc:publisher.date— the date of the content (dc:date), not the day the book was built:2024,2024-01or2024-01-15. A date with a time keeps only its date. A year needs four digits (write a year before 1000 as"0800"). Anything that is not clearly a date (01/02/2024,next spring,2024-02-30) is left out, never guessed.seriesandseries_index— the series the book belongs to and its position in it (a number of 0 or more, such as2or2.5). Written in the EPUB 3 form and in the older Calibre form, so more reader apps can group the volumes. Aseries_indexwithout aseriesis ignored.subjects— what the book is about (dc:subject), one per list item. Tags never become subjects: they organise your vault, and a book you share should not listtodoorwork/…, so subjects are only what you write here.
A field you leave out or leave empty is simply not in the book. A value that cannot be
used (a date that is not a date, a series_index that is not a number) is left out,
the export still completes, and the export report names the field, the value and the
note. The preview shows the same warning before you build. Invisible control
characters (such as a form feed in text pasted from a PDF) become spaces, because an
EPUB cannot hold them. If your notes already use date or description for something
else, for example a template's "created on" date, that value now appears in the book.
How a Boox library shows these fields has not been checked on a device yet.
Pushing to an Onyx Boox e-ink device is entirely optional. Turn on Push after export and set your device's Device URL (shown in the BooxDrop app on the device — both need to be on the same Wi-Fi network) and every export is uploaded straight to the device's library after it saves. The local file is always written first, so a failed push never loses your export — it just stays in your output folder.
Inkbound works on Obsidian mobile too, with the same three exports. The one
real difference is where the book goes. A phone has no folder-anywhere
filesystem the way a laptop does, so mobile saves books inside your vault,
in the folder set by Settings → Inkbound → Output folder (mobile)
(Exports by default). From there you can open the book in a reading app,
or reach it through your device's own file access.
That gives you two independent settings — one for desktop, one for mobile — and each device only ever reads and writes its own. If you sync your vault, changing the mobile folder on your phone will never move where your desktop saves books, and vice versa.
Because books are saved into the vault, they sync like any other vault file. If you would rather they didn't, point the mobile output folder at a folder your sync excludes.
The export report matters most here. Warnings used to go only to a developer console, which a phone does not have — so on mobile there was no way to learn that a book had come out incomplete. Tapping the completion notice now opens the same report you get on desktop, and Show last export report reopens it afterwards.
To send a finished book somewhere else, run Share last exported book from the command palette. It appears only on devices that support sharing — if you don't see it, the book is still saved exactly where the notice said it is.
Push to a Boox works from mobile too, over the same Wi-Fi, so you can go from note to e-reader without a computer anywhere in the loop.
The complete list. A build gate (npm run check-review-safe) scans the shipped
plugin against exactly this list, so it cannot drift from the code.
- Your vault. Notes and images are read through Obsidian's own API, and so are the links and headings the book's order and table of contents come from.
- One file, on desktop. On a computer the finished
.epubis written with Node's filesystem to the folder set in Output folder (default~/Downloads), which is normally outside the vault — Obsidian's vault API cannot address a path anywhere on disk. Inkbound creates that folder if it is missing and writes one file per export. It never reads, lists, deletes, renames or watches any other file. On a phone or tablet it cannot reach the filesystem at all: the import that would do it is desktop-gated and never loads, and the book is written through Obsidian's vault API into the Output folder (mobile). - The network, only when you ask for it. A cover whose
cover:/coverUrl:is anhttp(s)://address is downloaded when you export, and with Push after export on, the finished book is uploaded to the Device URL you set. Nothing else: no telemetry, no analytics, no account. - The clipboard, only when you press the button. Copy report copies the export report as plain text. Inkbound never reads the clipboard.
- Your settings, in the plugin's own
data.json— the settings table above, and nothing else. The one thing kept besides that is the last export's report, in memory, until Obsidian closes.
- Where mobile can save. On a phone or tablet, books are saved inside your vault rather than to a folder of your choosing anywhere on the device — that's a platform restriction, not a setting. See "On a phone or tablet".
- Bases: only table views come through. Embedding a Bases file whose view
is a table (
![[Tasks.base]], or![[Tasks.base#Open]]for a named view) puts a static snapshot of that table in the book: the rows Obsidian shows at the moment you export, as a plain table. Cells with several values are comma-separated, and a link to a note that is in the book works. Nothing else about a Base can be exported. A cards or list view, a grouped table, a Base that shows an error, and a```baseblock written directly in a note each become[Bases view omitted: …]; the export report says why, and the export itself succeeds. Obsidian only fills in a Base while the app is running, so this needs the Bases core plugin enabled. A Base too big to render in full is exported as far as it goes, and the report says how many rows are missing. - A link to a heading or block opens the chapter, not the spot. A link like
[[Note#Heading]]or[[Note#^block]]becomes a working link to that note's chapter, but it opens the chapter at its start: the book does not link to the heading itself. A link to a heading of the same note ([[#Heading]]) is shown as plain text. - A scoped embed does not bring its footnotes along.
![[Note#Heading]]and![[Note^block]]embed only that part of the note. If a paragraph you embed refers to a footnote whose text lives elsewhere in the note, Obsidian shows just the label and so does the book; the export report names the note and the footnote. Embed a slice that includes the footnote's text, or the whole note, to keep it. - Whether a footnote pops up is up to your reader. Inkbound writes the standard footnote markup and an ordinary link back, so it works everywhere; but whether a given e-reader shows the note as a pop-up or jumps to the end of the chapter is the reader's choice.
- Math typesets as images. Expressions are rendered at export time and
embedded as pictures (like Mermaid diagrams), which means they are no
longer selectable or searchable text inside the EPUB. Math containing
non-Latin text (e.g. Thai inside
$...$) cannot be rendered — it stays as readable source text with a warning. - Individual table rows cannot be embedded. Block-scoped embeds
(
![[Note^block]]) now work for every kind of block Obsidian lets you label — paragraphs, headings, tables, code blocks, callouts and blockquotes, whole lists, and single list items (which bring their sub-items with them). A table row, though, is not something Obsidian can address: a^idtyped inside a cell is just cell text, so an embed pointing at it degrades to a placeholder plus an export warning, same as any block ID that doesn't exist. - Image optimization only changes PNG and JPEG files from your vault. SVG, GIF, WebP, animated PNGs, the book cover, and the diagrams and math Inkbound draws itself are never touched. Grayscale applies only to images that are being shrunk, so a book can hold a few untouched color icons beside gray pictures. The smaller image is made by the app's own image encoder, so two exports on the same device give identical images, but the bytes can differ between devices. On a phone, an image over about 100 megapixels, or one that would still be over about 16 million pixels after shrinking, is kept as it is with a warning in the export report.
- The preview is read-only. It shows the plan and lets you export or cancel; it
cannot reorder chapters or leave one out from the window itself. To change the book,
change the vault — the index note's links, a note's name, a folder, or
export: falseon a note you want left out — and preview again. It does not estimate the book's size either, since nothing is rendered. - Mermaid diagrams export as images, not text. They are converted to pictures at export time so e-ink readers can display them, which means they are no longer selectable or searchable text inside the EPUB.
Building from source, running the test suite, and the architecture notes
live in docs/DEVELOPMENT.md.
Inkbound is free and MIT-licensed. If it saves you time, you can buy me a coffee — entirely optional, and it never affects the plugin's features.
MIT © 2026 kidpeterpan