npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

joplin-plugin-note-categorization

v0.1.3

Published

An on-device AI plugin for Joplin that semantically clusters notes, suggests tags and notebook structures, and detects stale/archivable notes.

Readme

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 embedding pipeline, clustering (K-Means, K-Medoids, HDBSCAN), and an interactive UI panel are implemented. Settings customization and staleness analysis 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:

  1. Semantic Embeddings: Computing dense vector representations of notes on-device.
  2. Clustering & Classification: Grouping similar notes together and extracting keywords for automatic tags or notebook structures.
  3. 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-tiktoken tokenizer (cl100k_base vocabulary).
  • On-Device Embedding Generation: A Web Worker uses @huggingface/transformers to run the Xenova/all-MiniLM-L6-v2 model. No data ever leaves your machine.
  • Hybrid Device Execution:
    • Windows & macOS: Automatically detects WebGPU support (navigator.gpu) and executes the model in fp16 precision (at ~43ms per note).
    • Linux (Fallback): Defaults to running on the CPU using WebAssembly (q8 quantized precision, running ~2x faster than the standard fp32 CPU baseline).

Current Features

  • 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

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:

  1. Compiles TypeScript source files under src/ via Webpack.
  2. Compiles the Web Worker (src/worker/embedWorker.ts) targeting browser-compatible environments.
  3. Runs tools/copyAssets.js to copy local onnxruntime-web WASM files into dist/onnx-dist/ so Electron can load them offline without triggering Content Security Policy (CSP) violations.
  4. Packages everything into a .jpl archive in the publish/ directory.

Testing the Pipeline

  1. Open Joplin.
  2. Go to Settings -> Plugins -> Manage Plugins -> Install from File and select the .jpl package generated in publish/.
  3. Restart Joplin.
  4. Open the categorization panel from View -> AI Categorise: Toggle Panel (or click the brain icon on the note toolbar).
  5. Click Analyse Notes to run the full pipeline: notes are embedded, clustered, and results are displayed in the panel.