Stefan Mayer90 downloadsWrite by hand on paper-like pages, made for e-ink tablets. Turn your handwriting into Markdown with Azure OCR, keep drawings live on the text page, annotate PDFs and import arXiv papers.
Handwritten notebooks in Obsidian that feel like the Boox Notes app – made for e‑ink tablets such as the Onyx Boox Note Air. Write with the pen on paper pages, flip to the Text page and read the same notes as Markdown: handwriting transcribed, drawings shown live, links working like everywhere else in Obsidian.
Ink Notebook has its own pen engine. It draws every stroke the moment the pen moves – nothing is redrawn while you write – so it stays fast on e‑ink screens and on pages full of writing. There is nothing else to install.
┌───────────────────────────────────────────┐ ┌──────────────────────────────┐
│ ✒ ▁ ⌫ ◌ □ ◍ T ▥ ⊕ │ ↶ ↷ │ ‹ 3/12 › + │ Text ⋮│ │ Text page (Markdown) Ink │
├───────────────────────────────────────────┤ │ Text │
│ Meeting with [[Anna]] ↗ │ ⇄ │ Meeting with [[Anna]] │
│ – budget │ │ - budget │
│ ┌─────┐ │ │ [live drawing of the box] │
│ │Start│──▶ … │ │ │
└───────────────────────────────────────────┘ └──────────────────────────────┘
Taken in real Obsidian with this plugin (e2e/scripts/screenshots.mjs). The handwriting is generated from a single-stroke script font, and a local stand-in for Azure supplies the recognised words; everything else – the text page's headings, lists, tasks and links, the live figure, the pages, the PDF, the shapes – is the plugin at work. The arXiv list shows real results.
| Ink page | Text page |
|---|---|
![]() |
![]() |
| Pen options (e-ink mode) | All pages |
![]() |
![]() |
| Paper templates | Annotating a PDF |
![]() |
![]() |
| Papers from arXiv | Flowcharts, fills, object libraries |
![]() |
![]() |
| Adding a Mermaid diagram | A Mermaid diagram on the page |
![]() |
![]() |
The toolbar sits at the top (or bottom, left, right – see More → View). Tap a tool to use it; tap it again for its options. The cards are large and flat, made for a pen and for e‑ink.
| Tool | What it does |
|---|---|
| Pen | Fountain pen, ballpoint, pencil, brush and calligraphy pen. Five thicknesses (plus fine steps), ten colours (they show as greys on black-and-white screens), pressure sensitivity on/off. Two favourite pens sit next to the tools for quick switching |
| Highlighter | Transparent, stays underneath your writing, six colours |
| Eraser | Partial (erases only where you rub), whole stroke, or lasso (erases everything inside a loop); four sizes; Clear this page. The eraser end of the pen always erases, and holding the side button erases too (configurable) |
| Lasso | Draw a loop around writing (or tap one item) to select it. Drag to move, the corner to resize, the top handle to rotate. The bar above the selection: delete, cut, copy, duplicate, colour, Fill, Figure (always show it as a picture on the text page), To text (turns the handwriting into a typed text box) and To library (keeps it in your object library) |
| Shapes | Line, arrow, elbow arrow, dashed line, rectangle, ellipse, circle, triangle, diamond – drag to draw. New shapes can be filled. An arrow drawn from one shape to another stays attached to both |
| Fill | Tap inside a shape – or inside any area closed by lines, like a box drawn with four strokes or a circle drawn with the pen – to fill it. Twelve colours, solid, hatched or cross-hatched; Remove fills takes a fill away. Fills stay underneath your writing |
| Text | Tap the page and type; tap a text to change it. Tap inside a shape to give it a label, centred in the shape, that moves with it. Four sizes |
| Object library | Flowchart shapes, Mermaid diagrams and the objects of Excalidraw libraries: tap one, then tap the page to put it there (see Flowcharts and object libraries) |
| Insert | Images (from the vault or the device), a link to a note (a tappable chip on the page), a text box, objects from the library, a Mermaid diagram, pages from a PDF, the pages of a paper from arXiv |
| Undo / Redo | Unlimited while the page is open |
Smart pen features (each can be turned off):
Fingers never draw (unless you turn on Draw with a finger), so your palm can rest on the screen:
With a keyboard: Ctrl/Cmd+Z / Ctrl/Cmd+Shift+Z (or Ctrl/Cmd+Y), Delete or Backspace, Ctrl/Cmd+C/X/V/D/A, PageUp/PageDown or arrow keys to turn pages, P pen, H highlighter, E eraser, L lasso, S shapes, F fill, T text, Ctrl/Cmd + = / - / 0 to zoom. All tools and page actions are also commands, so you can give them hotkeys.
A notebook has pages, like in Boox Notes. ‹ 3 / 12 › in the toolbar turns pages; tap the number for all pages (move, duplicate, delete, add). + adds a page after the current one; More → Add a page… lets you choose the paper and put it before, after or at the end.
Paper templates like in GoodNotes and Boox Notes: blank, ruled, dotted, squared, graph paper, isometric, Cornell notes, checklist and music staff, each with narrow/normal/wide spacing, white/ivory/yellow/blue paper and portrait or landscape (A4). Change the paper of a page any time – your writing stays.
The library button in the toolbar (or Insert → From the object library…, or the command Open the object library) opens the object library next to the page:
.excalidrawlib file in your vault, and the library of the Excalidraw plugin if you use it. Get more at libraries.excalidraw.com: Import from a link… takes the link of a library's Download button (or its Add to Excalidraw link), Import a library file… a file you downloaded. Rectangles, ellipses, diamonds, lines, curves, arrows, pen drawings and text come over with their colours, fills, hatching, rounded corners and rotation; labels stay in their shapes and arrows stay attached. (Pictures in libraries are left out.)Tap an object, then tap the page where it should go – as often as you like; choosing a tool stops. On a narrow screen the library folds away to its title while you place objects (tap it to open it again).
To draw a flowchart: place the shapes, then connect them with Arrow or Elbow arrow (in the library, or in the shape tool) – draw from one shape to the next. The arrow starts and ends at the shapes' outlines and stays attached: move a shape with the lasso and its arrows follow (an elbow arrow keeps its right angles). Tap inside a shape with the Text tool to type its label, or write into it by hand. Fill colours the shapes.
Flowcharts written in Mermaid – the ```mermaid blocks of your notes, or code from mermaid.live, GitHub or an AI chat – go into the library as real ink:
.mmd, .mermaid, a Markdown note, a text file) or pick a note From the vault… – a note with several diagrams lets you choose one. You see the diagram as ink while you type, and what is wrong (with the line) when it cannot be read. Add to library, and on an ink page it is ready to be placed: tap the page.```mermaid block → *Add this Mermaid diagram to the ink library* (or run the command with the cursor in it). It is named after the note. A .mmd or .mermaid file: right-click it → Add to the ink object library.flowchart/graph with TD/TB/BT/LR/RL (and direction in subgraphs); the shapes [rect], (rounded), ([stadium]), [[subroutine]], [(database)], ((circle)), (((double circle))), >flag], {decision}, {{hexagon}}, [/lean/], [\lean\], [/trapezoid\], [\trapezoid/] and A@{ shape: … }; links -->, ---, -.->, ==>, <-->, --o, --x, ~~~, longer links (--->), labels (-- yes -->, -->|yes|), chains and &; labels with "quotes", <br/>, Markdown strings and entities; classDef, class, :::, style and linkStyle colours (fill, stroke, text colour, line width, dashes); comments and frontmatter (title:). Other kinds of Mermaid diagrams (sequence, class, state, …) are not turned into ink yet.```mermaid block in the *Mermaid* folder of the library folder (Ink libraries/Mermaid/). Obsidian shows it as a Mermaid diagram too; change the note and the library item changes. The trash button on an item moves its note to the trash.-/• lines become lists, a box drawn in front of a line (or a written [ ]) becomes a task – - [x] if you ticked or crossed it –, bigger writing becomes a heading, handwritten [[links]] become real Obsidian links on the text page and a tappable link button on the ink page.ink-figure block that draws that part of the ink page – change the drawing and the text page follows. Tap the figure to jump to the ink page. To force a picture, select it with the lasso and tap Figure.Find a paper and write on it, without leaving Obsidian:
"a phrase", au:name for an author, ti: for the title, cat:cs.LG for a category – or paste an arXiv link or id (2405.03150).The PDF is downloaded and becomes the pages of a new ink page – write, highlight and erase on it like on any page, and More → Export → Annotated PDF gives you the paper with your notes. Its text page (in the Papers folder, see Settings) has the title, authors, arXiv id and link as properties, and the abstract above the transcript of your handwritten notes. A paper you imported before shows Open instead.
From an ink page, Insert → Pages of a paper from arXiv… adds a paper's pages to that ink page instead.
Each ink page is two normal files:
003 - University/
└── Computer Architecture/
├── Attachments/
│ └── Week 1.ink.md ← the ink page (pages and strokes)
├── Computer Architecture.md
└── Week 1.md ← the text page
Week 1.ink.md is a Markdown file, so it syncs with Obsidian Sync and every other sync, has properties, and its links (notes linked on the pages, pictures, PDFs) show up as backlinks. Ink Notebook opens it in the ink view; More → Open as Markdown shows the file itself. Embedding it in a note (![[Week 1.ink]]) shows its pages.ink-drawing) and back (ink-text). Renaming or moving one renames/moves the other.Week 1.md and Week 1.ink.md. A note that is an ink page itself (Week 1.md with the ink-notebook property) moves into the ink subfolder as Week 1.ink.md when its text page is made, so the text page gets its name; Match up the names of ink and text pages does the same for pages made before.Attachments by default), so your folders only show your notes.Note.md stays as it is, Attachments/Note.ink.md is added.Ink libraries/ (see Settings): imported Excalidraw libraries, My library.excalidrawlib, and Mermaid/ with one note per Mermaid diagram.You need Obsidian 1.8.7+ – nothing else.
stefanmayer06/Obsidian-writing-for-eink.main.js, manifest.json and styles.css from the latest release.<your vault>/.obsidian/plugins/ink-notebook/.When Ink Notebook starts the first time, a setup assistant opens (reopen it from the settings or the command Open setup assistant): e‑ink optimisations, pen behaviour, handwriting recognition and your first page.
Earlier versions of Ink Notebook (up to 1.4) were built on Excalidraw. Run the command Convert ink pages made with Excalidraw (earlier versions): every old ink page gets an ink notebook (Name.ink.md) next to it with the same pages, writing, shapes, text and pictures, and its text page is pointed at it (the next transcription updates the pictures on the text page). The old .excalidraw.md files are left as they are – delete them when you're happy.
Handwriting recognition is optional. Without it, the text page shows your handwriting as a picture (still with typed notes, links and drawings). It uses Azure AI Vision with your own key – the free tier is enough:
How many requests are used? One per writing area that changed since the last time (a page is split into areas so that writing in one corner does not re-send the whole page). Results are cached, so flipping back and forth costs nothing.
Privacy: only your handwriting strokes are rendered and sent (black on white – never the PDF or paper background, never your typed text) to the Azure region you picked; Azure deletes them within 24 hours. The Azure key is stored in .obsidian/plugins/ink-notebook/data.json inside your vault – keep that in mind if you share your vault.
| What | How |
|---|---|
| New page | Ribbon pencil icon, command New ink page, or right-click a folder → New ink page. Type its name (the date and time is filled in – keep it or type over it) and choose the paper; the dialog shows the folder – Change… puts the page elsewhere (or type the name of a new folder) |
| Draw on a note you already have | Command Add an ink page to this note, or right-click the note (in the file list or the editor) → Add an ink page. The note keeps its text and becomes the text page; the transcript goes below its text |
| Daily notes | Settings → Pages → Daily notes: new daily notes come with an ink page (optionally opened to write on). Command Open today's daily note on the ink page works with any setting |
| Names that don't match | Command Match up the names of ink and text pages (e.g. 2026-10-27 (text).md → 2026-10-27.md with Attachments/2026-10-27.ink.md); it lists the renames first |
| Flip ink ⇄ text | Text in the toolbar, the Ink bookmark on the text page, or command Flip between ink and text page |
| Transcribe again | More → Transcribe handwriting now (normally this happens when you open the text page or leave the ink page) |
| Start over | More → Re-transcribe from scratch discards edits made inside the transcript |
| Side by side | More → Open the text page side by side |
| Link pages | Write [[Page name]] by hand (it gets a link button after the next transcription), or Insert → Link to a note |
| Tasks | Draw a small box in front of the line (- [ ]); tick or cross it when done (- [x]) |
| Tables | Draw a line under the headings and lines between the columns, write in the cells |
| Drawings | Draw anything – it is detected. To force: lasso → Figure |
| Flowcharts | Library button → Flowchart → tap a shape, tap the page; draw arrows from shape to shape; text tool → tap a shape for its label |
| Fill | Fill tool → tap inside a shape or an area enclosed by lines; or lasso → Fill |
| Excalidraw libraries | Library button → Import from a link… / Import a library file…; lasso → To library keeps your own |
| Pages | + adds a page after this one, ‹ › or a swipe turns pages, the page number opens all pages, More → Add a page… chooses paper and position, More → Paper of this page… changes the paper |
| Handwriting → typed text | Lasso the handwriting → To text |
| Annotate a PDF | Right-click a PDF → Annotate with Ink Notebook; More → Export for the annotated PDF |
| Read a paper | Ribbon graduation cap → search arXiv or pick a popular paper → Import |
| Offline | Just keep working. Pages waiting for recognition show a small ◦ on Text; command Transcribe pages waiting for a connection retries immediately |
---
ink-drawing: "[[Notes/Attachments/My page.ink]]"
---
%% ink-notebook:start %%
…your transcribed handwriting, lists, figures…
%% ink-notebook:end … %%
Anything you type below (or above) the transcript is a typed note.
The two %% … %% lines mark the transcript; in Live Preview they are shown as a small "✍ From your handwriting" label and they are invisible in Reading view. Please don't delete them – if you do, Ink Notebook rebuilds the transcript and keeps your text.
Attachments by default; empty = next to the text page), paper for new pages and whether to choose it every time, ask for a name (on by default; off names pages with the date and time), open the text page in reading or editing view (or Obsidian's default), daily notes with an ink page (off / with an ink page / with an ink page opened to write on), match up the names of ink and text pages, keep names in sync on rename/move.Papers by default).Ink libraries by default).From Obsidian 1.13 on, Obsidian's settings search finds Ink Notebook's settings too.
ink-notebook property (which makes a note open as an ink page) but text instead of handwriting. Nothing is changed until you choose: Keep the text and add an ink page removes the property and gives the note its own ink page.app.plugins.plugins["ink-notebook"].internals exposes the recognition pipeline and the file reader for debugging.src/ink) draws on one opaque canvas that always shows the page as it looks now. Each pen movement adds one curve piece, drawn straight onto it (with every coalesced/raw pointer event, and the low-latency desynchronized canvas except on e-ink screens, where Boox shows that canvas with the dither pattern of its fast refresh), so the cost per movement does not grow with the page. Erasing and moving redraw only the area that changed; neighbouring pages are rendered in the background so that turning pages is instant. A second canvas shows previews (highlighter, lasso, shapes, moved selections). Strokes keep their pressure and are drawn with the same code live, on redraw, in figures and in exports (as SVG paths – the PDF export uses them too), so they look the same everywhere.core/ink/codec.ts): a Markdown file whose ink data sits in a hidden %% ```ink-data … ``` %% block, one line per page and per stroke; points are delta-encoded integers (0.1 units, pressure in 1/255) in base64. Fills, connectors and the like follow a stroke's points as key:value words, which earlier versions skip (they show the stroke without its fill). Edits are immutable updates (undo keeps old versions; they share everything that did not change).core/ink/fill.ts) are drawn in a pass of their own underneath the highlighter and the ink. The fill tool fills the smallest shape around the tap; when other lines divide it, or several strokes enclose the spot, the strokes are drawn into a grid, flood-filled from the tap and the outline is traced – that becomes an area, a stroke that is only a fill. Hatching is cut to the shape as plain lines, so it looks the same on the page, in figures and in the PDF.core/ink/connectors.ts): an arrow remembers the shapes it was drawn between and is routed again, outline to outline, when they move. Object libraries (core/ink/excalidrawLib.ts) are read and written in Excalidraw's .excalidrawlib format.ink-figure block.npm install
npm test # unit tests (vitest)
npm run build # type-check + bundle main.js
npm run harness # the pen engine in a plain browser page, driven with real pen input (Playwright)
The pure logic (the ink model, file format, pens, erasers, shapes, OCR parsing, classification, layout, transcript merging, PDF maths) lives in src/core and is covered by unit tests; the pen engine and its toolbar (DOM only) are in src/ink; the Obsidian integration is in src/obsidian.
Releasing: run npm run set-version -- 2.4.0 (it updates manifest.json, package.json, package-lock.json and versions.json) and merge it into main, then on GitHub create a release with the tag 2.4.0 – just the version, without a "v" – on main, or open Actions → Build & release → Run workflow on main. Releases are made from main only: the release job stops if the tagged commit (or the branch it was run on) is not on main. The workflow runs the tests, builds and publishes the release with main.js, manifest.json and styles.css – which is what BRAT and manual installs download – each with a build provenance attestation (check one with gh attestation verify main.js --repo stefanmayer06/Obsidian-writing-for-eink). It publishes the manifest.json of the repository and stops if the tag is not its version, so a release always matches both its tag and the repository.
e2e/ contains end-to-end tests that run the plugin inside the real Obsidian desktop app, write on ink pages with real pen events and use a fake Azure server (see e2e/README.md).
.excalidrawlib libraries and the notes in the Mermaid folder of the object library; and to know which arXiv papers you imported before. Nothing of this leaves your device.Copyright (C) 2026 Stefan Mayer
Ink Notebook is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version (AGPL-3.0-or-later, see LICENSE). It is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the license for details.
Releases up to and including 1.1.0 were published under the MIT license and remain available under it. The license texts of Ink Notebook and of all third-party code in the released main.js (pdf-lib and the libraries it uses, lz-string) are appended to the end of that file.