No description
Find a file
Sirwan Afifi bf23ed7bd0 release: 0.2.9 with attestation propagation gate
Prior releases published ~3s after attesting, so Obsidian's dashboard could
scan the release before the attestation propagated to GitHub's public API and
cache a failed verdict — matching a same-day report from another plugin author
where every post-hoc check (gh attestation verify, one attestation per digest,
matching repo/commit) passed yet the dashboard still failed.

- Gate release creation on gh attestation verify succeeding against the public
  API (retry loop), so we never publish before the attestation is queryable.
- Upgrade to actions/attest-build-provenance@v4.
- Fresh 0.2.9 asset digests (styles.css comment + main.js version banner) so
  the new scan runs against digests with a single clean attestation.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 16:17:36 +01:00
.github/workflows release: 0.2.9 with attestation propagation gate 2026-07-17 16:17:36 +01:00
docs/images update the old image 2026-07-17 13:39:02 +01:00
scripts Launch Inkplane infinite canvas (#1) 2026-07-16 13:58:35 +01:00
src fix: satisfy Obsidian release verification 2026-07-17 14:19:25 +01:00
tests Add area erasing and refresh toolbar UI 2026-07-17 13:06:36 +01:00
.gitignore Initial Ink Layer release 2026-07-16 12:33:33 +01:00
.npmrc Initial Ink Layer release 2026-07-16 12:33:33 +01:00
.nvmrc Initial Ink Layer release 2026-07-16 12:33:33 +01:00
CHANGELOG.md release: 0.2.5 2026-07-17 15:24:00 +01:00
esbuild.config.mjs fix(release): match Obsidian attestation format 2026-07-17 15:06:01 +01:00
LICENSE Initial Ink Layer release 2026-07-16 12:33:33 +01:00
manifest.json release: 0.2.9 with attestation propagation gate 2026-07-17 16:17:36 +01:00
package-lock.json release: 0.2.9 with attestation propagation gate 2026-07-17 16:17:36 +01:00
package.json release: 0.2.9 with attestation propagation gate 2026-07-17 16:17:36 +01:00
README.md apply some obsidian suggestions 2026-07-17 13:48:04 +01:00
styles.css release: 0.2.9 with attestation propagation gate 2026-07-17 16:17:36 +01:00
tsconfig.json Initial Ink Layer release 2026-07-16 12:33:33 +01:00
version-bump.mjs Initial Ink Layer release 2026-07-16 12:33:33 +01:00
versions.json release: 0.2.9 with attestation propagation gate 2026-07-17 16:17:36 +01:00

Inkplane

A Pencil-first infinite canvas for Obsidian

Obsidian 1.7.2+ Apple Pencil Release License: MIT

Inkplane gives handwriting and sketches their own dedicated space inside Obsidian. Every drawing is a portable .inklayer file in your vault: open it as an edge-to-edge canvas, draw naturally with Apple Pencil or another pen, and embed it in any note when you want it in context.

Inkplane canvas beside an Obsidian note containing an embedded drawing

Draw on an infinite canvas, then embed the result directly in any Obsidian note.

Why Inkplane?

  • Made for Pencil input. Pressure-aware ink, palm rejection, coalesced pointer samples, and iPad-safe controls.
  • A real canvas, not a note overlay. Draw without being constrained by Markdown layout or page dimensions.
  • Native to your vault. Drawings are readable JSON files that move, sync, rename, and back up with the rest of your notes.
  • Embed only when useful. Place a read-only preview in any Markdown note and open the source canvas with one action.
  • Private by default. No accounts, network requests, analytics, or telemetry.

Quick start

  1. Run Inkplane: Create new drawing or select the pen icon in the ribbon.
  2. Draw with Apple Pencil. Use one finger to pan and two fingers to zoom on iPad.
  3. In a note, run Inkplane: Insert existing drawing in current note to add the canvas as an embed.

Inkplane stores new drawings in the Inkplane folder by default. Both the folder and default embed dimensions are configurable in Settings → Inkplane.

The canvas

Inkplane keeps the controls compact so the drawing remains the focus:

  • Pressure-aware pen and translucent highlighter
  • Area eraser that removes only the touched part of a stroke
  • Lasso selection, movement, and deletion
  • Undo and redo history
  • Infinite pan and pinch/trackpad zoom
  • Stroke-aware fit-to-view
  • Quick colour swatches plus theme-matched, preset, and custom ink colours
  • Live previews, width presets, and precise size controls for every drawing tool
  • Configurable top or bottom toolbar with iPad safe-area support
  • SVG export to a normal vault attachment

Inkplane infinite canvas and drawing toolbar on iPad

The Pencil-first canvas on iPad, with drawing tools, quick colours, and zoom controls close at hand.

Settings

Open Settings → Inkplane to configure:

  • The folder for new .inklayer drawings and default embed dimensions
  • Pen and highlighter colours and widths, eraser size, and pressure response
  • Palm rejection and optional finger or mouse drawing
  • Top or bottom toolbar placement

Embedding drawings

Run Inkplane: Insert new drawing in current note to create, embed, and open a canvas in one flow. To reuse a drawing, run Insert existing drawing in current note.

Inkplane generates ordinary Obsidian embed syntax:

![[Inkplane/Project sketch.inklayer|800x600]]

Change 800x600 to control the preview size. Embedded canvases are intentionally read-only so they never capture note scrolling. Double-click a preview, or use its expand control, to open the source drawing.

Installation

Obsidian Community plugins

  1. Open Settings → Community plugins in Obsidian.
  2. Turn on community plugins if Obsidian prompts you to leave Restricted Mode.
  3. Select Browse, search for Inkplane, and select Install.
  4. Select Enable when installation finishes.

Obsidian installs updates from Inkplane's matching GitHub releases.

Beta testing with BRAT

To test a release before it reaches the Community directory, use BRAT:

  1. Install and enable BRAT.
  2. Run BRAT: Add a beta plugin for testing.
  3. Enter https://github.com/SirwanAfifi/inkplane.
  4. Enable Inkplane in Settings → Community plugins.

BRAT will keep the plugin updated from GitHub releases.

Manual installation

  1. Download main.js, manifest.json, and styles.css from the latest release.
  2. Create <vault>/.obsidian/plugins/ink-layer/.
  3. Copy the three files into that folder.
  4. Reload Obsidian and enable Inkplane under Community plugins.

The folder remains ink-layer for compatibility with existing installations; the product name shown in Obsidian is Inkplane.

Commands

Command What it does
Create new drawing Creates and opens a standalone canvas.
Insert new drawing in current note Creates a drawing, embeds it, and opens it.
Insert existing drawing in current note Chooses and embeds a drawing from the configured drawing folder.
Export current drawing as SVG Writes a scalable image attachment to the vault.
Convert legacy ink from current note to a drawing Copies version 0.1 note ink into a standalone canvas.
Select pen / highlighter / eraser / lasso / pan Switches tools from the command palette or a custom hotkey.
Switch between pen and eraser Toggles between the two tools on the active canvas.
Undo ink / Redo ink / Fit drawing / Clear drawing Controls the active canvas.

Platform support

Platform Experience
iPad + Apple Pencil Primary experience: Pencil draws, one finger pans, and two fingers zoom.
Windows pen devices Supported through standard browser PointerEvent pen input.
Desktop + trackpad Draw with a mouse if enabled; pan and zoom with the trackpad or canvas tools.
Touch devices Palm rejection is on by default; optional finger drawing is available in settings.

Inkplane uses web-standard pointer type, pressure, tilt, pointer capture, and coalesced events. Apple Pencil double-tap and Pencil Pro squeeze are not exposed consistently to Obsidian community plugins by the iPad WebView, so Inkplane does not claim to intercept those private hardware gestures.

Files, migration, and privacy

Each .inklayer file is readable JSON. Stroke points are stored as compact tuples containing position, pressure, tilt, and time, while the drawing file retains its canvas metadata. This format follows normal Obsidian Sync, backup, rename, and file-management workflows.

Ink created by Inkplane 0.1 remains untouched in the plugin's data.json. Open the original note and run Convert legacy ink from current note to a drawing to copy those strokes into a standalone file and insert an embed. The original data is deliberately retained as a backup.

Inkplane makes no network requests and collects no telemetry. The existing-drawing picker searches only the configured drawing folder and does not enumerate other vault file paths. The only files Inkplane writes are plugin settings, .inklayer drawings, and SVG exports you explicitly request.

Development

Requirements: Node.js, npm, and Obsidian 1.7.2 or newer.

npm install
npm run check

npm run check runs the test suite, production build, and release validation. For local development, clone the repository into <vault>/.obsidian/plugins/ink-layer, run npm run dev, and reload Obsidian when the bundle changes.

A release consists of:

main.js
manifest.json
styles.css

The runtime uses Obsidian's mobile-safe APIs and does not import Node.js or Electron APIs. Bug reports and feature requests are welcome in GitHub Issues.

Compatibility promise

The internal plugin ID remains ink-layer, and drawing files retain the .inklayer extension. This preserves upgrades, existing installations, embeds, and vault data across the Inkplane rebrand.

License

MIT © Sirwan Afifi