Repository navigation
0.65.0
0.65.0
A whole-codebase audit — security, correctness and performance — with every
high-confidence finding fixed. No new features; a large number of things that
were wrong, slow, or lossy in ways you might have noticed only occasionally.
Data safety
- Undo no longer gets overwritten. Undoing after typing (and search-and-
replace, the date picker, removing a chip, advancing a recurring item,
pasting several lines) could be silently undone again by the save that
fires as the row leaves the screen. Rows and notes now save on that blur
only when they hold unsaved typing. - A document titled
..or.somethingcan no longer escape or vanish.
Every title that becomes a folder or file name goes through one sanitiser
that refuses./.., strips leading dots (Obsidian hides dot-entries) and
trailing dots/spaces. Item slugs starting with a dot produced files that
disappeared on reload; they don't any more. - Restore refuses unsafe archives. A backup zip containing
../paths is
rejected before anything is written — nothing lands outside the restore
folder, and no empty folder is left behind. - Frontmatter survives Windows line endings and a block that ends exactly
at---with no trailing newline; both used to be wiped on the next save. - Duplicated or moved items keep their checkbox, and mirrors stay mirrors
(they became "checked with no checkbox" and blank items respectively). - Overlapping saves on one row are serialised, so a debounced save and an
immediate one can't race through the rename-on-first-save path. - A remembered
image loads only over http(s); other schemes
render as the file chip. - The plaintext token fallback is cleared from
data.jsonwhenever the
keychain holds a token.
Dynalist import and update
- "Update selected documents" and "Retry failed documents" no longer mark
every document you did not pick as removed. Only a whole-account update
can say a document is gone, and shared documents aren't marked when "import
shared" is off. - Resuming after a crash no longer duplicates the document it crashed in.
The manifest carries its Dynalist id before any item is written, and a
resume replaces the half-written copy (moved to the Obsidian trash) instead
of creating "Title 2" beside it. - Cancelling before the slow documents were revisited records them as
failures so "Retry failed documents" can pick them up; they used to appear
nowhere. - A document that comes back is un-marked at the document level, as its
items already were. - A no-op update writes nothing. Every matched item used to be rewritten
twice whether or not anything changed — ~130,000 file operations for a
44,000-item account that hadn't moved. - A Dynalist folder named like a reserved folder (
_trash,_archive, …)
gets a suffix instead of swallowing every document inside it;_sourceis
now reserved so the raw-JSON archive never shows up as a group. - A run imported by a build that didn't write Dynalist item ids is refused
for in-place update with a clear reason, rather than having every item
appended a second time. - A truncated progress file no longer throws at startup.
Speed, especially at 44,000 items
- The document list is cached and only re-read when a folder or manifest
under the root actually changes. Every panel, pane, agenda, search and
reminder tick used to re-read every manifest from disk on every file event
— including the file events from your own typing. - Reminders no longer scan the whole collection every minute and on every
window focus; the due list is cached and refreshed on relevant changes. - Deleting a row is instant again in vaults without mirrors: the "are
there any mirrors" answer used to be thrown away on every keystroke. - Opening a document reads its files in parallel batches; the tree rebuild
memoises depth; merging a row rebuilds once instead of once per child. - Mirror sources are re-read only when something outside the document
changed, not on every collapse, selection or drop. - Dragging near the bottom of a long document no longer does a full DOM scan
per row per mouse move. - Rendered notes' embeds and code-block processors are released on the next
render instead of accumulating for the life of the tab. - Undo depth scales with document size so a huge import doesn't hold
millions of snapshot objects. - In-document search filters after a short pause; last-focus and search-query
bookkeeping is coalesced into one settings write per second. - The link audit loads each document once (every mirror re-loaded its source);
[[suggestions use an O(1) lookup for vault files and a longer cache.
Editing
- The zoomed-in head row behaves. Enter on it creates its first child
(it made a sibling outside the zoom and lost the caret); Tab, outdent and
Alt+Arrow are no-ops on it. - A note edited in the focused row can be clicked back into editing after it
loses focus. - "Delete checked items" from the item menu scopes to that item's subtree, as
its label says. - Mod+Enter on a plain item, then Undo, no longer leaves a checkbox behind.
- Moving a selection that's already at the top or bottom does nothing instead
of reversing it. - Documents open in a tab reload when something writes to them from outside
— capture to inbox, the orphan fix, a Dynalist update, a trash restore. The
view used to keep painting (and could save over) its stale in-memory copy. - Opening a bookmark applies it to the bookmark's document, not whichever tab
happened to be active. - Zooming via the title crumb, the bullet or the command records history so
Back works from all three; "Reveal folder" in the load-error box no longer
opens a blank tab; the[[popover closes with its tab; filtered numbered
rows show real numbers instead of "0.".
Smaller fixes
- A reserved document title from the new-document prompt shows the error
instead of silently doing nothing. - The global search modal and page re-run when the query moved on during a
search, instead of showing results for an older query. - "Customise this menu" no longer pops a stray menu behind the dialog.
- Attachments: "also remove the link" works for short-form
![[photo.png]]
embeds; a bare[[wikilink]]to a note you haven't written yet is no longer
listed as a missing attachment. - OPML export keeps a note's line breaks; a mirror nested inside a mirrored
subtree exports as a labelled line rather than a blank bullet. - Converting a folder that contains its own backup location no longer
descends into the backup it is creating; depth stamping reads the files it
just wrote rather than a stale cache. - A manifest missing its title no longer blanks the whole panel.
- The root-folder setting is normalised (a trailing slash used to stop the
panels refreshing), pane timers are cleared on close, and two startup
timers are registered with the plugin.