Repository navigation
0.1.38
Audited the product requirements against what the code actually does. Most requirements were already met; four were not, and the one bug the requirements flagged turned out to be in the written spec rather than the system.
Downloads are now verified against their declared hash
The change feed has always carried a hash for each version, and the client never checked it — the field was only ever computed when uploading.
The encryption already catches altered bytes, and the authenticated data already catches a blob replayed into a different file's slot. Neither catches an earlier version of the same file being served as the current one: those bytes are genuinely yours, correctly signed, correctly bound to that file. Only the declared hash tells them apart. Silently reverting a note to an older copy is precisely what this system exists to prevent, so a mismatch is now refused rather than applied.
Deleting on one device no longer beats an unsynced edit elsewhere
Previously, if you deleted a note on your laptop while your phone had an edit it hadn't synced yet, the phone merged your text against the tombstone's empty payload — writing an empty file over the note and pushing the real content into a conflict copy.
Now the edit wins: the note is restored with your content and the restoration propagates back to the device that deleted it. Re-deleting takes a second; writing that never synced is gone for good. If both devices deleted it, it simply stays deleted.
Notes from a newer plugin are refused instead of guessed at
The envelope layer already rejected an unknown format, but the inner decoder read the version field and ignored it. A note written by a newer Synora would have been decoded on a guess — likely yielding a plausible-looking note with content quietly missing, then written back as the current version over the real one. It now stops and tells you to update.
Smaller
- Merge commits record both versions they reconciled, so a merge is distinguishable from an ordinary edit in the history.
- Attachments are sealed under their own encryption context rather than sharing the one used for notes. Existing files are unaffected — every blob carries the context it was sealed with.
Requires the matching backend deploy, which is already live.