diff --git a/devs.md b/devs.md index 3786afa6..a9279f14 100644 --- a/devs.md +++ b/devs.md @@ -353,6 +353,7 @@ This policy governs plug-in pre-releases and their accompanying CLI images. For - Add only user-facing changes that help users understand what they gain, what has changed, or what they may need to do after updating. - Avoid listing purely internal refactors, maintenance chores, generated-file changes, and dependency updates unless they affect users; group and label them when they are included. - When preparing a release, replace `## Unreleased` with the target version heading (for example, `## 0.25.81`) and add a fresh empty `## Unreleased` section above it for the next cycle. +- For a stable release, review the complete user-facing changes since the previous stable release. Classify new features and changed behaviour relative to that stable release. Include changes from intervening pre-releases which never became stable, even when their original notes have already moved into a release history. - Review and polish the released section in the release PR before tagging, because the content is embedded into the plug-in and may be reused as the GitHub Release notes. - Keep approximately the five most recent published plug-in versions in the embedded `updates.md`. Move older published sections unchanged into the appropriate release-line archive under `docs/releases/`, and update the history references when rotating them. @@ -372,8 +373,9 @@ For a fix needed only by the CLI, use [CLI-only patch releases](#cli-only-patch- - Validate installation or update through BRAT, and cold-start Obsidian to confirm the plug-in loads. Verify ordinary bidirectional synchronisation and relevant regression scenarios in real Obsidian against the published artefacts, or a build with matching hashes. When automated scenarios establish that coverage, BRAT acceptance need only cover installation or update and start-up; manually check any remaining release-specific behaviour. Record the artefact hashes and validation evidence as described in the [real Obsidian test guide](test/e2e-obsidian/README.md#combined-setup-and-security-regression-checks). - After a hyphenated pre-release passes, keep its release pull request unmerged. Add a reviewed metadata-only commit to the selected base branch which records the published version in `versions.json` and moves its exact tagged release notes out of `## Unreleased`, then close the release pull request only through a separate maintainer action. - After a stable version passes, remove the GitHub pre-release designation and make that exact release the latest stable release. Confirm that the release is no longer a pre-release, then mark its release pull request ready, merge the exact release commit into the selected base branch with a merge commit, and integrate that exact commit through the reviewed branch chain into the repository's default branch. Confirm that the default branch contains the matching stable metadata. Create the stable CLI tag and publish its `latest` and major-minor image tags, if selected, through a separate maintainer gate. -- If BRAT validation fails, keep the release PR in draft and do not move published tags. Before preparing the next version, add a reviewed metadata-only commit to the selected base branch which records the published version in `versions.json` and moves its exact tagged release notes out of `## Unreleased`. Keep only changes made after that tag under `## Unreleased`. Compare the historical section with `git show :updates.md`; do not merge the failed release PR or describe it as validated. The next release PR can then rotate only the correction notes while preserving the immutable release history. -- Prepare and publish the next patch or pre-release version from that reconciled base. Leave the failed release PR draft until it is deliberately closed as superseded under a separate maintainer action. +- If BRAT validation fails, keep the release PR in draft and leave its published tag and artefacts unchanged. Prepare the correction on a new branch descended from that exact release commit, retaining its existing changes and `versions.json` entry. Prepare the next patch or pre-release version on that branch, with its own version, tag, and release PR. The selected base branch remains unchanged until a successor stable release passes validation and is promoted. +- For the successor stable release, consolidate all user-facing changes since the last stable release, including changes from intervening pre-releases which never became stable. Preserve each published pre-release's exact tagged notes in the appropriate history under `docs/releases/`, and compare the archived section with `git show :updates.md`. The new release notes must describe the whole stable upgrade, including the correction. +- After the successor stable release is validated and promoted, merge its exact release commit and ancestry through the reviewed branch chain. Leave the failed release PR in draft until it is deliberately closed as superseded under a separate maintainer action. - A hyphenated version is rejected unless `prerelease=true`. A stable version staged with `prerelease=true` is rejected unless `publish_cli=false`. ### Release Cheat Sheet @@ -403,7 +405,7 @@ For a fix needed only by the CLI, use [CLI-only patch releases](#cli-only-patch- 9. Validate the published release through BRAT, including start-up, ordinary bidirectional synchronisation, and any release-specific regression scenario. 10. After a hyphenated pre-release passes, keep its release PR unmerged, reconcile its `versions.json` entry and exact release-note section into the selected base branch as metadata only, then close the PR through a separate maintainer action. 11. After a stable version passes, remove the pre-release designation and make the exact release the latest stable release. Confirm that promotion, then mark the release PR ready, merge the exact release commit into the selected base branch, and integrate it through the reviewed branch chain into the repository's default branch. Confirm that the default branch contains the matching stable metadata, then publish stable CLI tags through a separate maintainer gate if selected. -12. If validation fails, leave the PR in draft and do not move the published tags. Reconcile the published version's `updates.md` section and `versions.json` entry into the base branch as metadata only, then prepare the next patch or pre-release version from the remaining `## Unreleased` entries. +12. If validation fails, leave the PR in draft and keep its published tag and artefacts unchanged. Start a new branch from that release commit, add the correction, and prepare the next patch or pre-release version. Retain the published version's `versions.json` entry and exact archived notes, and consolidate the successor stable release notes from the last stable release. Keep the base branch unchanged until the successor stable release is validated and promoted. ### CLI-only patch releases diff --git a/docs/releases/1.0-previews.md b/docs/releases/1.0-previews.md index 2ae2b583..bba8f0bb 100644 --- a/docs/releases/1.0-previews.md +++ b/docs/releases/1.0-previews.md @@ -1,9 +1,70 @@ # 1.0 preview release history -This document records the opt-in beta and release-candidate builds published before 1.0.0. Most users upgrading from 0.25.83 only need the consolidated [1.0.0 release notes](1.0.md#100). +This document records opt-in pre-release builds in the 1.0 release line. Consolidated notes for stable upgrades are available in the [current change log](../../updates.md) and the [1.0 release history](1.0.md). The prepared `1.0.0-rc.0` tag was not published as a plug-in release and is therefore omitted. +Version 1.0.41 was published for validation and remains a GitHub pre-release. Its changes and the subsequent start-up correction are consolidated in the [1.0.42 release notes](../../updates.md#1042). + +## 1.0.41 + +26th October, 2026 + +### Synchronisation + +#### New Feature + +- Rapid edits can produce fewer intermediate versions on other devices while LiveSync mode remains active. + - Enable **Batch database updates in LiveSync mode** to group successive local edits. + - Disabled by default; each synchronisation mode keeps its own choice. + - Updates reach other devices later. Batching does not detect template completion or prevent genuine concurrent-edit conflicts. +- CouchDB synchronisation no longer looks idle while it is comparing change history. + - A ⏩ icon and comparison count show activity before documents are transferred. + - This count represents history entries, not files remaining to synchronise. +- Status counts are easier to follow, with less movement as values change. + - CSS snippets can hide unwanted items or style individual `livesync-stat-` items, including inactive ones. + +#### Fixed + +- Recent Vault edits remain recoverable after an interrupted local database save. + - This includes edits whose modification times compare equal to the database copy, and pending Hidden File Sync and Customisation Sync changes. +- Manual synchronisation no longer starts before already accepted local changes finish saving to the database. + - Settings application also waits for those saves. Failed saves stay pending and report a failure. +- Text from third-party tools is handled more robustly. + - Characters split across Chunks no longer trigger false corruption warnings. +- Start-up integrity checks use less memory for healthy Vault files. (#1283) +- Start-up checks avoid false repair warnings for files that change during inspection. (#1283) + - This applies when the final size matches the database and there are no conflicts. + +### Customisation Sync + +#### Fixed + +- Applying a multi-file customisation no longer skips files after the list is refreshed. (#1271) +- Choosing **Automatic** now explains a missing Hidden File Sync prerequisite instead of proceeding into a failed initialisation. (#1270) + - Enable and initialise Hidden File Sync on this device first. The current mode is kept when the prerequisite is missing. +- Initialising a whole plug-in in **Automatic** mode no longer omits its selected **MAIN** or **DATA** files. + +### Setup tools + +#### Fixed + +- Setup URI generation can avoid shell-variable collisions and unintended use of the operating-system username. (#817, #1274) + - Use `LIVESYNC_HOST`, `LIVESYNC_USER`, `LIVESYNC_PASS`, `LIVESYNC_DB`, and `LIVESYNC_PASSPHRASE` for connection and encryption values. + - Existing scripts remain supported: the previous names are used when the corresponding prefixed value is unset or blank. + +### Miscellaneous + +- Dependencies have been updated, including security fixes. + +### Acknowledgements + +Thank you for your contributions! + +- @rwbru, for the original Setup URI environment-variable fix ([#817](https://github.com/vrtmrz/obsidian-livesync/pull/817)). +- @junkerderprovinz, for adapting that fix to the current generator while preserving compatibility with existing scripts ([#1274](https://github.com/vrtmrz/obsidian-livesync/pull/1274)). +- @s-qin, for reducing memory use during start-up checks and avoiding repeated content decoding in Commonlib ([#1283](https://github.com/vrtmrz/obsidian-livesync/pull/1283), [Commonlib #184](https://github.com/vrtmrz/livesync-commonlib/pull/184)). + ## 1.0.0-rc.1 27th July, 2026 diff --git a/manifest.json b/manifest.json index efe56799..e1929275 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-livesync", "name": "Self-hosted LiveSync", - "version": "1.0.41", + "version": "1.0.42", "minAppVersion": "1.7.2", "description": "Community implementation of self-hosted livesync. Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.", "author": "vorotamoroz", diff --git a/package-lock.json b/package-lock.json index 5393a72f..717ba6f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "obsidian-livesync", - "version": "1.0.41", + "version": "1.0.42", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "obsidian-livesync", - "version": "1.0.41", + "version": "1.0.42", "license": "MIT", "workspaces": [ "src/apps/cli", @@ -23,7 +23,7 @@ "@smithy/types": "^4.14.3", "@smithy/util-retry": "^4.4.5", "@vrtmrz/browser-ui-kit": "0.1.0", - "@vrtmrz/livesync-commonlib": "0.2.1", + "@vrtmrz/livesync-commonlib": "0.2.2", "@vrtmrz/obsidian-plugin-kit": "0.1.4", "@vrtmrz/ui-interactions": "0.1.2", "@vrtmrz/value-store": "0.1.0", @@ -4103,9 +4103,9 @@ } }, "node_modules/@vrtmrz/livesync-commonlib": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@vrtmrz/livesync-commonlib/-/livesync-commonlib-0.2.1.tgz", - "integrity": "sha512-fnQb2FcEG+NqIQX9KhTstea4B7C4VAL0g9ry5rp41qnJDuLaR5zfCz995L+l3Khyrp/9kcPw4VX5RUmV+8GVog==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@vrtmrz/livesync-commonlib/-/livesync-commonlib-0.2.2.tgz", + "integrity": "sha512-+nl4ntmRtUmSUuh9mOpicE0U/wpzhSPSQQXy9eg/2xdTBL58jkrQ6bQjbVKEhqUj0bUvg0ESjZm8YX/x+4zXiA==", "license": "MIT", "dependencies": { "@aws-crypto/sha256-js": "5.2.0", @@ -11369,7 +11369,7 @@ }, "src/apps/cli": { "name": "self-hosted-livesync-cli", - "version": "1.0.41-cli", + "version": "1.0.42-cli", "dependencies": { "chokidar": "^4.0.0", "minimatch": "^10.2.5", @@ -11394,7 +11394,7 @@ }, "src/apps/webapp": { "name": "livesync-webapp", - "version": "1.0.41-webapp", + "version": "1.0.42-webapp", "dependencies": { "octagonal-wheels": "^0.1.55" }, @@ -11406,7 +11406,7 @@ } }, "src/apps/webpeer": { - "version": "1.0.41-webpeer", + "version": "1.0.42-webpeer", "dependencies": { "octagonal-wheels": "^0.1.55" }, diff --git a/package.json b/package.json index 076bed16..84e21ce5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-livesync", - "version": "1.0.41", + "version": "1.0.42", "description": "Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.", "main": "main.js", "type": "module", @@ -204,7 +204,7 @@ "@smithy/types": "^4.14.3", "@smithy/util-retry": "^4.4.5", "@vrtmrz/browser-ui-kit": "0.1.0", - "@vrtmrz/livesync-commonlib": "0.2.1", + "@vrtmrz/livesync-commonlib": "0.2.2", "@vrtmrz/obsidian-plugin-kit": "0.1.4", "@vrtmrz/ui-interactions": "0.1.2", "@vrtmrz/value-store": "0.1.0", diff --git a/src/apps/cli/package.json b/src/apps/cli/package.json index 7f73f7f1..43e21f1c 100644 --- a/src/apps/cli/package.json +++ b/src/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "self-hosted-livesync-cli", "private": true, - "version": "1.0.41-cli", + "version": "1.0.42-cli", "main": "dist/index.cjs", "type": "module", "scripts": { diff --git a/src/apps/webapp/package.json b/src/apps/webapp/package.json index d0f4f5ce..ccda9b89 100644 --- a/src/apps/webapp/package.json +++ b/src/apps/webapp/package.json @@ -1,7 +1,7 @@ { "name": "livesync-webapp", "private": true, - "version": "1.0.41-webapp", + "version": "1.0.42-webapp", "type": "module", "description": "Browser-based Self-hosted LiveSync using FileSystem API", "scripts": { diff --git a/src/apps/webpeer/package.json b/src/apps/webpeer/package.json index c7654ed5..c9047af9 100644 --- a/src/apps/webpeer/package.json +++ b/src/apps/webpeer/package.json @@ -1,7 +1,7 @@ { "name": "webpeer", "private": true, - "version": "1.0.41-webpeer", + "version": "1.0.42-webpeer", "type": "module", "scripts": { "dev": "vite", diff --git a/updates.md b/updates.md index 55a40933..0516dada 100644 --- a/updates.md +++ b/updates.md @@ -12,16 +12,11 @@ Earlier releases remain available in the 1.0 release history, the 1.0 preview hi ## Unreleased -### Synchronisation +## 1.0.42 -#### Changed +27th October, 2026 -- Ordinary start-up can skip reading file content when the exact modification time, size, and recorded device-local provenance match a conflict-free revision, with no pending file processing. - - **Strict content check on startup** keeps full content comparisons enabled. The setting is disabled by default; an edit which preserves its exact size and modification time can go undetected by this start-up scan. Manual scans and explicit recovery operations remain strict. - -## 1.0.41 - -26th October, 2026 +Making content checks mandatory in the 1.0.41 pre-release came with a little too much overhead, so 1.0.42 makes them optional. This has turned into a slightly larger release. ### Synchronisation @@ -37,6 +32,11 @@ Earlier releases remain available in the 1.0 release history, the 1.0 preview hi - Status counts are easier to follow, with less movement as values change. - CSS snippets can hide unwanted items or style individual `livesync-stat-` items, including inactive ones. +- We can choose stricter content checks at start-up. + - Enable **Strict content check on startup** to compare file contents even when their modification times and sizes match the recorded local database state. This can increase start-up time in large Vaults. + - The setting is disabled by default. Ordinary start-up can skip content reads when the exact modification time, file size, and recorded database revision match, with no conflicts or pending file changes. + - While the setting is disabled, an edit which preserves its exact size and modification time can go undetected during start-up. Manual scans and explicit recovery operations remain strict. + #### Fixed - Recent Vault edits remain recoverable after an interrupted local database save. diff --git a/versions.json b/versions.json index a68f2a1a..8ad7a151 100644 --- a/versions.json +++ b/versions.json @@ -52,5 +52,6 @@ "1.0.38": "1.7.2", "1.0.39": "1.7.2", "1.0.40": "1.7.2", - "1.0.41": "1.7.2" + "1.0.41": "1.7.2", + "1.0.42": "1.7.2" }