Hey everyone, week 3 update.
This week was mostly review and cleanup work, but it was an important one.
The schema PR from week 1 got merged: All: Resolves #15556: Add local note encryption schema metadata by keshav0479 · Pull Request #15557 · laurent22/joplin · GitHub. So the basic metadata layer is now in dev, including the locked-note field and the resource-id field that later work builds on. Some review feedback landed before the merge and honestly made things better, the locked field was called is_locally_encrypted earlier, but "local" stops making sense once a note syncs somewhere, so it's now simply is_locked.
That naming carried into the week 2 backend work too. The code moved from the older "local encryption" wording to the clearer note lock naming, so the backend pieces are now noteLock, NoteLockKey, NoteLockService and useNoteLock. i like this more honestly, locked is the feature, encryption is just how it works underneath.
The other big lesson this week was simplification. My first version of the gated save/load path tried to guess and recover from weird partial states. If a gated save is missing the lock state, it now fails loudly instead of risking a bad save. Locked note bodies stay encrypted on disk and gated loads decrypt them only when the note lock path is explicitly used.
A few edge cases got tests along the way too: wrong/missing key, damaged ciphertext, truncated ciphertext, field-limited loads and first-lock cleanup that removes plaintext note history.
Once the schema PR merged, i rebased the backend branch onto dev, applied the last round of small comments, and it's now open in the main repo: All: Resolves #15597: Add note lock backend path by keshav0479 · Pull Request #15673 · laurent22/joplin · GitHub
Thanks to the steady review feedback this week, the whole thing feels a lot tighter than where it started. Next up is the follow-up work that builds on this backend path.
More next Friday ![]()
more frequent updates are here: Local note encryption / Keshav