Otho133 downloadsCreate handwrited notes in a notebook styled format with unlimited pages. You can also import and export PDF files.

Write by hand on real pages in Obsidian - pressure ink, shapes, PDFs and a calculator,
in notes that stay readable even without Obsidian.
Try the live demo · Website · Install · User guide · View in Obsidian Community
Made with AI. This project is entirely vibe-coded using Claude Code.
This plugin started with frustraion with the current tools. I wanted handwritten notes along side regular ones hence the obsidian extension (I love markdown <3). I have been vibecoding it bc of lack of time, studies and stuff but after thinking about it for a long while I decided to plublish it for others to use. Bc of its vibecoded nature there are gonna be bugs and rough edges so any and all feedback is deeply appreciated.
| Feature | |
|---|---|
| Pen, highlighter, eraser | Pressure ink with opacity, a flat highlighter, an eraser that cuts strokes |
| Shapes | Lines, arrows, rectangles, ellipses - dashes, fills, separate outline and fill colours |
| Lasso selection | Move, scale, rotate, recolour, group, lock - even onto another page |
| Pages panel | Thumbnails grouped into sections; jump to, reorder, duplicate and restyle pages |
| Page styles | Portrait, landscape or one endless page; dots, lines, grid, Cornell, music staff and more |
| Images and PDFs | Paste and crop images, import a PDF and write on it |
| Calculator and plots | Scientific calculator with units and matrices, editable function plots |
| Export and history | PDF export with bookmarks, printing, automatic version history |
| Tablets and OLED | Palm rejection, pinch zoom, pen side button, dark paper, burn-in protection |
otho-dll/Obsidian-Handwriting.main.js, manifest.json and styles.css from the latest release
into <vault>/.obsidian/plugins/handwritten-notebook/ and enable the plugin.Quick start: right-click a folder → New handwritten note (or the command Create new handwritten note). The pen draws, fingers scroll and zoom, and everything saves automatically.
Click a section to expand it.
| Tool | |
|---|---|
| Pen | Pressure-sensitive ink, three thicknesses, colour palette, opacity 100 / 75 / 50 / 25 %. Jitter is smoothed, sharp corners stay sharp. |
| Highlighter | Transparent marker with flat ends. Overlapping strokes don't get darker. |
| Eraser | Cuts strokes where you rub. Same size on screen at every zoom; rub quickly and it grows up to 4×. The pen's eraser end and side button work too. |
| Shapes | Line (optionally an arrow), rectangle, ellipse. |
| Selection | Freehand lasso or rectangle. |
Tap the active tool again for its options - thickness, opacity (pen), what the eraser erases, the shape options or the selection mode. Colours sit on the toolbar; in a narrow window they move into a panel under the colour button.
For shapes and for the highlighter separately: Off (left alone), Whole (touching removes all of it) or Part (cuts out only what you rub over). Filled shapes and arrows are always removed whole.
| Keys | |
|---|---|
| Ctrl/Cmd + Z, Ctrl/Cmd + Y | undo, redo |
| Ctrl/Cmd + C / X / V | copy / cut / paste the selection or an image |
| Delete / Backspace | delete the selection |
| Escape | clear the selection; close the page style / pages panel |
| Ctrl/Cmd + mouse wheel | zoom |
| Shift while drawing a shape / rotating | straight angles, squares, circles / 15° steps |
Open it with the Pages button, ⋯ → Pages panel, or right-click / long-press a page.
⋯ → Page style…, right-click a page, or the pages panel. Apply it to this page, all pages (also used for new pages), another page or the selected pages.
Right-click a page → Page title… (also in the pages panel and as a command). Titled pages start sections in the pages panel, appear in the Contents tab, are found by Go to page… and become bookmarks in exported PDFs.
Each PDF page becomes a page of the note with the PDF as its background - write on lecture slides, worksheets or papers. Landscape PDF pages become landscape pages. Uses the PDF engine built into Obsidian (offline).
Toolbar button or command. A compact Basic tab and a Scientific tab with complex numbers, matrices, integrals, derivatives, equation solving and a unit converter. Click a result to copy it.
⋯ menu or command. Functions, parametric and polar curves, or data points with a fitted curve. Options include One period, π-based ticks, a clean style without a grid and size presets. Plots are inserted as images and stay editable (right-click → Edit plot).
⋯ → Export to PDF (or the command). Choose where to save it each time, or set a default: next to the note, a vault folder, or - on desktop - a folder on your computer. Page sizes, patterns, images and PDF backgrounds are kept; page titles become bookmarks. Resolution: Settings → Files and export.
⋯ → Print… On desktop the system print dialog opens with one sheet per page (endless pages are cut into A4 sheets). On phones and tablets plugins can't open a print dialog, so the note is exported to PDF - print it from your PDF viewer.
Versions are saved automatically: while you work (at most every N minutes), when you close the note, before pages are deleted and before an older version is restored. Identical and empty versions are never stored.
⋯ → Version history… lists versions by day with a preview: restore (can be undone), open as a copy, save a version now or delete. The last 24 hours keep every version, older days keep one per day. Retention and a size limit per note: Settings → Version history.
hnote2pdf.py)A small Python script (3.8+, no extra packages; Pillow optional) turns .hnote notes into vector PDFs on any computer.
python3 hnote2pdf.py "Lectures/Physics/Lecture 1.hnote" # → Lecture 1.pdf next to the note
python3 hnote2pdf.py "Lecture 1.hnote" -o ~/Desktop/lecture.pdf
python3 hnote2pdf.py MyVault -r -o ~/PDF/ # every note in a folder, recursively
python3 hnote2pdf.py ".Lecture 1.hnote-data/history/20261019-212953_0f315cad_auto.hnote.gz" # an old version
Options: --no-pattern, --pressure 0.7 / --no-pressure, --vault PATH. The file format is described at the top
of the script and in src/tools/README.md.
Lectures/Physics/Lecture 1.hnote ← the note (plain JSON)
Lectures/Physics/.Lecture 1.hnote-data/ ← hidden folder of this note
attachments/ images, plots, imported PDF pages
history/ versions (gzip) + images only old versions use
meta.json
history/attachments and are removed once no version needs them..hnote notes, their hidden .<name>.hnote-data folders and - when you ask - hnote2pdf.py.
Files outside the vault only when you pick a folder on your computer for PDF export (desktop)..hnote files, never your Markdown notes. The vault file list is used to find other notes (so a
renamed note can't take over another note's folder) and to offer folders for PDF export.hnote2pdf.py command - and
while waiting for a Snipping Tool screenshot you started.Settings → Toolbar decides what is on the toolbar:
Everything else is in the ⋯ menu (nothing appears twice), together with quick switches for pen pressure and palm rejection.
| Section | What you can set |
|---|---|
| Pen and touch | pressure, palm rejection, pinch zoom, long-press menu, pen side button, eraser on shapes / highlighter, selection mode |
| Colors | five quick colours for the pen and for the highlighter |
| Pages and view | default pattern and paper, favourite zooms, zoom when opening, pages panel side and columns |
| Toolbar | tools and shortcut buttons |
| Files and export | where images are stored, the Python converter, new-note naming, PDF location and resolution |
| Version history | on / off, interval, retention, space limit per note |
| Performance | canvas sharpness, low-latency ink |
| OLED care | dark paper, fading toolbar, pixel shift, dim when idle |
| Advanced | debug logging, performance overlay |
| Command | |
|---|---|
| Create new handwritten note | |
| Open calculator | |
| Insert function plot into handwritten note | |
| Export current note to PDF / Print current note | |
| Show version history / Save a version now | |
| Go to page… / Set title of the current page | |
| Zoom to favourite zoom (repeat to cycle) / Save current zoom as favourite | |
| Move images of the current note into its hidden folder | for notes created before the hidden folder existed |
| Remove unused images from the current note's hidden folder | |
| Save the PDF converter script / Copy terminal line to convert this note to PDF with Python |
src/main.ts plugin + the view (lifecycle, loading / saving notes)
src/styles.css all styles
src/view/*.ts view features as mixins (input, navigation, selection, currentPage, pagesPanel, toolbar, versions, …)
src/format.ts file format versions and migrations (v1 → v4)
src/pageFormat.ts page sizes (A4, landscape, endless)
src/templates.ts page patterns (shared geometry for screen, thumbnails, PDF)
src/math/ calculator, expression parser, units, function plots
src/tools/hnote2pdf.py standalone converter; src/tools/embed_script.py copies it into src/converterScript.ts
scripts/ esbuild.config.mjs (build), build-site.mjs (website), deploy.mjs (copy the build into a vault)
site/ website + live demo: content.mjs (texts and links), render.mjs, site.css, shim/ (fake Obsidian API)
manifest.json plugin manifest - stays in the repository root, Obsidian reads it from there
.github/workflows/ release.yml: GitHub release on a version tag · pages.yml: the website on every push to master
build/ build output (not committed)
npm install
npm run dev # build into build/ and rebuild on change
npm run build # production build into build/
npm run typecheck # TypeScript check
npm run lint # ESLint with Obsidian's review rules (eslint-plugin-obsidianmd)
npm run embed # after changing src/tools/hnote2pdf.py
npm run deploy:local # build and copy build/* into the vault folder set in .vault-plugin-dir
npm run site:dev # website + live demo on http://localhost:8080 (rebuilds on change)
npm run site:build # website into build/site/
Set the same version in manifest.json and package.json, then push a tag with that version (no v prefix).
release.yml builds the plugin and creates the GitHub release. The website (pages.yml) is published on every push
to master.
MIT - free to use, change and share, also commercially, as long as the copyright notice and the license text are kept.