Skip to content

0.65.0

Choose a tag to compare

@github-actions github-actions released this 02 Sep 07:58
· 9 commits to main since this release

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 .something can 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 ![alt](url) image loads only over http(s); other schemes
    render as the file chip.
  • The plaintext token fallback is cleared from data.json whenever 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; _source is
    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.