-
0.18.0 Stable
released this
2026-07-29 21:32:15 +00:00 | 0 commits to main since this releaseChanged
- 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Index-Format: Der Sync-Index ist jetzt EINE Container-Datei
-
0.17.4 Stable
released this
2026-07-28 12:43:16 +00:00 | 19 commits to main since this releaseFixed
- The confirmation dialog no longer calls the deprecated
setWarning(). The dialog was moved to
the shared kit'sconfirmActionin the previous cycle, and that vendored copy reintroduced the very
API the community-store review had flagged for 0.16.0 — invisible locally, becauseeslintexits 0
on warnings. Fixed at the root inobsidian-kit0.17.1 (applyDestructive, re-vendored here): the
button is marked destructive through a runtime check —setDestructive()where Obsidian provides it
(1.13+), otherwise the nativemod-warningclass. Calling either one unconditionally is wrong;
setDestructive()does not exist on the supported floor of 1.12.7.
Changed
npm run lintnow fails on warnings (--max-warnings 0). ESLint exits 0 on warnings, so the
local gate reported green while the store scan — which is the sameeslint-plugin-obsidianmd—
reported findings. The very first run under the hardened gate caught thesetWarning()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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- The confirmation dialog no longer calls the deprecated
-
0.17.3 Stable
released this
2026-07-24 18:06:18 +00:00 | 27 commits to main since this releaseChanged
node:httpfor the MCP server now loads via aPlatform.isDesktop-guarded dynamicimport(),
clearing the lastno-nodejs-modulesstore-scorecard warning that 0.17.2's static import had
traded therequire()warning for. This is the only source form that passes both obsidianmd
store-scan rules (no-nodejs-modulesaccepts a guarded dynamic import;no-require-importssees 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
rewritesnode:dynamic imports to arequire()shim in the bundle — source stays scan-clean,
bundle stays runtime-safe (identical to therequire()path that shipped in 0.17.0). The local lint
now runs both rules sharp with no per-file override, sonpm run lintmatches the store scanner.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
0.17.2 Stable
released this
2026-07-24 17:38:54 +00:00 | 31 commits to main since this releaseChanged
node:httpfor the in-plugin MCP server is now a staticimportinstead of arequire().
This clears the lastrequire()style import is forbidden store-scorecard warning. Runtime is
unchanged: esbuild places the import inside its__esm()lazy-init wrapper (require("node:http")
insideinit_http_server), so it still runs only whenmain.tscalls
await import("./mcp/http_server")behind thePlatform.isMobileguard — never at plugin load,
never on mobile.obsidianmd/no-nodejs-modulesis disabled for this one file, since its mobile
safety is guaranteed structurally viamain.tsrather than by the lint rule.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
0.17.1 Stable
released this
2026-07-24 17:07:56 +00:00 | 35 commits to main since this releaseChanged
- 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/promisesandnode:pathfrom the source entirely (require()usage reduced from three
sites to one;node:httpfor the in-plugin MCP server necessarily stays aPlatform.isDesktop-
guardedrequire(), as the official lint rule mandates it while the scan flags it — a
documented contradiction in Obsidian's own tooling).
Security
read_noteover 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 to127.0.0.1.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- MCP read-guard now uses the Obsidian vault API instead of
-
0.17.0 Stable
released this
2026-07-23 13:28:10 +00:00 | 40 commits to main since this releaseChanged
- 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
minAppVersionback to 1.12.7 and made the tab dual-track. On Obsidian ≥1.13 the tab
renders declaratively and searchably; on ≤1.12 adisplay()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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Settings tab migrated to Obsidian 1.13's declarative
-
0.16.1 Stable
released this
2026-07-20 12:31:47 +00:00 | 64 commits to main since this releaseChanged
- Bumped
minAppVersionto 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, andsetDestructive()instead of the deprecated
setWarning()at 3 call sites (reindex, MCP token regeneration, backup restore). - Removed every
node:import flagged by the store review'sno-nodejs-moduleslint. Node
operations are now injected into the read-guard instead of imported at module top level, desktop-
only code paths load Node built-ins viaawait import(…)insidePlatform.isDesktopchecks
or with early platform guards instead of static imports orrequire, and thenode:httptype
import was replaced with local structural interfaces.npm run lintnow reports zero
no-nodejs-modulesoccurrences. - 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 Access —
fs.realpathin 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 Execution —
new Functioncomes fromajv, 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 thedisplay()deprecation it would resolve — both are reserved
for a separate slice.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Bumped
-
0.16.0 Stable
released this
2026-07-20 07:53:53 +00:00 | 83 commits to main since this releaseAdded
- 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Reformat a selection. A new "Abschnitt umformatieren" command (and editor context-menu
-
0.15.2 Stable
released this
2026-07-19 12:03:02 +00:00 | 125 commits to main since this releaseFixed
- 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Device-local index backups no longer accumulate indefinitely. A backup snapshot could
-
0.15.1 Stable
released this
2026-07-14 21:20:28 +00:00 | 126 commits to main since this releaseFixed
- 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Empty notes no longer count as a permanent index deficit. Notes with no embeddable