Skip to content

Release v2.47.0: drawings keep their own file, wikilinks at files are files, Cloud conflicts keep tasks visible and matching files converge - #752

Merged
adibhanna merged 8 commits into
mainfrom
v2.47.0
Sep 9, 2026
Merged

adibhanna merged 8 commits into
mainfrom
v2.47.0

Conversation

@adibhanna

@adibhanna adibhanna commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Release branch for ZenNotes 2.47.0: two community bug fixes and the two Cloud conflict fixes from Unyanda's September 8 report.

  • Switching between drawings no longer overwrites the one you open (#755, gverger). The drawing editor kept one latest scene and wrote it, after its save delay, to whichever drawing was showing. On a local vault the next drawing loads within a millisecond, so the previous canvas survived the switch and reported the old scene under the new path. Each drawing now saves through its own session bound to its path, the canvas is remounted per path, and a canvas being torn down cannot arm a write against its replacement. Commit 29c5287.
  • A wikilink at a file in the vault is a file, not a missing note (#757, uNyanda). The Connections panel offered to create assets/diagram.png.md for an embedded image; gd, rendered-wikilink clicks and Cmd-click had the same gap. Wikilinks now resolve against the vault's files with the rules that render the embed, the panel lists a match as a file row that opens the asset tab, and all three followers share one step before offering to create anything. Commit bee2284.
  • A conflicted note keeps its tasks in view. List, Calendar, Kanban and the calendar panel keep showing the local note's tasks with a Conflict pending label until the note is resolved. Commit 835fea1.
  • Identical files stop waiting for a decision. When the current local file and the latest tracked Cloud version agree, the conflict clears on the next sync without rewriting either copy; real differences, structural conflicts and unfinished merge drafts still need review, and drafts stay protected across desktop windows. Commits dfb8ebd, 0c448cf.

Also on the branch: the merge of main carrying the js-yaml and svgo advisory bumps from #753, the release notes and post, and the chore(release): 2.47.0 version bump.

Verification

  • Bug: switching to another drawing overwrites it #755 and Connections Panel Treats Asset Files as Unresolved Wikilinks #757 reproduced in the previous built desktop app over CDP, then re-run on the fixed build: drawing switches went from 4 of 6 (seeded files) and 3 of 3 (real mouse drags) corrupted runs to 0; the Connections row went from CREATE with a .md suggestion to FILE opening the asset tab, and gd from the create prompt to the image tab.
  • Cloud fixes driven in the built desktop UI against the local Cloud fixture: task visibility, conflict convergence, subsequent upload, draft retention, restart and two-window review ownership.
  • Release gates run fresh at the cut: apps/desktop build:prod (typecheck, tests, build, packaged CLI isolation), Go vet and tests, app-core suite (1,980 tests), repo typecheck, npm run pack and the signed packaged app reaching a CDP page target in about 3 s from an isolated profile, website suite (691 tests) with the release page entry.
  • npm audit --omit=dev --audit-level=high passes after Chore(deps): js-yaml 3.15.2 / 4.3.2 and svgo 3.3.5 (today's advisories) #753; one moderate hono finding remains and predates this release.

Docs

In-app manual and website docs updated for the Connections panel change; release notes, post and before/after stills under docs/releases/v2.47.0/; website release page entry prepared in the Laravel repo, pushed with the release.

A pending note was removed from every task surface, hiding work until the sync decision was made. Keep its local tasks available in List, Calendar and Kanban, label them Conflict pending, and refresh them when a resolution changes the note.
Flush the latest review edits before a sync can change conflict state. Coordinate every workspace window outside the vault lock, share completed sync results, and give each conflict one active reviewer so windows cannot replace each other’s drafts.

Save failures, changing windows and preparation timeouts pause the run safely. Matching review ownership prevents a stale cleanup from releasing a newer review.
A note could remain paused after both devices held identical content. After pulling current Cloud state and scanning the local vault, clear only content conflicts whose exact path, identity, revision, kind, digest and size agree.

Keep real differences, structural conflicts and unfinished merge drafts for review. Agreement removes only conflict metadata and lets the next edit upload against the current revision; it never rewrites either copy.
…open

Opening a second drawing could replace its file with the scene of the drawing just left, and switching back and forth left both files holding the same scene (#755). The editor kept one latest scene and wrote it, after its save delay, to whichever path the view showed when the delay ran out.

Excalidraw reads initialData once at mount and reports its scene from componentDidUpdate on every render. On a local vault the next drawing's read answers within a millisecond, so React folds the placeholder render and the next drawing's render into one update and the previous canvas is never torn down. That canvas then reports the old scene under the new path, and 700 ms later the old scene overwrites the file that was just opened.

Bind every scene, its debounce and its last-saved dedupe to the path the scene was read from, key the canvas by path so a switch always remounts it, and close a session the view leaves so a late report from the canvas being torn down cannot arm a write. The per-drawing viewport memory follows the same binding. Nothing else about saving changes: a switch still flushes the drawing being left, and a read that fails still opens an empty canvas as before.

Verified in the built desktop app over CDP with real mouse drags: the reported flow corrupted 3 of 3 runs before and 0 of 3 after, and switching between seeded files went from 4 of 6 to 0 of 6. Unit tests model the batched read and the late report; both fail on the previous view.
…g note

The Connections panel listed an embedded image such as `![[assets/diagram.png]]` under Links From Here as an unresolved wikilink and offered to create `assets/diagram.png.md` for it (#757). The panel asked only the note index whether a target resolved, and an image is not a note. The same gap existed wherever a wikilink is followed: the Vim gd action, a click on a rendered wikilink and Cmd-click each ran their own resolution chain and each fell through to the create offer.

Resolve a wikilink against the vault's files with the rules that already render the embed (relative to the note, relative to the vault root, then a unique file name), now in a store-free module the panel and the followers share. The panel lists a match as a file row that opens the file in its own tab and offers to create a note only for a wikilink nothing answers; Enter on the row goes through VimNav like the other rows. The three followers run one shared step before offering to create anything. PDFs keep the gd behaviour of pinning into the reference pane, and a file-like name no asset answers stays a missing wikilink.

Verified in the built desktop app over CDP: the panel row went from a create offer for `/assets/diagram.png.md` to a file row that opens the asset tab, and gd inside the wikilink went from the create prompt to the image tab. The classifier and the follow-link path have unit tests.
@adibhanna adibhanna changed the title Release v2.47.0: Cloud conflict task visibility and recovery Release v2.47.0: drawings keep their own file, wikilinks at files are files, Cloud conflicts keep tasks visible and matching files converge Sep 9, 2026
@adibhanna
adibhanna merged commit ce7acb9 into main Sep 9, 2026
6 checks passed
@adibhanna
adibhanna deleted the v2.47.0 branch September 9, 2026 16:12
@adibhanna
adibhanna restored the v2.47.0 branch September 9, 2026 16:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant