15 KiB
1.0
Well then, everyone: it has been roughly a year since I declared the 0.25 beta. During that time, we have concentrated mainly on fixing defects and completing the features that the project needed.
Version 1.0 has been in mind for some time. We have now brought together the work intended to make it possible: stronger CI, more detailed tests, an E2E runner suited to synchronisation, and testing tools for physical devices. These now form a coherent Kit rather than a collection of isolated pieces. With those foundations in place, it seems that the time has finally come to reshape the structure of this repository.
None of this would have been possible without your issue reports, pull requests, sponsorship, and the support provided through OpenAI's Codex for Open Source. I would like to express my gratitude once again. As with every pull request contributed to the project, code produced with Codex and similar tools is reviewed and audited by me, vrtmrz. Anyone interested in how I manage that process can refer to my dotfiles.
This will call for your help once again. I would be very grateful for your co-operation as we build a sounder foundation for the project and its future development.
Earlier releases remain available in the 1.0 release history, the 1.0 preview history, the 0.25 release history, and the legacy release history.
Unreleased
1.0.49
11th November, 2026
Changed
Encryption
- With E2EE enabled, CouchDB documents containing unencrypted file content are now rejected by default.
- To retain the previous behaviour for third-party integrations that intentionally write plaintext, expand Advanced in the E2EE dialogue and enable Accept unencrypted content. The setting is off by default.
- Enabling it allows anyone with write access to the remote database to supply plaintext file content. Content sent by this plug-in remains encrypted.
- The setting is included in exported settings Markdown, Setup URIs, and QR codes. Changing this setting alone does not require Fetch or Rebuild.
Miscellaneous
- Updated dependencies.
Acknowledgements
- @Hama1cco, for reporting plaintext content acceptance with E2EE enabled.
1.0.48
11th November, 2026
Fixed
- Ordinary start-up scans can apply retained database deletions to Vault files whose content is confirmed unchanged. (#1338)
- Files with local changes or insufficient provenance remain available for review.
- Interrupted provenance and scan-record cleanup is retried from existing local state during a later scan.
1.0.47
9th November, 2026
Fixed
Synchronisation and recovery
-
Temporary read failures no longer leave synchronisation blocked until Obsidian restarts. (#1331)
- A related file change or Apply pending changes now retries the failed operation.
- This applies to ordinary Vault files and uses the current Vault state.
-
Fixed CouchDB Fetch failures in Vaults that already contain the fetched files. (#1329, #1332)
- With Fetch chunks on demand enabled, missing Chunks are retrieved when needed.
- The same fix applies when Fast Setup falls back to Standard Fetch.
- Use Only Local Chunks remains respected. Unavailable content keeps Fetch incomplete for retry.
CLI
Fixed
-
Fixed repeated CouchDB Fetch failures in an existing Vault. (#1329)
- Content checks retrieve missing Chunks with Fetch chunks on demand enabled.
- Use Only Local Chunks remains respected. Incomplete Fetch operations retain their recovery state.
-
Unreadable hidden directories no longer prevent the CLI daemon from starting. (#1325)
- Vault scans skip these directories, which remain excluded from synchronisation.
-
The daemon no longer misses files written into newly created folders. (#1328)
- This includes bursts of writes and files renamed from temporary names.
- The CLI requires Node.js 22.22 or later. The Docker image includes its own runtime.
1.0.46
7th November, 2026
P2P synchronisation can stop connecting when our devices are on different versions. And this is one of those versions.
If we use P2P synchronisation, let us make sure all our devices are on the same version.
Fixed
Synchronisation and recovery
- Receiving devices no longer reject newly saved files with 'seems to be corrupted! Writing prevented' because rapid edits left the sender's cached file size out of date. New saves record the byte length of the content actually read. (#1324)
- Existing incorrect size records need explicit repair. Use Inspect conflicts and file/database differences → Correct recorded file size when the readable current database revision has no conflicts and matches the Vault exactly. The correction retains the file content and timestamps.
P2P synchronisation
- Peer actions and long device names now fit narrow panes. Larger buttons and wrapped labels keep the controls readable and usable.
Improved
P2P synchronisation
-
We can inspect the latest relay, peer, and synchronisation observations in P2P Status. Expand Diagnostic summary below Stats; detailed observations start collapsed.
- Enable Diag to show diagnostic events in the Log Pane without editor-status updates or notifications. Opening the Log Pane also displays its buffered messages.
- Unobserved information is labelled explicitly. An open room does not establish relay acceptance; relay rejection details remain unavailable through the diagnostic summary.
-
We can see sent (↑) and received (↓) database document revision counts in the P2P panes and editor status, and in the main status bar when P2P is our main remote. Counts include Metadata and Chunks, rather than Vault files.
- Directional ⏩ labels show changes-feed comparison progress, including when no revisions need transferring. Each label disappears three seconds after its count last changes; its absence alone does not establish completion. Peers without document statistics retain sequence values labelled
seq.
- Directional ⏩ labels show changes-feed comparison progress, including when no revisions need transferring. Each label disappears three seconds after its count last changes; its absence alone does not establish completion. Peers without document statistics retain sequence values labelled
-
The updated transport incorporates upstream improvements to peer discovery after relay reconnection, missed signalling messages, and stale connections after rejoining or waiting. Connection offers are created on demand.
- All communicating devices in our P2P group, including CLI and WebPeer clients, must be updated together before P2P synchronisation resumes. Trystero 0.26.0 cannot exchange data with the previous transport.
Documentation
- Clarified backend selection and hosting requirements, including Object Storage request costs. Added a guide to P2P diagnostic observations, logs, and transfer progress.
1.0.45
5th November, 2026
Some of my recent replies have been sporting the Codex icon. Rest assured: I simply ask Codex to polish my English and discreetly intercept the occasional ill-judged remark before I post.
New Feature
Synchronisation
- We can recognise equivalent composed and decomposed Unicode file names as the same file when synchronising through Object Storage or P2P. (#1309)
- Select Unicode NFC path identity under General Settings → File identity. Supported by the CLI and Obsidian; physical file names and Chunk IDs remain unchanged.
- To migrate a Legacy database, update every participating client, stop synchronisation and editing, and preserve a complete, backed-up authoritative Vault, unique edits, and required history. Resolve colliding names before Rebuild on the source and Fetch on the remaining devices. With P2P, Rebuild prepares only the source database; keep that device online for Fetch.
- New CLI settings and Obsidian manual setup use NFC. Existing settings and older Setup URIs retain Legacy identity; initial CouchDB or Object Storage setup follows the remote's declared identity.
- Object Storage remotes with existing Journals but no compatibility declaration also require Rebuild, even in Legacy mode.
Fixed
Object Storage
-
Journal receive failures now stop replication instead of silently passing over records which could not be decoded, processed, or saved. (#1318)
- After correcting the cause, retry replication with the same local database to receive the failed Journal again.
- If a Journal cannot be recovered and missing content or history is acceptable, use Maintenance → Syncing → Skip stopped Journal and resume. The confirmation identifies its exact key and failure stage. Only that Journal is skipped; the next failure still stops receipt.
- Journals already passed over by an earlier version require Reset journal received history to be replayed. This re-reads Journals still available remotely, except those sent by this device, and cannot recreate missing remote Journals.
-
A remote-only Rebuild resends the local database even when the Object Storage remote is already empty and this device retains its earlier transfer progress.
Synchronisation
- CouchDB synchronisation and Fetch no longer fail with decryption errors caused by stale encrypted responses in the Internal API cache after a Rebuild or plug-in restart. (#1234)
- Reads use a cache query parameter based on the current start-up and Security Seed.
- Use headers only for HTTP cache control (compatibility) under Power users → CouchDB Connection Tweak is disabled by default. Enable it only if the server or proxy rejects the additional query parameter; affected native caches may then reuse stale encrypted responses after Rebuild.
Conflict resolution
- Disabling or reloading the plug-in no longer causes a secondary error when pending work writes to the log. Late logs remain available in Obsidian's console.
- Open conflict dialogues for ordinary files close immediately, and queued checks report cancellation.
Settings
- The English description of Do not split chunks in the background now correctly states that enabling the setting moves Chunk splitting to the UI thread. (#1313)
Translations
- The notice shown when a translation is available now displays the Display Language setting label correctly in English, French, Hebrew, Russian, and Simplified Chinese. Hebrew interface messages also display their referenced labels correctly. (#1298)
WebApp
- The experimental WebApp rejects unsupported NFC path identity before opening its database or processing Vault files, preserving the selected files and settings.
- WebApp remains Legacy-only. Changing the setting does not migrate an NFC database.
Improved
Translations
- More of the interface is available in Japanese, including dialogue buttons, Vault history, SyncGuard, inspection reports, and Fetch restart confirmations. Japanese setup and settings guides have also been refreshed. (#1317)
CLI
New Feature
- We can resume Object Storage receipt after deliberately skipping one unrecoverable Journal with
journal-skip <journal-key>.- Retry
syncwith--debugto inspect the stopped Journal key and failure stage. The command retries replication first and skips only the supplied Journal if it remains stopped. - Use this only when missing content or history is acceptable. The next Journal failure still stops receipt.
- Retry
Fixed
fetchandrebuildno longer replay pending file updates from the previous database at start-up. The old pending updates are discarded only after the local database reset succeeds.fetchanddaemoncan write received files to the Vault whenhandleFilenameCaseSensitiveis enabled. The CLI detects whether the Vault filesystem distinguishes letter case. (#1319)- NFC file lookups and directory scans report permission and I/O failures. Unreadable files are no longer treated as absent, and incomplete scans no longer count as successful.
Miscellaneous
- Updated dependencies.
Acknowledgements
Thank you for your contributions!
- @cwatanab, for improving Japanese translations and documentation, correcting translated labels, and correcting the Chunk splitting setting description (#1298, #1313, #1317).
1.0.44
1st November, 2026
Recently, I have been concentrating on maintenance and improvements to individual features. I began to wonder whether I had been focusing a little too closely on the details and could give more attention to the overall picture. That led me to a somewhat broader round of changes, including reworking parts of the architecture. Along the way, I was able to bring several implementations of the same concepts together, introduce shared abstractions, and tidy up the codebase a little.
Please let me know if any problems arise from these changes.
Fixed
Synchronisation
-
Files containing a raw unit separator (
U+001F) are no longer truncated when received through S3-compatible Object Storage. (#1303)- Update every participating client to prevent further truncation. Updating alone does not repair copies already damaged.
- Before recovery, preserve verified intact copies, unique unsynchronised edits, and any required history, then follow the recovery procedure.
- Rebuild and Fetch leave Hidden File Sync and Customisation Sync disabled. Initialise them deliberately after ordinary file recovery is complete.
-
We can continue CouchDB synchronisation after rebuilding an encrypted remote when Use Internal API is enabled. (#1234)
- Cached responses encrypted with the previous Security Seed no longer interfere with subsequent reads.
Conflict resolution
- A queued conflict check no longer gets stuck waiting for a response to an outdated comparison of the same file.
Hidden File Sync and Customisation Sync
- Newer local hidden files are no longer omitted when initialising Hidden File Sync with
Merge. - Refreshing the Customisation Sync catalogue no longer brings back outdated items from an earlier scan.
Improved
Hidden File Sync
- We can review the latest hidden-file revisions when changes arrive during a manual JSON comparison.
- The earlier comparison closes, and the latest revisions are checked again. If another device has resolved the conflict, the comparison closes without asking for another selection.
Sunset
Recovery
- Recovery from old cleanup locks is now unified around the standard recovery dialogue, including on devices using the legacy IndexedDB adapter.
- Use Fetch to reconstruct the local database from the remote, unlock the device when both databases are already aligned, or dismiss the dialogue.
- These choices replace the legacy in-place
Cleanupoperation. Garbage Collection V3 remains available. - Before Fetch, preserve unsynchronised work and any required local history, as it replaces the local database.
CLI
Fixed
-
We can continue using the reconstructed database after CLI
fetchorrebuild, avoiding the empty-database restart and file deletion reported in #1304.- Subsequent commands retain the selected database even without
--write-settings. Interrupted reconstruction blocks ordinary synchronisation until recovery. - Older runtime state with no recorded owner requires explicit reconstruction from a verified source. Back up unique edits before choosing Fetch or Rebuild.
- Subsequent commands retain the selected database even without
-
The CLI mirror starts correctly on Windows when the Vault path is omitted and the database directory is also used as the Vault.
Miscellaneous
- Installation and update downloads are smaller.
- Database initialisation handles encrypted change notifications more reliably. (Commonlib #191)
Acknowledgements
Thank you for your contributions!
- @AdrianNicu, for improving decryption handling during database initialisation (Commonlib #191).