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 embedding pipeline, clustering (K-Means, K-Medoids, HDBSCAN), and an interactive UI panel are implemented. Settings customization and staleness analysis 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 (
- Embedding Pipeline: On-device embedding generation with WebGPU acceleration and WASM fallback
- Native AI Integration: Automatically uses Joplin's built-in AI Search embeddings when available
- Multi-Strategy Clustering: Compare K-Means, K-Medoids, and HDBSCAN results side-by-side
- Interactive Panel: Drag-and-drop notes between clusters, rename clusters, add custom categories
- Apply Categorization: Organize notes into notebooks and/or tags based on clustering results
- Undo Support: Revert any applied categorization with full change tracking
- Empty Notebook Cleanup: Remove empty notebooks left after reorganization
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.
- Open the categorization panel from View -> AI Categorise: Toggle Panel (or click the brain icon on the note toolbar).
- Click Analyse Notes to run the full pipeline: notes are embedded, clustered, and results are displayed in the panel.