An on-device AI plugin for Joplin that semantically clusters notes, suggests tags and notebook structures, and detects stale/archivable notes.
Note
This plugin is under active development as part of GSoC 2026. The initial embedding pipeline is implemented; clustering and UI panels are upcoming features.
When note collections grow, manually organizing them into notebooks and tags becomes tedious. This plugin aims to automate organization in a local-first and privacy-preserving way by:
- Semantic Embeddings: Computing dense vector representations of notes on-device.
- Clustering & Classification: Grouping similar notes together and extracting keywords for automatic tags or notebook structures.
- Staleness Analysis: Identifying notes that haven't been edited or linked to recently for archiving.
The plugin implements a background-threaded embedding pipeline:
- Token-Based Chunking: The plugin reads notes using the Joplin Data API and splits long notes into chunks of 200 tokens using the
js-tiktokentokenizer (cl100k_basevocabulary). - On-Device Embedding Generation: A Web Worker uses
@huggingface/transformersto run theXenova/all-MiniLM-L6-v2model. No data ever leaves your machine. - Hybrid Device Execution:
- Windows & macOS: Automatically detects WebGPU support (
navigator.gpu) and executes the model infp16precision (at ~43ms per note). - Linux (Fallback): Defaults to running on the CPU using WebAssembly (
q8quantized precision, running ~2x faster than the standardfp32CPU baseline).
- Windows & macOS: Automatically detects WebGPU support (
Clone the repository and install the development dependencies:
npm installTo compile the source code, pack the Web Worker, and bundle the ONNX runtime WASM assets locally:
npm run distThis script does the following:
- Compiles TypeScript source files under
src/via Webpack. - Compiles the Web Worker (
src/worker/embedWorker.ts) targeting browser-compatible environments. - Runs
tools/copyAssets.jsto copy localonnxruntime-webWASM files intodist/onnx-dist/so Electron can load them offline without triggering Content Security Policy (CSP) violations. - Packages everything into a
.jplarchive in thepublish/directory.
- Open Joplin.
- Go to Settings -> Plugins -> Manage Plugins -> Install from File and select the
.jplpackage generated inpublish/. - Restart Joplin.
- Run the debug test from Tools -> AI Categorise: Test Embedding. This will index your local notes, run the tokenizer chunking, and output performance metrics directly to your developer tools console.