Skip to content

1.3.0

Latest

Choose a tag to compare

@github-actions github-actions released this 09 Aug 09:57
7aff2d3

Release 1.3.0

Compare: 1.2.1...1.3.0 · 7 commits

This release is about two things: never touching a note while you are still typing in it, and making every setting findable. The plugin now refuses to write dates into any note that has unsaved changes in an open editor, which removes the "has been modified externally, merging changes automatically" popup and the text merge behind it for good. Alongside that, the settings tab was rebuilt on Obsidian's 1.13 declarative settings API, so every option shows up in Obsidian's global settings search. That rebuild is why this version requires Obsidian 1.13.0 or newer.

Highlights

  • A date update can never land in the text you are typing. Previously, if a note had unsaved changes in an open editor, the plugin still wrote its date properties, and Obsidian merged that write into your live text with a fuzzy three-way merge while showing the "modified externally" popup. Now every write path first checks every editor showing the note: automatic updates wait until you save, the last-opened stamp is dropped for that opening, and bulk operations skip the note and list it with a reason.
  • Every setting is findable through Obsidian's search. The settings tab was migrated to Obsidian's 1.13 declarative settings API, so typing "timezone" or "cache" into Obsidian's global settings search now finds this plugin's options. Ignored properties use Obsidian's native list control, and the skip rules and advanced options each get their own sub-page instead of being buried in a collapsible block.
  • Now requires Obsidian 1.13.0 or newer. The declarative settings API only exists from 1.13. If you are still on Obsidian 1.11 or 1.12 nothing breaks: Obsidian keeps serving you 1.2.1, which stays fully functional, and you simply stop receiving plugin updates until you update Obsidian.

✨ New

  • Settings search, sub-pages, and a native ignored-properties list - the settings tab is now built with Obsidian's 1.13 declarative settings API, so every single option is indexed by Obsidian's global settings search and reachable without knowing which section it lives in. "Files and folders to skip" and "Advanced" (new file delay, cache options, post-update command) became proper sub-pages with a back button, and the skip page shows a live rule count. Ignored properties moved from custom chips to Obsidian's native list control, with its own "Ignored properties" heading, a per-row delete button, and an empty-state line when the list is empty. "New file delay" and "Maximum cache entries" are real number fields now rather than free text. (31884fa, fb3411e)
  • Bulk operations report the notes they left untouched - when a bulk run reaches a note that has unsaved changes in an open editor, it skips that note instead of writing into it, and lists it after the run in its own "File | Reason" table with a Download button, styled distinctly from the failure table because a skip is not an error. The reason line tells you exactly what to do: save or close the note, then run a new preview. Skipped notes are deliberately never written later in the background - the preview you approved is a snapshot, and a silent late write would break that promise. (7df2799)

🐛 Fixed

  • Date writes were merged into notes with unsaved changes, popping "modified externally" - if a note was open with unsaved edits, the plugin wrote its date properties anyway. Obsidian's editor reacts to a write of its own file by running a fuzzy three-way merge into your live buffer and showing "<file>" has been modified externally, merging changes automatically. Worst case: that merge is a text-level patch against the text you are actively typing, so it could disturb content beyond the date properties. The 1.2.1 mitigation pinned the file's creation and modification times on the write, but the merge branch is decided purely by the editor's internal unsaved-changes flag and never looks at those times, so the pin could not prevent it - confirmed against the decompiled Obsidian 1.12.7 and 1.13.6 bundles and reproduced on a real Obsidian. Every write path is now gated on a clean editor buffer instead: automatic updates defer and land on their own once the note is saved (Obsidian autosaves a couple of seconds after you stop typing), the last-opened stamp is dropped for that opening rather than written late, and bulk runs skip the note. The check covers every open pane showing the note, not just the first, and fails safe: if it cannot prove the buffer is clean, it does not write. (7df2799)
  • A date update could be silently reverted by the open editor - in 1.2.1, a re-stamp that changed the value but not the number of bytes (the normal case for the default fixed-width format) combined with the pinned modification time produced no change event at all, so the open editor never learned about the write and its next save wrote the old text back over it. On disk the date silently went back to its previous value. Removing the pin ends this. (7df2799)
  • The "out-of-order dates were fixed" notice could appear when nothing was written - the notice fired while the plugin was still deciding what to write, so a pass that was deferred or that failed still announced a fix that never happened. It is now shown only after a write that actually succeeded. (7df2799)

🗑️ Removed

  • The frozen modification time on writes into an open note - 1.2.1 pinned a note's creation and modification times whenever the plugin wrote to a note open in an editor, on the theory that this stopped Obsidian reloading the note mid-typing. That theory was verified false against Obsidian's own code, and the pin actively caused the silent revert described above. No write path pins timestamps any more. Two visible consequences: the updated value in the live Properties view refreshes immediately instead of catching up on your next edit, and with last-opened dates turned on, opening a note now moves its modification time on disk. (7df2799)

💅 UX & polish

  • Invalid settings input now shows an inline error instead of being quietly dropped - an empty property name, a counter property name that collides with one of your date property names (checked in both directions), an unknown timezone name, and a negative number in the delay or cache-size fields all surface a message right under the field. Previously such input was silently ignored, leaving you unsure whether the setting had taken effect. (31884fa)

🧰 Internal & maintenance

No action needed by users; listed for completeness.

  • Closed all 8 open Dependabot alerts (1 critical, 7 high) in js-yaml, brace-expansion, fast-uri, ip-address, postcss, undici, tar, and nanoid. Every one of them was a transitive development dependency of the build, lint, test, and e2e toolchains - none ship in the plugin bundle, so users were never exposed. npm audit is clean again. (2be9d39)
  • Bumped js-sha256 from 0.11.1 to 1.0.0. (15becf4, 9634059)
  • Destructive Run buttons use the 1.13 setDestructive() API; setWarning() is deprecated. (31884fa)
  • New e2e coverage for the unsaved-buffer guard against real Obsidian (11 scenarios, 9 of which failed on 1.2.1), plus a large unit-test suite for the declarative settings tree. (7df2799, 31884fa)
  • CI now type-checks the e2e specs and page objects, so they cannot rot between the manual e2e runs; the ESLint config moved off the deprecated typescript-eslint wrapper to defineConfig and make lint is warning-free again. (fb3411e)
  • e2e is pinned to Obsidian 1.13.4, the obsidian types to ~1.13.1; new translation keys were added across all 21 locales and the store screenshots were regenerated. (31884fa, fb3411e)

Full changelog: 1.2.1...1.3.0