James Wolensky5k downloadsDraw with native stylus and Apple Pencil directly in Canvas nodes and Markdown embeds.
Native stylus and Apple Pencil drawing for Obsidian.
Blackboard adds a .blackboard file type with pressure-sensitive freehand drawing and palm rejection. You draw directly inside Obsidian Canvas nodes and Markdown embeds, with no separate editor to open first. It is built for iPad with Apple Pencil and also works on desktop with a mouse.
|WxH size on a Markdown embed (without one, the embed uses the drawing's own size). A drawing shows at the size it was drawn and only shrinks to fit when it is larger than its frame. Strokes are clipped to the node and never resize it..blackboard files are plain, human-readable JSON that diffs cleanly in Git.Blackboard is for fast, native pen drawing inside your notes and canvases. Excalidraw is a full diagramming tool, and Ink is another handwriting plugin. They're built for different things.
| Blackboard | Excalidraw | Ink | |
|---|---|---|---|
| Draw directly on a Canvas node (no open-to-edit step) | ✓ | ✗ | ✗¹ |
| Live drawing in a Markdown embed | ✓ | ✗ | ✓² |
| Strokes reliably persist on reload | ✓ | ✓ | Not always³ |
| Plain-text, Git-diffable files | ✓ | ✗⁴ | ✗⁴ |
| Diagramming: shapes, arrows, text | ✗⁵ | ✓ | ✗ |
| Primary focus | pen drawing | diagramming | handwriting |
Need rich diagramming? Use Excalidraw. It's excellent at it.
main.js, manifest.json, and styles.css from the latest release.<vault>/.obsidian/plugins/blackboard/.jameswolensky/obsidian-blackboard.Run Blackboard: New drawing from the command palette. It creates a .blackboard file and opens it in the full-page editor. An empty drawing opens at 1:1, and a drawing with strokes opens at the size it was drawn, centred (a large one shrinks to fit the pane).
A single floating toolbar follows whichever drawing is active. It holds the pen, highlighter and eraser, a color control (preset swatches plus a color wheel), a brush-size control, undo and redo, buttons to insert a new or existing drawing, and a button that collapses it to a small pill. The pen and highlighter each keep their own color and size, and those choices apply to every drawing on the page (pick a pen color once and it stays as you move between drawings). On a Canvas with no active drawing the collapsed pill stays on screen so there is always a button to add one; everywhere else the toolbar only shows while a drawing is active.


Run Blackboard: Insert drawing, or right-click in the editor and choose Insert drawing, to create a drawing and embed it at the cursor. You can also embed an existing drawing like any file: ![[My Drawing.blackboard]]. Without a size, the embed uses the drawing's own size, centred, and shrinks to the note's width when it is wider. Set a size with the standard Obsidian syntax, for example ![[My Drawing.blackboard|640x480]] or ![[My Drawing.blackboard|100%]]. You draw on the embed directly.

Turn on Auto-export SVG in settings to write an .svg copy of each drawing whenever it changes (empty drawings are skipped, and the SVG has a transparent background). Set SVG export path to collect the exports in one folder. When the SVG sits next to its drawing, renaming or deleting the drawing renames or deletes the SVG too.
| Command | Description |
|---|---|
| New drawing | Create a new .blackboard file and open it |
| Insert drawing | Create a drawing and embed it at the cursor in a note, or as a node in the active Canvas |
| Insert existing drawing | Pick an existing .blackboard file and embed it at the cursor in a note, or in the active Canvas |
The insert commands need an open note or Canvas. Run from the full-page drawing editor, they show a notice and do nothing.

| Setting | Default | Description |
|---|---|---|
| Drawing folder | Blackboard |
Folder for new drawing files |
| New file location | Fixed folder | Where to create new drawing files |
| Auto-export SVG | Off | Export an SVG copy of each drawing whenever it changes |
| SVG export path | (empty) | Folder for exported SVG files (empty = same folder as drawing) |
| Board background | #000000 |
Color painted behind every drawing (Canvas node, Markdown embed, and the full-page view). Default black; set white for a whiteboard. |
| Color 1 to Color 8 | see below | Swatch 1 to 8 in the toolbar color popover |
| Show toolbar pill | On | Show the collapsed pen-icon pill on Canvas with no active drawing, so there is always a button to add one. Turn off to hide it until a drawing is active. |
New file location offers Fixed folder (the drawing folder) or Same as active file, and applies to the New drawing command. SVG export path only shows while Auto-export SVG is on. The default toolbar palette is #000000, #ffffff, #ff0000, #0000ff, #00ff00, #ffff00, #ffa500, #800080. Pen and highlighter colors and sizes, and the eraser size, are picked live from the floating toolbar (they are not settings).
| Platform | Input | Notes |
|---|---|---|
| iPad + Apple Pencil | Full pressure | Primary target |
| iPad (touch) | Navigation only | In the full-page editor one finger pans and two fingers pinch-zoom. Fingers never draw. |
| Android tablet + stylus | Pressure varies by device | Supported |
| Desktop (mouse) | No pressure (stroke width follows drawing speed) | Supported |
.blackboard files are JSON:
{
"version": 3,
"width": 60,
"height": 50,
"strokes": [
{
"id": "abc123",
"tool": "pen",
"color": "#ffffff",
"size": 2,
"opacity": 1,
"points": [[100, 200, 0.5], [101, 201, 0.6]],
"hasPressure": true,
"timestamp": 1711281600000
}
],
"background": { "color": "transparent" },
"contentBounds": { "x": 80, "y": 180, "width": 60, "height": 50 }
}
Each stroke is a list of [x, y, pressure] points in drawing space. width, height and contentBounds cache the strokes' bounding box and are recomputed from the strokes on save (an empty drawing saves 800 x 600 and no contentBounds). A Canvas node or a sized embed sets its own display size. Files from earlier versions open as they are.
Requires Node.js 24 and npm.
npm install
npm run dev # watch build
npm run build # production build
npm test # unit tests (Vitest)
npm run check # typecheck + lint + tests + build
The desktop test runner can't reproduce iPad rendering (Apple WebKit), so I check anything iPad-specific by hand on an iPad.
See CONTRIBUTING.md for the contribution workflow and conventions.
MIT © James Wolensky