Handwrite with any stylus in real, paginated notebooks: Apple Pencil, Android tablet pens, or a pen on Windows, macOS and Linux.

Handwriting notebooks for any stylus, inspired by Goodnotes: Apple Pencil, Android tablet pens, and pen tablets on Windows, macOS or Linux. Real pages, paper templates, snapping shapes, PDF annotation and pictures, kept as plain files in your vault.


Website: finenotes.vercel.app, with a demo you can try in your browser
Follow FineNotes: X · Instagram · TikTok · YouTube
Ideas and questions: Discussions
Support FineNotes: GitHub Sponsors
Handwriting recognition on your device: Grape (handwriting recognizer model)
[[Note]]
becomes a link with a tap.Notebooks and pages
[[Biology.notebook#Page 3]].Paper
Writing
Shapes

Selecting and arranging
Text, pictures and PDFs
Audio
Sharing
AI, optional and with your own key
FineNotes started as a personal project because I was tired of all the paid note-taking apps on the App Store, such as Goodnotes and Notability, combined with the bad performance of Apple Notes as an alternative. I was also tired of companies being the ones responsible for keeping your notes in their cloud, something that Obsidian fixes. Furthermore, I was struggling with compatibility issues between my PC, which runs Windows, and my Apple devices, which made synchronization a very arduous task, to say the least.
The purpose of this plugin is to be a complete alternative to those note-taking apps. It can't have every feature a native App Store app has, because it runs as TypeScript inside Obsidian, with the memory limits that come with that. But I think that with future releases and your feedback it can get very close. For now it has all the essential features; only some extra, handy ones from those apps are still missing.
Hope you guys enjoy this and give me some feedback!
— Joost
Joost-8/FineNotes.main.js, manifest.json and styles.css from the
latest release into
<your vault>/.obsidian/plugins/finenotes/. Then enable the plugin under
Community plugins.obsidian://show-plugin?id=finenotes (paste it in the browser's address
bar), or tap Add to Obsidian on the
FineNotes page, which is
the same link. It opens FineNotes in Obsidian, ready to install. If community
plugins are still off, it opens the page to turn them on first; open the
link again after that.Obsidian is a free notes app that keeps everything as plain files in a folder on your device, called a vault. FineNotes runs inside it. On an iPad:
To have your notebooks on several devices, sync the vault: with Obsidian Sync, iCloud, or any app that syncs a folder.
In a notebook, open More (⋯) and choose Copy home screen link. On an iPad or iPhone, open the Shortcuts app, make a new shortcut with the action Open URLs, paste the link into it, and choose Add to Home Screen from the shortcut's menu. Tapping the icon opens Obsidian straight at that notebook. On a computer, the same link works as a desktop shortcut or a bookmark.
Open a new notebook, with the notebook button in the left ribbon or the command New notebook or page…. You can also right-click a folder in the file explorer and choose New notebook. Turn this entry off with Show New notebook in right-click menu in FineNotes settings. The file explorer’s top bar also has a New notebook button, controlled by Show New notebook in file explorer bar. The right-click entry starts enabled; the top-bar button starts disabled. Choose a cover, a paper and a size.
Write. The toolbar at the top has:
A tool's options show in a bar under the toolbar; tap the tool again to hide them.
Add a page with +, or by pulling past the last page.
There is no save button: every change is written to the note as you go.
A tool's options appear in a bar under the toolbar. Tap the tool again to slide them away, and once more to bring them back. The lasso has no options bar: tap it again to open its menu.
To put the toolbar along the bottom, or upright at the left or right, choose its place in More (⋯) › Toolbar. Each device keeps its own. A tool's bar moves by holding it and dragging it to an edge.
Draw round what you want, or tap one thing. Tap the lasso again to choose Freehand or Rectangular, and what it picks up: Handwriting, Images, Shapes, Arrows and Text boxes.
Drag inside the frame to move the selection. Its bar has Cut, Duplicate and Delete; … adds Copy, Paste and a colour row to recolour ink. Paste works across pages and notebooks; hold the lasso on empty paper for a Paste button right there.
With Text box, tap the page and type; the box grows as you type. Tap a box to edit it, and drag its handles to move or resize it. The options hold colour, size, font, B I (bold, italic, underline, strikethrough), alignment, line spacing, bullets and numbering, and box fill. Drag to size text boxes lets a drag set a new box's size. Pin Text tool keeps Text chosen after a box is done. While you type, the red bin deletes the box.
Insert image offers Photos, Take photo, From vault, and:
1-3, 5 (or 5, 3-1 to change the order).A new picture is selected: drag its corners to resize it and the knob below to rotate it. To select it later, tap it with the lasso, or with a finger whatever tool is in hand. Its bar has Crop, Cut, Duplicate and Delete; … adds Front, Back, Copy, Paste, Lock image, Flip horizontal and Flip vertical. The lasso ignores a locked picture, such as a worksheet you write on; hold the lasso on it and tap Unlock to free it.
PDF display uses one cached image per page, drawn at the exact resolution of the screen. Zoomed in further than that image can go (about 1.4× for an A4 page on an iPad), it sharpens only the visible portion, with at most two PDF renders in flight. On a device short of memory it keeps fewer pages around. Old visible-area renders are cancelled and their canvases released when you scroll away; ink and the sidebar keep their existing rendering paths.
[[Biology.notebook#Page 3]] (or #page=3) opens a notebook at
page 3. Copy link to page makes one for you.1-3, 5), then Export. The PDF goes into
the PDF exports folder, or else next to the notebook. Then Open or
Share… it. PDF-backed pages retain their original PDF text and vector
detail, with notebook handwriting, pictures and text boxes as a transparent
overlay. Ordinary notebook pages use the existing image-based export.
A missing, corrupt or password-protected PDF source stops the export with
an error instead of silently replacing its content.Tap the microphone to record. A red pill shows the time: tap Stop to end, or the bin to throw the recording away. Recording stops if the iPad locks or you leave Obsidian.
Recordings are in the sidebar's Audio tab, with Play and Transcribe. While the player is open, tap your writing to hear it from five seconds before you wrote it. Transcribe needs an OpenAI or Google key, or your own server; the transcript is a note of its own next to the audio.
Grape (handwriting recognizer model) reads your ink on the device a few seconds after you stop writing: notebook search and Obsidian's search then find it. Nothing leaves the device. Switch it off under Settings → FineNotes → Models on this device → Read handwriting on this device.
Grape is kept in the plugin's handwriting folder, so vault sync brings it
to your other devices. If you already used FineNotes, it puts its built-in
copy there by itself. On a new install, the first time a handwriting
feature needs it, FineNotes offers a one-time 3.5 MB download (with Not
now). Settings → Models on this device shows it, with Re-download
and Remove.
To make it read your own handwriting much better:
Each of the three practice sets has different lines, and every set you write helps. Settings → Models on this device lists your practice sheets, how many lines each has, and which ones your learned model was built from. Read with my learned model switches between it and Grape alone without deleting anything; the model before your last learning is kept, to go back to; and deleting your learned model is its own button, which asks first. AI → Read this page shows how Grape reads a page.
Grape is a work in progress that still needs more training on real handwriting. It is open source (Apache 2.0) at Joost-8/Grape.
The AI button then offers Ask…, Generate image… and Transcribe recording…. A greyed-out entry says what it needs. The first request asks once whether to send; tap Send.
Ask is a chat about your notes, in a window or a sidebar beside the page. Pick up to 10 pages to send (the page you are on is picked), attach PDFs, pictures or text files, and keep a chat in the notebook's AI chats folder with Save chat. While it answers, the AI can use the notebook: read other pages, search its text, add a text box or a page, go to a page, and put a drawing on a page; each change can be undone. An answer can be put on the page with Insert as text box, and a drawing in it with Insert on page. With a custom endpoint, the tools depend on your server and model: see SELF_HOSTING.md.
Transcriptions go into the note's text layer, one heading per page, which opens under the pages so you can correct it.
To transcribe as you go, set Handwriting recognition to Cloud AI and switch on Recognize automatically: the page you are on is transcribed about 30 seconds after you stop writing.
Two optional settings return secondary tools to your previous pen or highlighter: Select active tool again to return to pen and Return to pen after one use. Both are off by default and apply to eraser, lasso, text and shapes. A single use finishes an eraser stroke or shape, finishes text editing (overriding Pin Text tool), or ends a lasso session when you click outside the selection or delete or cut it. Moving, scaling or other selection actions keep the lasso active.
| Keys | What they do |
|---|---|
| Cmd/Ctrl+Z, Cmd/Ctrl+Shift+Z | Undo, redo |
| P, H, E, V, S, T | Pen, highlighter, eraser, lasso, shapes, text |
| Cmd/Ctrl+C, X, V | Copy, cut, paste |
| Delete or Backspace | Delete the selection |
| Escape | Close a menu, deselect, cancel a crop |
| Return | Finish a crop |
| Page Up, Page Down | Previous or next page |
| ↑, ↓ | Scroll |
Ctrl+Y also redoes. Shortcuts act on the active notebook; text fields keep their normal editing shortcuts. On a computer, drag the right or bottom scroll indicator to scroll directly.
On a computer, Ctrl/Cmd with the scroll wheel (or a trackpad pinch) zooms.
Besides the toolbar's own actions, the command palette has New notebook or page…, Create notebook with last settings, Convert single page to notebook, Scan document into this notebook, Show or hide the text layer, Transcribe this notebook's handwriting, Switch between notebook and Markdown view, Fit the page and go to the top, Zoom in, Zoom out and Show the changelog.
Transcribe this notebook's handwriting follows the Handwriting recognition setting. On Manual, as it starts, it opens the text layer for you to type in.
Title.notebook.md. A
single page is called Title.page.md.%% comment, which Obsidian
hides when reading.Title.ink.md
included), open as they are.FineNotes works fully offline. It sends nothing anywhere, and it has no telemetry, no ads and no account. Your handwriting is read by Grape (handwriting recognizer model) on the device; practice files and what Grape learns from them stay in your vault.
The network is used in five cases, all optional.
Grape (handwriting recognizer model). It is downloaded rather than built into the plugin, to keep the plugin small:
grape-2.0.bin, 5.7 MB).
Nothing is uploaded.github.com, which redirects to GitHub's file host).The template gallery. It downloads only when you open it (Browse template gallery), from FineNotes' own gallery on GitHub (Joost-8/FineNotes-templates), or from another address set in Settings → Pages and notebooks: its list of templates, their preview pictures, and the one template you choose to add. Nothing about you or your vault is sent. A template is only accepted if it is a PDF, PNG, JPEG or WebP file of at most 40 MB, or a FineNotes template file, so nothing in it can run.
The interface language. English is built in. When FineNotes is shown in
another language (Settings → Language, or Obsidian itself in that language),
the words for it are downloaded once from FineNotes' own repository on GitHub
(raw.githubusercontent.com/Joost-8/FineNotes/<version>/src/i18n/locales/<language>.json,
about 200 KB; for a build made between releases, whose version has no such
file yet, the same path under main) and kept in the plugin's folder, so the language opens offline
from then on; a plugin update fetches the new version's words once.
Nothing about you or your vault is sent; GitHub sees your IP address, as with
any download. Without the download FineNotes stays in English.
Checking for updates. Once a day at most, FineNotes reads the version
number in its own manifest.json on GitHub
(raw.githubusercontent.com/Joost-8/FineNotes/main/manifest.json, the file
Obsidian's own updater reads), and puts a dot on the toolbar's gear when a
newer FineNotes is out. Nothing about you or your vault is sent; GitHub sees
your IP address, as with any download. It only tells you: updating is still
done by Obsidian, under Settings → Community plugins. Switch it off in
Settings → Advanced → Check for updates.
The AI features, only after you:
Then:
api.anthropic.com);api.openai.com);generativelanguage.googleapis.com);openrouter.ai);openrouter.ai.A short tour, for the curious and for anyone who wants to contribute.
Pages have their own coordinates. Every page has a fixed size in its own units: an A4 page is 1024 units wide, standing for 210 mm. Strokes are stored in the coordinates of the page they were written on, and the screen only decides how large that page is drawn.
That is why a note looks the same on every device, and why ink never drifts when the window changes width. An infinite canvas has no such anchor.
Input. Pointer events tell the Pencil and fingers apart:
Ink. Handwriting is smoothed by a curve through the midpoints between the pen's samples and drawn as a line with round ends, by the canvas itself. It only ever grows: what is on the page never changes shape while the pen goes on. With pressure on, a line is drawn in short runs of one width each. Shapes are drawn as exact lines, so their corners stay sharp.
Shape recognition is geometry, not machine learning: it fits lines, polygons, circles, ellipses, stars and clouds. It was tuned on real Apple Pencil strokes traced from screen recordings, so it accepts the hooks and overshoots a real hand makes.
Drawing. There are three stacked canvases:
The page is never scrolled as a web page. It is moved by a transform, with iOS-style momentum and a rubber band at the edges.
Every edit is undoable. Each change is a command that knows its own inverse, so undo and redo are exact, and a moved selection is one step.
The file. The note's frontmatter and text are ordinary Markdown. The ink is
one %% block: the notebook as JSON, compressed with DEFLATE and stored as
base64. Points are rounded to 1/100 of a unit and pressure to 1/255, which keeps
files small without visible loss.
The format is written down in contracts/api.md, and 559
golden files pin its exact bytes. FineNotes writes only its own frontmatter keys,
its ink block and its text section; the rest of your note is never touched.
AI. Requests go through Obsidian's own network API, because a web view's
fetch to these services is blocked on the iPad. Each key is only used for its
own service, and the key for your own server never goes anywhere else.
Code layout.
| Folder | What it holds |
|---|---|
src/model/ |
The notebook, its commands and the file format. Pure TypeScript: no DOM, no Obsidian. |
src/ink/ |
Stroke building, the ink tracer, shape recognition and pen gestures. Pure. |
src/input/ |
Pointer handling, palm rejection, pinch and pan. |
src/canvas/ |
Rendering, tiles, page layout, scroll physics, paper rulings and scanning geometry. |
src/view/ |
Everything Obsidian-facing: the notebook view, toolbar, sidebar and dialogs. |
src/recognition/ |
The AI services: requests, keys and transcription. |
tests/ |
About 2,450 unit tests, including real Pencil ink traced from screen recordings, and the format goldens. |
The pure modules have enforced test coverage. CI runs Obsidian's own plugin-review lint rules as well as lint, the type check, the tests and the build.
.ink.md files.THIRD_PARTY_NOTICES.txt.npm install
npm run dev # watch-mode build
npm test # unit tests
npm run lint # eslint, no warnings allowed
npm run lint:review # Obsidian's plugin-review rules, as CI runs them
npm run build
To try a build in a vault, put the plugin folder's path
(<vault>/.obsidian/plugins/finenotes) in a .deploy-target file. Every build
is then copied there.
Bug reports and ideas are welcome: see CONTRIBUTING.md, or go straight to the issues. For an iPad problem, a screen recording with Show or hide the input debug overlay switched on helps more than anything else.
FineNotes is licensed under the GNU General Public License v3.0 or later.
Versions before 2.0.0 were released under the MIT licence, and code contributed before 2.0.0 was contributed under it; its notice is kept in LICENSE-MIT. The handwriting model, Grape, which FineNotes downloads on first use, is licensed separately under the Apache License 2.0 (models/LICENSE).