We are now nearing the end of my GSoC project, and I just released version v0.1.9 of the Note Categorization plugin. Everything is now fully implemented, all the core features are in place, and the plugin is in a solid, working state.
To show how it actually works, I recorded two videos:
Short demo (under 1 minute): A quick look at running the plugin, previewing clusters, and applying changes.
Link: https://youtu.be/RiMKqYYy82Q
Full walkthrough: A longer video showing how it runs 100% offline with the local ONNX model, versus enabling Joplin's native AI features for faster embeddings and smarter category names.
Link: https://youtu.be/kT5uhHgd-B8
What the plugin does
It groups your notes semantically right on your device. It can use Joplin's native AI embeddings if you have it enabled, or fall back to a local ONNX model with local caching. For naming the categories, it uses Joplin's native AI chat API to give clean titles, with a keyword fallback if AI isn't set up. You can preview everything in the sidebar panel, drag notes between categories, rename things, and apply the new structure. If you ever want to revert, there is a one-click Undo in Settings that restores your notes and cleans up empty notebooks.
The plugin works much better and faster when using Joplin's native AI. Please note that to use Joplin's native AI features, you will need to be on Joplin version 3.7.9.
Regarding the algorithms: K-means is tested across parameters and completely ready to go. HDBSCAN is also implemented, but right now it puts too many notes into the Uncategorized cluster, so I recommend sticking with K-means for testing.
Feedback & Installation
Please try installing v0.1.9 and test it on your notes.
Let me know how the clusters look on your collection and if you run into any bugs or UI issues. I'm actively monitoring this thread and ready to fix anything that comes up!
When you say that it is best using Joplin's native AI features, does that mean the AI model will run locally on your device, or is an external model still required for best results?
No external model is required, and the plugin can run 100% offline on your device but if you want better names for the created categories you can use ai providers.
When it comes to grouping the notes, everything happens locally on your machine. Joplin's native ai uses a local multilingual model, so if you have it enabled, the plugin just reuses those local embeddings (which makes it super fast). If you don't have it enabled, the plugin just uses its own built-in local onnx model anyway. In both cases, everything is locally run.
I use external model only for naming the categories created. And if the "Allow remote AI providers" feature is disabled, the plugin falls back to local keyword extraction. It works fine, but the names will be generic.
If you have Joplin's AI chat set up with a provider, the plugin uses that to give better cluster names.
Thanks for giving it a try, glad to hear it working well.
Thank you for suggestion, I can definitely add an option so you can choose how to apply the categories - Tags only, Notebooks only, or Both.
will add it in the next version.
Thanks for developing this plugin. I expect it will come in handy for me.
Can an option be added to include or exclude notebooks for categorization? The latter would be particularly useful for me, as some of my notes are already categorized into notebooks I want them within.
Returning from Options, Note attachments, or Synchronization Status pages causes the plugin panel to show the "No categories yet" screen, even if notes were being categorized beforehand. Can the categorization process persist during and after visiting those pages? Can the categorization progress be shown in the panel after returning from those pages? Separately, does this kind of issue occur with similar plugins?
Will the tags within each category be added to the notes within? If so, can there be an option to prevent that (e.g. for users that don't use tags)?
Glad to hear it! Thanks for trying it out and sharing these points.
I'd love to add this! There are just a few tricky details with notebook hierarchies to sort out first. I'll test out some approaches and update you once I have something working.
I tried reproducing this on my end, but the background process kept running and the panel progress/results restored properly when returning to the notes view. Also the code already handles re-syncing the state on return, so it might be something specific to your OS or Joplin version. Could you share which os and joplin version you're on?
I just released an update that adds this! You can now choose your preferred apply method (Both, Tags only, or Notebooks only) in the plugin settings, and customize it directly in the panel before applying changes.
I'm running v0.1.10 of the plugin on Joplin 3.6.15 on Linux.
Here are my results of testing visiting another page while categorization is running:
Returning during "Fetching notes...": works as expected.
Returning while clusters are being shown: works as expected.
Returning during "Loading model...": doesn't work as expected. Instead, it shows the "No categories yet" page with an enabled "Run" button. The process may or may not be running in the background, but the panel doesn't make it evident.
I've just added notebook filtering (selective categorization) in the latest update (v0.1.11)! You can now choose specific notebooks to include or exclude before running categorization, rather than having to run it across your entire workspace.
I haven't been able to reproduce this behavior on my system yet, so a quick question to help me track down what's happening:
When you switch back to the panel while it says "Loading model...", does that "No categories yet" screen stay stuck permanently, or does the panel eventually update to show your results once the background process finishes?
Your answer will help me pinpoint the exact cause so I can push a fix. Thanks!
That notebook filter looks and works great, thanks! As for switching back to the panel and seeing "No categories yet":
I'm now getting this issue during the embedding stage rather than during model loading. Also, the latter now only displays for a few seconds at most before transitioning to embedding.
To answer your question, the panel eventually shows results once the background process finishes.