Description
AI-based note categorisation: clusters notes semantically, suggests tags and notebook structures, and detects stale notes.
Additional Information
| Links: | |
|---|---|
| Maintainers: | harshgupta16 |
| Version: | 0.1.1 |
| Minimum app version: | 3.5 |
| Downloads: This version: | 7 |
| Last updated: | 2026-07-13T23:37:49Z |
Joplin Note Categorization Plugin
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.
What the Project is About
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.
How It Works (Current Pipeline)
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 (
How to Run & Build
Prerequisites
Installation
Clone the repository and install the development dependencies:
npm install
Building the Plugin
To compile the source code, pack the Web Worker, and bundle the ONNX runtime WASM assets locally:
npm run dist
This 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.
Testing the Pipeline
- 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.