• 0.18.0 15f6bfafeb

    0.18.0 Stable

    jkaindl released this 2026-07-29 21:32:15 +00:00 | 0 commits to main since this release

    Changed

    • Index-Format: Der Sync-Index ist jetzt EINE Container-Datei _vaultrag/index.bin
      (vorher drei: notes.i8/paths.json/manifest.json). Obsidian Sync kann damit keine
      inkonsistenten Mischzustände aus zwei Generationen mehr erzeugen — die Wurzel der
      wiederkehrenden Index-Beschädigung (Vorfälle 19.07./22.07.) ist beseitigt, nicht nur erkannt.
      Bestehende Indizes werden beim ersten Start automatisch und verlustfrei migriert.
      Mixed-Version-Hinweis: Ein Gerät, das noch eine ältere Plugin-Version läuft, zeigt bis
      zu seinem Update „kein Index" an (kein Datenverlust — Notizen sind unberührt).

    Added

    • Automatische Wiederherstellung: Ist der Index beim Laden beschädigt (z. B. halber
      Sync-Download), stellt das Plugin ihn selbstständig aus dem neuesten per Prüfsumme
      verifizierten geräte-lokalen Backup wieder her und ergänzt fehlende Notizen per
      Delta-Reindex — sofern der Embedding-Endpoint erreichbar ist. Sonst wie bisher:
      Schreibschutz + Meldung.
    Downloads
  • 0.17.4 74c41d277b

    0.17.4 Stable

    jkaindl released this 2026-07-28 12:43:16 +00:00 | 19 commits to main since this release

    Fixed

    • The confirmation dialog no longer calls the deprecated setWarning(). The dialog was moved to
      the shared kit's confirmAction in the previous cycle, and that vendored copy reintroduced the very
      API the community-store review had flagged for 0.16.0 — invisible locally, because eslint exits 0
      on warnings. Fixed at the root in obsidian-kit 0.17.1 (applyDestructive, re-vendored here): the
      button is marked destructive through a runtime check — setDestructive() where Obsidian provides it
      (1.13+), otherwise the native mod-warning class. Calling either one unconditionally is wrong;
      setDestructive() does not exist on the supported floor of 1.12.7.

    Changed

    • npm run lint now fails on warnings (--max-warnings 0). ESLint exits 0 on warnings, so the
      local gate reported green while the store scan — which is the same eslint-plugin-obsidianmd
      reported findings. The very first run under the hardened gate caught the setWarning() regression
      above.

    Documentation

    • README updated to describe the plugin as it actually works. It still documented four separate
      ribbon icons for related notes, search, chat and Smart Apply; those were consolidated into a single
      sidebar hub with tabs back in 0.8.0. Also corrected: the supported Obsidian version (1.12.7, not
      1.13), the default chat port (1234, not 8080), and the claim that the embedding index has to come
      from an external backend — the plugin builds it itself. Added a command reference and the index
      robustness features (persist guards, rotating backups, self-heal), which were undocumented.
    Downloads
  • 0.17.3 124d954f44

    0.17.3 Stable

    jkaindl released this 2026-07-24 18:06:18 +00:00 | 27 commits to main since this release

    Changed

    • node:http for the MCP server now loads via a Platform.isDesktop-guarded dynamic import(),
      clearing the last no-nodejs-modules store-scorecard warning that 0.17.2's static import had
      traded the require() warning for. This is the only source form that passes both obsidianmd
      store-scan rules (no-nodejs-modules accepts a guarded dynamic import; no-require-imports sees no
      require). To keep the guarded import from breaking in Electron (esbuild leaves a bare
      import("node:…") untransformed, which Electron resolves as a network fetch), an esbuild plugin
      rewrites node: dynamic imports to a require() shim in the bundle — source stays scan-clean,
      bundle stays runtime-safe (identical to the require() path that shipped in 0.17.0). The local lint
      now runs both rules sharp with no per-file override, so npm run lint matches the store scanner.
    Downloads
  • 0.17.2 ca86bf9a06

    0.17.2 Stable

    jkaindl released this 2026-07-24 17:38:54 +00:00 | 31 commits to main since this release

    Changed

    • node:http for the in-plugin MCP server is now a static import instead of a require().
      This clears the last require() style import is forbidden store-scorecard warning. Runtime is
      unchanged: esbuild places the import inside its __esm() lazy-init wrapper (require("node:http")
      inside init_http_server), so it still runs only when main.ts calls
      await import("./mcp/http_server") behind the Platform.isMobile guard — never at plugin load,
      never on mobile. obsidianmd/no-nodejs-modules is disabled for this one file, since its mobile
      safety is guaranteed structurally via main.ts rather than by the lint rule.
    Downloads
  • 0.17.1 a775061967

    0.17.1 Stable

    jkaindl released this 2026-07-24 17:07:56 +00:00 | 35 commits to main since this release

    Changed

    • MCP read-guard now uses the Obsidian vault API instead of node:fs/realpath. The
      desktop-only symlink-escape guard is replaced by a whitelist check
      (vault.getAbstractFileByPath(normalizePath(path)) instanceof TFile) — pure Obsidian API, no
      Node built-in. This removes the Direct Filesystem Access store-scorecard warning and drops
      node:fs/promises and node:path from the source entirely (require() usage reduced from three
      sites to one; node:http for the in-plugin MCP server necessarily stays a Platform.isDesktop-
      guarded require(), as the official lint rule mandates it while the scan flags it — a
      documented contradiction in Obsidian's own tooling).

    Security

    • read_note over MCP no longer reads deleted notes (.trash/…) or any path Obsidian does not
      list as a vault file. The new guard is stricter against path-traversal (only real vault files
      pass). Trade-off: an in-vault symlink pointing outside the vault — which Obsidian itself follows —
      is no longer specifically blocked (parity with Obsidian and comparable plugins); the MCP server
      remains token-authenticated and bound to 127.0.0.1.
    Downloads
  • 0.17.0 b0a0beb0d1

    0.17.0 Stable

    jkaindl released this 2026-07-23 13:28:10 +00:00 | 40 commits to main since this release

    Changed

    • Settings tab migrated to Obsidian 1.13's declarative getSettingDefinitions() API. Simple rows
      (sliders, toggles, dropdowns, the template-folder picker, the system-prompt textarea) are now
      declarative controls and therefore appear in Obsidian's global settings search on 1.13+. Dynamic
      rows (endpoint lists, model probing, the live embedding-status poll, model details/capabilities, the
      MCP section, the model-coupled context-budget slider) run through imperative render-hatches. The
      seven sections are no longer collapsible — the global search replaces collapsing.
    • Lowered minAppVersion back to 1.12.7 and made the tab dual-track. On Obsidian ≥1.13 the tab
      renders declaratively and searchably; on ≤1.12 a display() fallback renders the same
      getSettingDefinitions() structure imperatively (one source of truth). Every 1.13-only API
      (SettingTab.update, ButtonComponent.setDestructive) is feature-detected at runtime, so the build
      is lint-clean under 1.12.7 without deprecated-API use. This reverses the 0.16.1 bump to 1.13.0, which
      — because 1.13 is currently only a Catalyst preview — effectively withheld updates from most users.

    Fixed

    • Index-corruption notices now clearly name the embedding/search index and state that your notes
      are unaffected, instead of the ambiguous "vault-rag: Index" that read like the Obsidian vault index.
    Downloads
  • 0.16.1 49aee02d8c

    0.16.1 Stable

    jkaindl released this 2026-07-20 12:31:47 +00:00 | 64 commits to main since this release

    Changed

    • Bumped minAppVersion to 1.13.0. Installations on Obsidian below 1.13 will no longer receive
      updates. Reason: setDestructive() — used for the three destructive-action buttons below — only
      exists from 1.13 onward.
    • Cleared the remaining Obsidian community-store review warnings: createSpan(…) instead of
      createEl("span", …) at 7 call sites, and setDestructive() instead of the deprecated
      setWarning() at 3 call sites (reindex, MCP token regeneration, backup restore).
    • Removed every node: import flagged by the store review's no-nodejs-modules lint. Node
      operations are now injected into the read-guard instead of imported at module top level, desktop-
      only code paths load Node built-ins via await import(…) inside Platform.isDesktop checks
      or with early platform guards instead of static imports or require, and the node:http type
      import was replaced with local structural interfaces. npm run lint now reports zero
      no-nodejs-modules occurrences.
    • The MCP server now throws explicitly when started outside a desktop platform, instead of relying
      solely on its caller's guard.

    Not changed

    Four points the store review flags are properties of the plugin or its dependencies, not bugs, and
    were left as-is:

    • Direct Filesystem Accessfs.realpath in the MCP server's symlink-escape guard; desktop-only
      and scoped to that one check.
    • Vault Enumeration — the core function of a retrieval plugin.
    • Clipboard Access — write-only (writeText), always user-initiated; the clipboard is never read.
    • Dynamic Code Executionnew Function comes from ajv, pulled in via
      @modelcontextprotocol/sdk; not code of this plugin.

    Also out of scope for this slice: getSettingDefinitions() (the declarative settings search
    available from Obsidian 1.13) and the display() deprecation it would resolve — both are reserved
    for a separate slice.

    Downloads
  • 0.16.0 091a44d0b9

    0.16.0 Stable

    jkaindl released this 2026-07-20 07:53:53 +00:00 | 83 commits to main since this release

    Added

    • Reformat a selection. A new "Abschnitt umformatieren" command (and editor context-menu
      entry) turns a selected block into a different shape: mechanical transforms (table ↔
      columns/rows transpose, table → bullet list, wrap in callout) apply instantly with no LLM
      round-trip, while shape-changing ones (→ list, → prose, → table, → Mermaid diagram, or a free-
      text instruction) stream a preview from your local chat LLM that you review before applying.
    • Reformat sidebar tab. The transforms are now launchable from a "Umformatieren" tab in the
      Vault Retrieval sidebar, grouped by effect (instant/offline vs. preview/LLM). Buttons are
      disabled with a plain-language reason when there is nothing to act on.
    • Model dropdown for Smart Apply. The Smart Apply model is picked from the endpoint's model
      list instead of typed by hand, with an explicit "use chat model" option.
    • Waiting state in the reformat preview. Until the first token arrives, the result area shows
      a running seconds counter, so a cold model start is distinguishable from a hang; after five
      seconds it adds a hint that the first call may still be loading the model. It deliberately does
      not claim the model is loading — the endpoint does not tell us whether it is loading or just
      thinking.

    Fixed

    • "Abschnitt umformatieren" no longer disappears from the command palette. It used
      editorCallback, which Obsidian hides whenever no editor is focused — reading mode, or focus in
      the sidebar. It is now always listed and explains why it cannot run.
    • Replacements are guarded against a stale selection. If the text at the captured position
      changed between selecting and applying, nothing is written and a notice explains why.
    Downloads
  • 0.15.2 16d62edd20

    0.15.2 Stable

    jkaindl released this 2026-07-19 12:03:02 +00:00 | 125 commits to main since this release

    Fixed

    • Device-local index backups no longer accumulate indefinitely. A backup snapshot could
      race against a concurrent live index write and leave an incomplete, empty folder behind
      instead of a real backup — and since rotation only ran after a successful copy, each failed
      attempt left another orphan. A real vault had accumulated 1127 backup folders instead of the
      intended 3 (1124 of them empty). Snapshots are now serialized against live index writes, and
      an incomplete copy is discarded immediately instead of left behind.
    • The shared index could get wiped out after using a second device (e.g. iPhone). The
      live-persist safety guard checked a cached in-memory note count instead of the actual index
      on disk. If the plugin started before Obsidian Sync finished delivering the shared index, a
      subsequent edit could overwrite the real, larger index with a tiny one — which then
      propagated the loss to every synced device. The guard now reads the real index from disk
      immediately before every live write.
    Downloads
  • 0.15.1 68161d56c7

    0.15.1 Stable

    jkaindl released this 2026-07-14 21:20:28 +00:00 | 126 commits to main since this release

    Fixed

    • Empty notes no longer count as a permanent index deficit. Notes with no embeddable
      content (empty or frontmatter-only, e.g. folder notes) can never be indexed — but the
      index-state delta counted them as missing forever, and "complete the index" reported a
      confusing "0 notes added" while the button stayed enabled. The delta now excludes them
      (with an explicit "N empty notes ignored" hint), the self-heal reports honestly
      ("X added · Y empty skipped · Z failed"), and the auto-heal prompt on load only fires
      for genuinely embeddable gaps. The heal progress popup counts only real embedding work
      (e.g. "1/1" instead of "119/179"). Live edits keep the classification current: emptying
      a note moves it out of the tally, filling it moves it back in.
    Downloads