Conversation
…ed conflicts merge when they can Resolving a Cloud conflict downloaded the content manifest of the whole vault before it would save one note, so on a vault with many attachments the decision could time out with nothing written. The server already checks the base revision and the destination path atomically, and a vault-wide download cannot strengthen that check. Save against the reviewed revision alone; for the other device's version or keep-both, check freshness from metadata and fetch only that file's retained bytes when the snapshot lacks them. Hosts without a revision reader keep the content-manifest path. The whole-vault sync that follows a decision used to own its outcome: a slow or failed run left the review open on a note that was already resolved and invited a second save. Retire the decision the moment the save succeeds, drop it from the queue, run the vault sync in the background, and report a failure as "Note saved. Remaining vault sync failed:" so the note is known to be safe. A resolver that has saved ignores further clicks. Settings adopts the shared summary when the later run replaces it. A queued content conflict that could not merge when it was found stayed queued until opened, even once the two sides had become a clean three-way merge. Reconsider those on every sync when the Cloud side is unchanged, all three paths agree, there is no draft, and the current local file merges cleanly; write and upload the result and clear the conflict. Overlaps, drafts, renames, paused paths and a file changing mid-write stay queued for the user. Identical files keep the stricter convergence check from 2.47.0. Claude-Session: https://claude.ai/code/session_01YK5tkUJtKXq3vh5mPmtcYT
Dispose native upload readers before reservation cleanup on failures and early responses. Keep Cloud settings aligned with shared sync progress, errors, and recovery without losing conflict drafts. Add real HTTP upload, retry, restart, and UI status regression coverage.
Respect Escape events already handled by CodeMirror before saving or hiding Quick Capture. Preserve the subsequent unhandled Escape action and explicit save shortcut. Cover Vim visual modes, insert mode, non-Vim selections, picker and completion dismissal, and save/close behavior.
…org set (#763) nixpkgs 26.05 deprecated the xorg package set in favour of the top-level names, which exist from 25.11 on. Each xorg package now emits an evaluation warning when instantiated, and package-desktop.nix uses 12 of them; with allowAliases = false the set is absent and the file fails to evaluate. This takes the same 12 libraries as top-level arguments instead. The resulting derivation is unchanged: same drvPath before and after on the flake's pinned nixpkgs. Requires nixpkgs >= 25.11; drops 25.05, which has no lowercase top-level libx11. That affects the copy-the-file route in packaging/nix/README.md and flake consumers that make zennotes follow a 25.05 nixpkgs; the flake's own lock is unaffected. 25.05 has been end-of-life since 2025-12-31.
Release notes and the social post for 2.48.0: the three Cloud conflict fixes, the upload stream and sync status fixes, Escape cancelling a Quick Capture selection (#765) and the Nix packaging update (#763). No demo clip was recorded for this release. Claude-Session: https://claude.ai/code/session_01Pa8u7FTkwZD3zZ5AoFxKC8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Release branch for ZenNotes 2.48.0: a follow-up to the 2.47.0 Cloud conflict work from Unyanda's reports, one Quick Capture fix, and a community Nix packaging update. No new features.
06dc99e0.06dc99e0.06dc99e0.55cafa08.edd55e03.xorgset (#763, blueagledev). Same derivation on the pinned nixpkgs; requires nixpkgs 25.11 or later. Commitba4ae683.Also on the branch: the release notes and post (
443c34cd) and thechore(release): 2.48.0version bump (71bafa15).Verification
cloud-sync-resolution.test.ts, the "safely merging queued conflicts" block incloud-sync-coordinator.test.ts,cloud-sync-upload-network.test.ts(real HTTP uploads of 8.1 MB and 10 MB with byte and hash checks, disconnects, timeouts, retries, restart recovery), resolver, Settings and status-store cases for a saved decision followed by a slow or failing sync, and the Quick Capture Escape cases inQuickCaptureApp.test.ts.apps/desktopbuild:prod(typecheck:node, typecheck:web, 749 tests, build, packaged CLI isolation) andelectron-builder --dir, Go vet and tests (-count=1), app-core suite (2,003 tests), shared-domain suite (1,593 tests), repo typecheck, web build, and the signed packaged app launched from an isolated profile reaching a CDP page target in 3.3 s.npm audit --omit=dev --audit-level=highpasses; the only remaining finding is a moderate, development-onlyvitestadvisory.ba4ae683.Docs
Release notes and post under
docs/releases/v2.48.0/; no in-app manual or website docs change was needed (bug fixes only). The website release page entry is prepared in the Laravel repo and is pushed with the release.https://claude.ai/code/session_01Pa8u7FTkwZD3zZ5AoFxKC8