Releases: kevinkaupert/obsidian-memvector-knowledge-engine
Release list
0.2.3
Release 0.2.3 — Layout Stability, Retrieval Hardening & Determinism
Release Version:
0.2.3
Release Date:2026-10-02
Target Obsidian Version:>= 1.11.4(Desktop)
Assets:main.js,manifest.json,styles.css
Overview
Release 0.2.3 delivers comprehensive hardening across 2D vector scatter layout stability, camera bounds tracking, retrieval channel error handling, radar unindexed heuristics, and cross-platform deterministic sorting.
It addresses vectorless note edge cases where un-embedded notes previously distorted rescale bounds or collapsed onto the origin, guarantees that deleting relations triggers a clean scratch rearrangement with automatic camera refitting, centrally prunes deleted notes before all layout passes, surfaces unindexed SQLite graph database states with localized UI warnings, and standardizes all string comparisons to explicit "en" locale ordering.
The automated test suite grows to 775 tests across 68 test files, all passing.
Highlights
1. Vector Scatter Layout Integrity (#224)
- Protected Rescale Bounds:
rescaleSimilarityMatrixnow derives similarity bounds strictly from pairs of notes with valid embeddings when >= 2 exist, preventing un-embedded notes from distorting global matrix scaling or causing notes to collapse onto the origin. When 0 or 1 embedded note exists, bounds default safely without injecting artificial zero-similarity pairs. - Embedded Centroid Preference: Cluster centroid selection (
assignClusters) now explicitly prefers notes with genuine vector embeddings even for small note counts (n <= numClouds), preventing un-embedded notes from anchoring clusters. - Deterministic Sort Tiebreaks: In
layoutEngine.mobileSet, note ID comparison serves as an explicit tiebreak when similarity scores match. - Centralized Deleted-Note Pruning: Added
pruneDeletedNodes(), executed systematically prior toapplyLayout(),rearrangeLayout(),onVectorsCalculated(),reloadEmbeddings(), andrefreshRelationEdges(), preventing deleted notes from remaining as ghost nodes.
2. Camera Refitting on Relation Removal (#218)
- Viewport Tracking on Edge Deletion: Removing a relation in the relation builder executes a deterministic global rearrangement. The camera now automatically calls
fitToView()with viewport adjustment tracking (hasFittedView), ensuring the rearranged graph remains centered and never drifts out of the visible pane. - ADR-0006 Documentation Clarification: Updated ADR-0006 to accurately describe that removing a relation computes a canonical scratch layout rather than preserving evolved local positions, while un-embedded notes participate in repulsion and text-based link forces without hijacking rescale bounds.
3. Retrieval Channel Status & Radar Fallback (#192, #193)
- Graph Retrieval Unindexed State: The SQLite graph store now exposes an
isIndexed()check. When the graph has not yet been synced, context enrichment marks the channel asunindexedinstead of falsely reportingready, and surfaces the localized warningretrievalGraphUnindexedin context previews and synthesis results. - Consistent Radar Fallback: When an active note has no vector neighbors but candidate markdown files exist in the vault, radar returns
{ status: "unindexed", data: [] }, transparently falling back to word/formula heuristic ranking (rankCandidates) and displaying theradarUnindexedwarning banner. - Degraded Channel Resilience: Previews and synthesis gracefully handle individual channel failures or unindexed states while preserving valid context from operational channels.
4. Reasoning Token Preservation & Provider Resilience (#198, #200)
- Truncated Reasoning Recovery: Incomplete reasoning blocks lacking a closing
</think>tag are retained and displayed within the collapsible callout rather than discarded or crashing parsing. Empty response bodies trigger clear errors. - Workspace State Restoration: Saved scatter filters are restored smoothly on startup without redundant re-scans (#194).
5. Cross-Machine Determinism (#195)
- Explicit Locale Ordering: Standardized all string comparisons, path orderings, and SQLite search tiebreaks across the codebase to
localeCompare(..., "en"), eliminating machine-dependent sorting variances across platforms and locales.
Changelog
Fixed
- Vectorless notes distorting similarity rescale bounds and collapsing to origin stacks (#224).
- Rescale bounds computation failing when 0 or 1 embedded note exists.
- Centroid selection choosing un-embedded notes as cluster anchors for note sets where n <= numClouds.
- Missing camera refit (
fitToView) after deleting relations inrefreshRelationEdges. - Deleted notes lingering across layout passes (
rearrangeLayout,onVectorsCalculated,reloadEmbeddings, spacing sliders). - Graph store falsely reporting
readywhen graph database was never indexed. - Radar reporting
readyinstead ofunindexedwhen active note has embeddings but vault neighbors are unindexed. - Platform- and locale-dependent sorting discrepancies across systems.
- Incomplete reasoning blocks failing to parse or dropping thinking tokens (#198).
- Redundant vault rescans when restoring saved workspace scatter filters (#194).
Changed
- Standardized all
localeComparecalls to explicit"en"locale. - ADR-0006 updated to clarify scratch global rearrangement upon relation deletion and hybrid force modeling.
- Added localized
retrievalGraphUnindexedwarning for unindexed graph database in English and German.
Upgrade Notes
- Camera Auto-Fit: Deleting a relation now automatically refocuses the camera view on the resulting node layout.
- Graph Status: If you see a warning indicating the graph database is unindexed, run "Jetzt Vault lokal indizieren" / "Index vault locally now" in Settings -> MemVector.
Installation & Upgrade
Community Plugins (Automatic)
Search for MemVector Knowledge Engine in Obsidian Community Plugins and click Update (or Install).
Manual Installation
- Download
main.js,manifest.json, andstyles.cssfrom the release assets on GitHub. - Copy all three files into your vault's plugin directory:
<vault>/.obsidian/plugins/memvector-knowledge-engine/ - Reload Obsidian or toggle the plugin off and on under Settings → Community Plugins.
0.2.2
Release 0.2.2 — Stable 2D Layout, Event-Driven Updates & Data Safety Fixes
Release Version:
0.2.2
Release Date:2026-10-01
Target Obsidian Version:>= 1.11.4(Desktop)
Assets:main.js,manifest.json,styles.css
Overview
Release 0.2.2 makes the 2D view keep its map. Data updates no longer re-run the whole force simulation: nothing is computed when nothing that affects the layout changed, a relevant change moves only the affected notes, and a full rearrangement is an explicit action. Background views stop computing, and positions are written only when they actually moved.
It also fixes a set of data safety issues: indexing runs are cancelled when the embedding model changes mid-run, incomplete relation notes no longer delete stored edges, a failed vector read no longer rearranges the map on fallback data, synthesis context no longer contains text a note no longer has, and positions of deleted notes are cleaned up.
Correction to 0.2.1: the 0.2.1 release notes described "full spatial mental map continuity across vault restarts". In 0.2.1, stored positions were restored but only used as starting values: every update re-ran the full simulation, which moved every node and kept shuffling the map. 0.2.2 keeps stored positions unchanged on reopen and for unchanged layout inputs.
The automated test suite grows to 720 tests across 64 test files, all passing.
Highlights
1. The layout only changes when something relevant changed (ADR-0006, supersedes ADR-0005)
- No work for irrelevant edits: the view compares signatures of what the layout actually reads - per note the folder, links, formulas (math domain), the words of the first 800 characters and the vector; globally the relation forces, spacing, knowledge domain and "WikiLinks as relations". Typing further down in a note, editing a title or changing a relation's description moves nothing and writes nothing (#206, #209).
- Restart keeps the map: reopening the view or restarting Obsidian shows the stored positions unchanged, without running the simulation.
- Local adjustment for real changes: a changed, new or re-linked note moves together with its relation neighbors and its five most similar notes only. All other notes stay exactly where they are. The adjustment starts with low energy, keeps moved notes close to their previous position and stops once nothing moves (#185).
- Explicit placement status: a note that sits exactly at the center of the map is stored and restored like any other instead of being treated as unplaced (#190).
- Larger changes still re-layout: vectors recalculated for most notes, a changed knowledge domain, "WikiLinks as relations" or a moved spacing slider still recalculate the whole layout.
Measured on synthetic data (1024-dimensional vectors, layout step only): an update without a relevant change takes about 5 ms for 2000 notes instead of a full pass of several seconds; a change to one note moves about 6 notes and takes about 0.4 s for 1000 and 1.7 s for 2000 notes.
2. Event-driven updates
- One event queue per view: repeated saves of a note are coalesced, and a change re-reads only that note instead of the whole vault (#210).
- Irrelevant events are ignored: notes excluded from indexing or outside the view filter no longer trigger work. Relation notes and the vocabulary file are still processed, because they change forces between visible notes.
- Ordered updates: an older scan can no longer overwrite a newer one.
- Hidden views wait: a view in a background tab collects note and settings changes and applies them once when it is shown again. Views in split panes and popout windows update live (#212).
- Fewer database writes: positions are written only for notes that moved, batched over one second, and flushed when the view closes. A failed write is retried with the next one (#211).
3. "Rearrange layout"
- Since data updates no longer rearrange the map, a fresh global layout is now an explicit action: the "Layout neu anordnen" / "Rearrange layout" button in the view section of the toolbar, under the spacing sliders, and the command "MemVector: Rearrange 2D layout" (#214).
4. Data safety
- Model switch during indexing: "Calculate vectors" and "Index vault locally now" are cancelled when the embedding model or endpoint changes while they run. Their vectors are neither shown nor stored, so vectors of the new model are not overwritten (#202).
- Incomplete relation notes: a relation note without a usable source or target link no longer causes its stored edge to be deleted during graph sync; the note is logged with its path (#203).
- Failed vector read: when stored vectors cannot be read, the map is kept as it is - no layout run, no position write - and a notice explains it. In-memory vectors are only used as fallback when they belong to the current model. The first update that can read the vectors again resumes normal updates (#191).
- Fresh synthesis context: context from vector search uses the note as it is now, also when it was emptied, instead of the excerpt stored at embedding time (#196).
- Position cleanup: positions of deleted notes and of notes excluded from indexing are removed by "Index vault locally now" and by a complete "Calculate vectors" run. Notes only hidden by a view filter or relation-note visibility keep their position (#196).
5. Settings reach open views
- Relation notes toggle: turning "show relation notes" on shows them immediately instead of after the next unrelated rescan (#204).
- Exclusions, knowledge domain, WikiLinks as relations: changing them in Settings updates open views right away (#189).
- Spacing across views: moving a spacing slider in one view applies to every open view (#189).
Changelog
Added
- "Rearrange layout" button in the view section and command "MemVector: Rearrange 2D layout" (#214).
--delay <ms>option fortesting/mock-echo-server.js, to test cancelling indexing on a model switch.
Fixed
- Layout runs and position writes for edits that do not affect the layout (#206, #209).
- Map drift: every update re-ran and re-heated the full simulation (#185).
- Full-vault rescans on every note change; events for excluded or filtered notes; overlapping scans (#210).
- Position writes for unmoved notes and full database exports after every pass (#211).
- Computation in hidden views (#212).
- Nodes at exactly
(0, 0)treated as unplaced (#190). - Relation notes toggle without effect until another rescan (#204).
- Incomplete relation notes deleting stored edges (#203).
- Indexing adopting or storing previous-model vectors after a model switch mid-run (#202).
- Layout and position writes on fallback data after a failed vector read (#191).
- Stale stored excerpt used as context for emptied notes; orphaned positions never removed (#196).
- Exclusions, knowledge domain, WikiLinks as relations and spacing not reaching open views (#189).
Changed
- ADR-0006 supersedes ADR-0005: positions are kept for unchanged layout inputs, relevant changes lead to a bounded adjustment, a full rearrangement is an explicit action.
- Documentation describes when the layout changes (
docs/USER_GUIDE.md,docs/CONFIGURATION.md,docs/ARCHITECTURE.md).
Upgrade Notes
- The map no longer rearranges on its own. If the arrangement no longer fits after many changes, use "Layout neu anordnen" / "Rearrange layout".
- Run "Index vault locally now" once after updating to remove stored positions of notes that were deleted before this release.
Installation & Upgrade
Community Plugins (Automatic)
Search for MemVector Knowledge Engine in Obsidian Community Plugins and click Update (or Install).
Manual Installation
- Download
main.js,manifest.json, andstyles.cssfrom the release assets on GitHub. - Copy all three files into your vault's plugin directory:
<vault>/.obsidian/plugins/memvector-knowledge-engine/ - Reload Obsidian or toggle the plugin off and on under Settings → Community Plugins.
0.2.1
Release 0.2.1 — Mental Map Continuity, Graph Safety Gates & Canvas Layout Stability
Release Version:
0.2.1
Release Date:2026-09-30
Target Obsidian Version:>= 1.11.4(Desktop)
Assets:main.js,manifest.json,styles.css
Overview
Release 0.2.1 introduces full spatial mental map continuity across vault restarts, hardens SQLite graph and position persistence with fail-safe gates against transient file locks, fixes cluster collapse when declaring new relations, and streamlines relation creation to rely strictly on presets and settings.
The automated test suite expands to 602 tests across 57 test files with 100% pass rate.
Highlights
1. Spatial Mental Map Continuity across Restarts (ADR-0005)
- Node Position Persistence: Calculated 2D positions are now saved into SQLite (
node_positions) and re-hydrated whenever the 2D canvas opens, keeping your cognitive spatial map intact across Obsidian restarts. - Deterministic 2D Orientation: Canonical SVD sign-flip normalization prevents axis reflection flips during PCA calculation.
- Incremental Placement for Unplaced Notes: When adding new notes to an existing graph, they are seeded next to their most similar neighbor without perturbing established nodes.
- Edge Radius Persistence: Selected edge hops radius is persisted across workspace reloads and settings updates.
2. Critical Graph & Position Safety Gates
reconcileEdgesGate (Issues #183, #197, #199): Edge reconciliation in SQLite is automatically skipped if loading relation files encounters read errors or file locks, preventing transient I/O issues from wiping valid edges.positionsHydratedGate (Issues #184, #198, #199): Writing node coordinates to SQLite is blocked if position hydration failed, and in-memory coordinates from failed hydrations are discarded on subsequent scans to prevent deferred coordinate clobbering.
3. Canvas Layout Stability on Edge Addition
- No Cluster Collapse: Multi-hop graph topology weights (
HOP_DECAY) were tuned so that indirect 2- and 3-hop graph paths stay below the spring attraction threshold (0.15). Adding an edge between two clusters pulls only the directly connected nodes together, while indirect neighbors repel naturally. - Phantom Node Prevention: Relation note markdown files in the relations directory are excluded from the canvas node set when
showRelationNotesis off, eliminating unplaced attractors at (0, 0).
4. Streamlined Relation Types
- Vocabulary Presets as Source of Truth: The "Frei..." /
CUSTOMfree-text option was removed from the Relation Builder modal dropdown. All relation types are managed cleanly through presets in Settings -> Relation Types.
Changelog
Added
- 2D scatter node position persistence to SQLite (
node_positions) with mental map restoration on restart (ADR-0005, #182). - Edge hops radius dropdown persistence across workspace states (#182).
Fixed
- Fixed 2D canvas cluster collapse when adding new relation edges by lowering multi-hop decay below spring threshold (#200).
- Excluded relation notes from scatter node scans when
showRelationNotesis false (#200). - Protected SQLite graph edges against deletion during relation load failures or partial file locks (
reconcileEdgesgate, #183, #197, #199). - Protected SQLite node positions against clobbering when hydration fails or across deferred rescans (
positionsHydratedgate, #184, #198, #199). - SVD sign-flip canonical normalization on PCA projection axes (#182).
- Incremental neighbor seeding for unplaced notes (#182).
Changed
- Removed ad-hoc
CUSTOM/ "Frei..." edge type option from Relation Builder modal (#200).
Installation & Upgrade
Community Plugins (Automatic)
Search for MemVector Knowledge Engine in Obsidian Community Plugins and click Update (or Install).
Manual Installation
- Download
main.js,manifest.json, andstyles.cssfrom the release assets on GitHub. - Copy all three files into your vault's plugin directory:
<vault>/.obsidian/plugins/obsidian-memvector-knowledge-engine/ - Reload Obsidian or toggle the plugin off and on under Settings → Community Plugins.
0.2.0
Release 0.2.0 — Reliable Vector Index, Configurable Vault Folders & Feature Freeze
Release Version:
0.2.0
Release Date:2026-09-30
Target Obsidian Version:>= 1.11.4(Desktop)
Assets:main.js,manifest.json,styles.css
Overview
Release 0.2.0 makes the local vector index trustworthy and removes the plugin's
assumption that every vault uses a wiki/ folder layout.
The incremental vector cache introduced in 0.1.8 is hardened end to end: both
indexing paths now embed the same text, every stored vector records the model and
endpoint that produced it, and vectors of different embedding models can no longer be
mixed - not in the database, not in an open 2D view and not in GraphRAG context. Several
data-loss and false-success paths are closed. Relation notes are recognized by one rule
everywhere, and the folders the plugin writes to are now configurable.
The automated test suite grows to 578 tests across 56 test files.
Feature Freeze
With this release the plugin enters a feature freeze for the time being. Until
further notice, only bug fixes and stability improvements will be merged; no new
features are planned for upcoming releases.
Feature ideas are still welcome. Please open a
feature request
on GitHub describing the use case, so it can be considered once the freeze is lifted.
Bug reports are handled as usual.
Upgrade Notes
- One full re-embedding after the update. Vectors stored by earlier versions carry
no record of the model that produced them. They are treated as unknown instead of
being attributed to the currently configured model, so the first "Index vault locally now"
run re-embeds every note. Until then, semantic search and the related-notes radar
skip those notes. With a local Ollama model this takes a few minutes; with a paid
embedding API it costs one full indexing run. - More text per note is embedded. The embedded text is no longer cut at
800-2000 characters. The new settingembeddingMaxChars(default8000,
0= no cap) controls it; keep it within your model's input limit. - Relation notes are identified by
type: relation. A note counts as a relation
note if its frontmatter hastype: relation, or if it lies inside the relations
folder. Notes in an unrelated folder that happens to be namedrelationsand carry no
such type are no longer treated as edges. Notes created by the relation builder
always carry the type, so no action is needed for them. - Folders stay where they are. The new folder settings default to
wiki/relations,
wiki/synthesisandwiki/presets. Changing a folder does not move existing notes.
Highlights
- Configurable Vault Folders (#173):
Settings -> General -> Vault folders sets where relation notes, synthesis notes
and vocabulary presets are written. Relation notes that were moved or whose folder was
renamed keep working as edges, graph context and radar entries (ADR-0004). - No More Mixed Embedding Models (#164, #175, #176, #177):
Every vector records its embedding fingerprint (model plus normalized endpoint). A
model or endpoint switch re-embeds the vault instead of keeping old vectors, open
views reload their vectors immediately, and GraphRAG enrichment queries only with
vectors of the active model. - One Embedding Text for Both Indexing Paths (#161):
"Index vault locally now" and the 2D view's "Calculate Vectors" build identical text and
cache hashes, so each path reuses the other's work instead of re-embedding everything. - Data Safety (#165, #166):
A filtered 2D view can no longer delete the stored vectors of notes outside the
filter, and a retry after a failed database write persists the pending vectors or
reports the error again instead of claiming success. - Stable Live Updates in the 2D View (#162, #167, #168, #169, #171):
Editing notes keeps the camera in place, relation-note nodes follow create/delete/
rename, selection and search stay aligned with the current notes, and a live rescan can
no longer crash a running vector calculation. - Settings Polish (#170):
A new preset copied from an intentionally empty vocabulary stays empty, and the
add-relation-type form is aligned with the type table instead of wrapping mid-form.
Changelog
Added
- Settings -> General -> Vault folders: the folders for relation notes (
relationsFolder), synthesis notes (synthesisFolder) and vocabulary presets (presetsFolder) are configurable. Defaults staywiki/relations,wiki/synthesisandwiki/presets, so existing vaults are unchanged; changing a folder does not move existing notes. The relations folder is also the fallback criterion for relation notes withouttype: relation. Texts that named the fixedwiki/...folders now show the configured ones (#173).
Fixed
- "Index vault locally now" (Settings) and "Calculate Vectors" (2D view) now embed the same text and compute the same cache hash. Settings used the file name plus up to 1500 characters, the toolbar used the display title plus an 800-character scan excerpt, so each path treated the other's stored vectors as stale and re-embedded unchanged notes (#161).
- Switching the embedding model or endpoint no longer mixes vectors from different models. Each vector records the model and endpoint that produced it; other models' vectors count as cache misses and are excluded from search, hydration and the radar (#164). Vectors stored by earlier versions are treated as unknown and re-embedded rather than attributed to the currently configured model (#176).
- An open 2D view no longer keeps vectors of the previous embedding model. Changing the model or endpoint, and every "Index vault locally now" run, reloads the stored vectors into open views; "Calculate Vectors" takes the stored vector on a cache hit, and GraphRAG context enrichment builds its query only from stored vectors (#175).
- The embedding fingerprint no longer treats endpoints whose URL paths differ only in case as the same vector space; only scheme and host are compared case-insensitively (#177).
- Relation notes are recognized by one rule everywhere (edges, graph index, GraphRAG, scatter nodes, vault watcher, radar): frontmatter
type: relation, or a note inside the relations folder. Moved relation notes and a top-levelrelations/folder now work (#173). - "Calculate Vectors" in a filtered 2D view no longer deletes the stored vectors of every note outside the filter (#165).
- A retry after a failed database write no longer reports success for vectors that were never saved; pending changes are written before success is reported, or the storage error is reported again (#166).
- A live vault update during "Calculate Vectors" no longer aborts the calculation and leaves the button disabled; notes deleted in the meantime are not counted as cached (#169).
- An open 2D view picks up vectors re-indexed elsewhere on its next rescan; stored vectors take precedence over in-memory ones (#167).
- Editing a note no longer resets the 2D view's pan and zoom, and external changes to the active vocabulary file reload relations and layout weights (#162).
- Creating, deleting or renaming a relation note updates the relation-note nodes of an open 2D view (#168).
- A rescan aligns the selection, hover and search state with the current notes (#171).
- Creating a preset while the active vocabulary is intentionally empty creates an empty preset instead of seeding the 13 STEM types (#170).
- The form for adding a relation type in Settings is the last row of the type table, each field under its column; the reset button sits right-aligned below the table.
Changed
- The embedded text per note is no longer limited to 800-2000 characters by three independent hardcoded cuts. A single setting,
embeddingMaxChars(default 8000, 0 = no cap), controls it (#161).
Installation & Upgrade
Community Plugins (Automatic)
Search for MemVector Knowledge Engine in Obsidian Community Plugins and click Update (or Install).
Manual Installation
- Download
main.js,manifest.json, andstyles.cssfrom the release assets on GitHub. - Copy all three files into your vault's plugin directory:
<vault>/.obsidian/plugins/obsidian-memvector-knowledge-engine/ - Reload Obsidian or toggle the plugin off and on under Settings → Community Plugins.
- Run Settings → MemVector → "Index vault locally now" once to rebuild the vector index (see Upgrade Notes).
0.1.8
Release 0.1.8 — Layout Force Physics Hardening, Atomic Vocabulary Persistence & Multi-Window Stability
Release Version:
0.1.8
Release Date:2026-09-29
Target Obsidian Version:>= 1.11.4(Desktop)
Assets:main.js,manifest.json,styles.css
Overview
Release 0.1.8 is an essential reliability, simulation accuracy, and data safety release following a deep post-release audit of the 0.1.7 line.
This release fixes the force simulation layout clamp so that relation weights above 1.0 (such as EQUIVALENT_TO at 1.3 and ANALOGOUS_TO at 1.1) actually shorten distance in the 2D canvas, prevents silent data loss in Settings vocabulary editing via atomic vault mutations, ensures animation frame scheduling and event listeners properly track Obsidian popout windows, guards bundled presets against accidental shadowing, and expands the automated test suite to 463 tests across 49 test files.
Highlights
- Relation Weights Above 1.0 Active in 2D Canvas (#134):
Previously, the force simulation clamped graph weights to 1.0, treating weights like 1.1 or 1.3 identically to baseline 1.0 relations. The simulation now decouples target distance scaling from normalized affinity via a dedicatedweightFactor, allowing strongly bound concepts to settle closer together while maintaining collision floors. - Atomic Vocabulary Read-Modify-Write Cycles in Settings (#133, #145, #150):
Editing relation vocabulary types in Settings no longer risks reverting concurrent or previous edits. Every mutation now reads, patches, and writes only its owned field atomically via Obsidian'sVault.processAPI, preventing race conditions and stale snapshot overwrites. - Full Popout Window Support for 2D Scatterplot (#137):
Canvas redraw throttling and search pulse animations now resolve against the specific window the canvas element lives in (canvas.win) rather than a global window reference. Dragged popouts schedule and cancel animation frames cleanly without dropped redraws or leaked window listeners. - Live Active Vocabulary Synchronization across Settings & Views (#135):
Every way of modifying the active relation vocabulary (preset activation, creation, rename, delete, and path edits) now immediately triggers a relayout in open 2D views. The vocabulary path input applies cleanly on blur or Enter. - Bundled Preset Reservation & Vault Trash Preference (#140, #147):
User presets can no longer accidentally collide with or shadow bundled preset names (such as "Law", "Medicine", "Philosophy"). Preset deletion now routes throughfileManager.trashFile, strictly honoring the user's Obsidian deletion preference (system trash vs. local trash). - Localized Context Preview Badges (#141):
Dropped the redundant untranslated English "seed" label in the synthesis preview, preserving clean localized[Auswahl]/[Selection]badges and compactv,g,v+gprovenance indicators. - Expanded Test Suite (463 Passing Tests):
Added 88 new unit and adversarial regression tests covering force distance monotonicity, atomic vocabulary concurrency, and popout window lifecycle transitions.
Changelog
Fixed
- The 2D view now schedules its animation frames on the window it actually lives in. Both the redraw throttle and the search pulse used a bare
window.prefix, which resolves to the window the plugin was loaded in, so a view dragged into an Obsidian popout scheduled frames on - and cancelled them against - a window it no longer belonged to. The window-levelmouseuplistener follows the canvas across a move as well (#137). - Every way of changing the active relation vocabulary now reaches an open 2D view. Deleting, creating or renaming a preset, and editing the vocabulary path, updated the settings while the open canvas kept laying out with the previous vocabulary. The path field is also applied on blur or Enter instead of on every keystroke, so a half-typed path can no longer be persisted or turned into a stray vault file, and table edits are written to whichever file is active at that moment rather than the one that was active when the table was drawn (#135).
- User presets can no longer take a bundled preset's name.
createPresetandrenamePresetchecked only whether the target file already existed, so a preset named e.g. "Law" was accepted whilewiki/presets/law.jsonwas still absent and was then listed under the bundled label, beyond rename or delete (#140). - The context preview no longer prints the untranslated word
seednext to a selected note. Its origin was already stated by the localized badge, so the duplicate marker is removed rather than translated; traversed rows keep their compactv/g/v+gprovenance codes (#141). - Adding a relation type through the Settings add form now keeps explicit default values. Adding a label that ships bundled layout semantics with weight
1.0orrepelsunticked dropped both fields, so the inheritance fallback restored the bundled values on the next load -CONFLICTS_WITHcame back repelling andEQUIVALENT_TOat 1.3. Both write paths now use the same serialization (#136). - Relation type edits in Settings no longer discard each other. Every vocabulary mutation now re-reads the file before writing, so a second weight/repels edit, a delete or an add keeps all previous edits; an unreadable file aborts the write instead of truncating the vocabulary (#133). Each control writes only the field it owns and the whole read-modify-write runs atomically through the vault, so a
repelschange committed elsewhere is no longer reverted by the next weight edit, and two open Settings tables no longer overwrite each other (#145). - Relation weights above
1.0now actually shorten the distance between connected notes. The force simulation clamped every graph weight to1.0, so the bundledEQUIVALENT_TO(1.3) andANALOGOUS_TO(1.1) and any custom weight produced exactly the same layout as a generic relation. Weights at or below1.0keep their previous placement unchanged; see ADR-0003 for the mapping (#134).
Installation & Upgrade
Community Plugins (Automatic)
Search for MemVector Knowledge Engine in Obsidian Community Plugins and click Update (or Install).
Manual Installation
- Download
main.js,manifest.json, andstyles.cssfrom the release assets on GitHub. - Copy all three files into your vault's plugin directory:
<vault>/.obsidian/plugins/obsidian-memvector-knowledge-engine/ - Reload Obsidian or toggle the plugin off and on under Settings → Community Plugins.
0.1.7
Release 0.1.7 — Custom Relations, Grounded GraphRAG Prompt Context & Scatterplot Rendering Hardening
Release Version:
0.1.7
Release Date:2026-09-28
Target Obsidian Version:>= 1.11.4(Desktop)
Assets:main.js,manifest.json,styles.css
Overview
Release 0.1.7 expands the MemVector Knowledge Engine with custom domain relation types and presets whose 2D layout forces are editable data rather than code, injects typed knowledge relation edges directly into GraphRAG synthesis prompts, introduces granular seed pinning and context dismissal controls in the toolbar preview, eliminates hidden graph enrichment quotas, slims the floating 2D toolbar down to what belongs on the canvas while moving the rest into plugin Settings, and resolves visual and GPU-compositing glitches in the 2D scatter view.
See Upgrade notes below for the two visible behavior changes: relation notes are now hidden on the canvas by default, and lasso selection is the Shift + drag gesture only.
Highlights
- Custom Edge Types & Presets (#119, PR #121):
Define relation types beyond the 13 canonical vocabulary terms, keep them in domain presets
(wiki/presets/: STEM, Law, Medicine, Philosophy), and tune each type's 2D force directly:
the Relation types section in Settings editsweightandrepelsper label in place.
Layout semantics are vocabulary data now, not code (docs/adr/0002-vocabulary-driven-layout-weights.md). - Typed Relation Edges in GraphRAG Prompt Context (#104, PR #128):
LLM synthesis prompts now include an explicit knowledge relations block formatted with WikiLinks and relation directions (e.g.- [[Note A]] --[CONFLICTS_WITH]--> [[Note B]] (Reason: ...)). The AI co-pilot reasons directly over verified structural connections rather than treating context as flat bags of words. - Context Preview Pinning & Note Dismissal (#116, #117, PR #123, PR #124, PR #126):
Selected seed notes are now pinned at the top of the live context preview under an explicit header. Users can review automatically retrieved vector and multi-hop graph candidates and manually dismiss unwanted notes (x) before starting synthesis. The floating toolbar is widened to 280px with right-aligned dismiss controls. - Slimmed 2D Toolbar, Controls Moved into Settings (#119, PR #121):
Relation edges are always rendered and the toolbar keeps only the hop radius. Visual style,
relation-note visibility and agent guidelines live in plugin Settings and now apply to an open
view immediately. Lasso selection is theShift+ drag gesture; its toolbar toggle is gone.
Relation notes are hidden by default, so the canvas reads as typed connections between
concepts rather than as relation files. - Transparent Graph Context Quotas (#115, PR #122):
Removed hidden internal SQL query caps (perHop * 3 + seeds) and arbitrary slack multipliers from graph enrichment queries. Neighbor retrieval now strictly follows user-configured settings without silently dropping or overfetching notes across multi-hop queries. - Scatterplot Label Decluttering (PR #130):
Greedy screen-space collision avoidance (labelPlacement.ts) over a uniform grid. Cluster labels
anchor first, then selected/hovered/connected node labels reserve their space, then everyone else
yields - so the label you are looking at is never overdrawn by a neighbor's. - GPU-Compositing Glitch Elimination (PR #130):
Resolved an Electron/Chromium compositor bug on macOS that caused stale canvas text to bleed into unrelated Obsidian panes (file explorer sidebar, tab bar). Removedbackdrop-filter: blurfrom the floating toolbar and throttled trackpad/mouse redraw triggers to at most one per animation frame viawindow.requestAnimationFrame. - Complete Toolbar & Sidebar Localization (#111, PR #127):
Migrated the remaining hardcoded UI strings, buttons, tooltips and badges into the i18n system
across German and English, down to the synthesis status line, the context preview's hop wording
and the model-reasoning callout.
Upgrade notes
- A vault that already has
wiki/relation-types.jsonfrom an earlier version keeps its layout
behavior: terms written beforeweight/repelsexisted inherit the bundled per-label semantics
instead of collapsing to the generic1.0attraction. No manual migration or re-index is needed. - Relation notes are hidden on the canvas by default from this version on. Re-enable them under
Settings -> Show relation notes; the typed edges between concept notes are shown either way. - The Lasso toolbar toggle is gone. Hold
Shiftand drag to lasso-select.
Changelog
Added
- Custom relation edge types, presets, and vocabulary-driven layout weights (#119, PR #121).
- Bundled domain presets under
wiki/presets/(STEM, Law, Medicine, Philosophy) with a Settings Relation types manager: preset switch/create/rename/delete, a per-label type table with in-placeweight/repelsediting, add/remove, and reset to the STEM default (#119, PR #121). - Typed knowledge relation edges injected directly into GraphRAG LLM prompt context (#104, PR #128).
- Sticky seed notes pinned at the top of the context preview (#117, PR #123).
- Manual dismissal controls (
x) on context preview items allowing users to prune unwanted vector or graph notes before launching LLM synthesis (#116, PR #124, PR #126). - Greedy screen-space collision avoidance (
labelPlacement.ts) for 2D scatter plot to declutter dense cluster and node labels (PR #130). - Setting Show relation notes (
showRelationNotes, defaultfalse) replacing the former toolbar toggle (#119, PR #121). - CI step verifying that the committed
main.jsbundle matches the current source, so a source change cannot ship with a stale artifact.
Changed
- Removed hidden internal SQL neighbor caps and slack multipliers from graph traversal queries, strictly honoring user-configured hop limits and context budgets (#115, PR #122).
- Widened floating toolbar to 280px and pinned context preview dismiss buttons to the far right for clean alignment and usability (PR #126).
- Slimmed the floating 2D toolbar: relation edges are always rendered and the toolbar keeps only the hop radius. The Lasso, Show edges, Show relation notes, Visual style and Agent guidelines toggles were removed from it; visual style, relation-note visibility and agent guidelines moved into plugin Settings, and lasso selection is now the
Shift+ drag gesture only (#119, PR #121). - Relation edges are shown by default (
showEdges), relation notes are hidden by default (showRelationNotes) - the graph now reads as typed connections between concept notes rather than as relation files on the canvas (#119, PR #121). - Settings sections reordered to match their numbering; the relation vocabulary path field moved into the collapsible Relation types section (#119, PR #121).
- Bundled relation vocabulary slimmed from 37 conversational synonym entries to exactly one entry per canonical label (13). The dropdown selects canonical labels, so existing relation files and edges are unaffected; the work-in-progress
buildConversationalCategoriesscaffolding for Issue #43 was removed with it (#119, PR #121). - Visual style, relation-note visibility and label opacity now take effect immediately in an open 2D view, and every relation-vocabulary change (type add/remove, weight/repels edit, reset, preset switch) re-runs the force layout there, instead of requiring the view to be reopened.
- Relation prompt heading and reason label now come solely from the i18n layer; the duplicated inline copies in
synthesis.tswere removed.
Fixed
- Eliminated GPU compositing artifacts / text bleeding into unrelated Obsidian panes (tab bar, file explorer) on macOS by removing toolbar
backdrop-filter: blurand throttling canvas redraws viarequestAnimationFrame(PR #130). - Fixed remaining hardcoded UI strings in toolbar and sidebar views by routing them through the i18n layer (#111, PR #127).
- Preserve bundled per-label layout semantics (
weight/repels, ADR-0002) for vocabulary files written before those fields existed and for labels missing from the active preset, instead of silently collapsing every label to the generic1.0attraction - which turnedCONFLICTS_WITHfrom repulsion into attraction andINDEPENDENT_OFfrom the neutral0.05baseline into a full pull, re-breaking #68 (relationVocabulary/layoutDefaults.ts). - Bidirectional relations saved from the Relation Builder now store a reverse edge row like the full re-index path, so reverse-hop traversal works without a manual re-index (#120, PR #121).
- Skip non-finite vector similarity scores during GraphRAG context enrichment instead of admitting them as matches (PR #127).
- Correct
isRelationNodepath matching so sibling folders such aswiki/relations-archive/are no longer misclassified as relation notes (PR #127). - Scope the canvas redraw throttle to
window.requestAnimationFrameand cancel the pending frame in the interaction teardown, so the 2D view keeps redrawing in an Obsidian popout window and a scheduled frame cannot fire after the view closed (PR #130). - Selected, hovered and connected node labels now reserve their space before all other labels, so the label the user is focused on is no longer overdrawn by an arbitrary neighbor's (PR #130).
- Long note titles in the context preview now ellipsize instead of pushing the meta column and dismiss button out of the toolbar panel.
- The context preview reset button stays reachable when context enrichment fails, so dismissed notes can always be restored.
- Removed the orphaned translation keys left behind by the toolbar slimming (
lblLasso,lblShowEdges,lblVisualStyle) and wired up the two that were added but never used (synthRelHeading,synthRelReasonLabel). - Routed the last hardcoded s...
0.1.6
MemVector 0.1.6 represents an important architectural milestone. This release sharpens the core MemVector philosophy: prioritizing high-dimensional semantic vector embeddings and intentional, typed domain relationships over raw, untyped Obsidian link structures. It also introduces per-hop GraphRAG context quotas, a live scrollable context preview, independent synthesis hop controls, and a toggle to declutter the 2D canvas from intermediate relation notes.
Highlights
1. Strengthening the Pure MemVector Paradigm: Opt-In WikiLinks (#100)
- Focused Knowledge Graph: Standard Obsidian
[[WikiLinks]]are no longer automatically converted into untypedLINKS_TOgraph relations by default (includeWikiLinksAsRelations: false). - Semantic Integrity: The SQLite graph store, GraphRAG multi-hop traversal, and 2D force simulation topology are now strictly reserved for semantic embeddings and explicit, typed relationships (
wiki/relations/*created via the Relation Builder). - Opt-In Compatibility: Users who wish to continue tracking raw wiki links in the graph store can re-enable the toggle under Settings → Knowledge Domain & Embedding Provider. Documented in ADR-0001.
2. GraphRAG Per-Hop Quotas & Live Context Preview (#89, #103)
- Independent Synthesis Hop Depth (#89): Decoupled GraphRAG synthesis traversal depth (1–3 hops) from visual canvas edge hops.
- Balanced Per-Hop Quotas (#103): Replaced flat neighbor cuts with a per-hop level quota (
hopLevelNeighborLimit, default: 2) and round-robin assembly across hops, ensuring hop-1 notes no longer crowd out deeper conceptual connections. - Configurable Context Budgets: Moved hardcoded context caps into plugin settings (
vectorNeighborLimit,totalContextLimit,agentsGuidelinesCharCap,contentCapChars). - Vector Similarity Gate: Added
minVectorSimilarity(default: 0.75) with an interactive live slider in the toolbar Synthesis section. - Live Scrollable Context Preview: The Synthesis section now displays an interactive preview of all candidate context notes live on selection change, annotated with channel badges (
[v],[g],[v+g]), hop distance, and similarity scores.
3. 2D Scatter Plot Relation Note Toggle (#59)
- Clean Concept Views: Added a toggle in the scatter plot toolbar under View (
lblShowRelationNotes) to hide intermediate relation notes (wiki/relations/*/type: relation). - Zero Layout Shift: Toggling relation visibility filters rendering, hit-testing, auto-fit, and lasso selection instantly without recalculating or resetting node coordinates. Direct edges between regular concept notes remain intact.
4. Resilient SQLite Storage Path Resolution (PR #97)
- Manifest-Relative Paths: Resolved SQLite database and WASM file paths using
this.manifest.dirinstead ofthis.manifest.id, ensuring reliable database access when plugins are cloned or installed into custom folder names. - Automated Directory Creation: Ensures the plugin directory exists via
app.vault.adapter.mkdirbefore writingmemvector-local.sqliteand WASM binaries, preventing ENOENT errors.
5. Codebase Hardening & Architecture Cleanups (#72, #78, #79, #81, #83, #90)
- Canonical Identity at Store Boundary (#81): Unified
pathToIdacross storage boundaries, resolving SQLite vector dual-identity and path encoding edge cases. - Position Provider Contract (#78): Replaced runtime duck-typing with a type-safe
NodePositionProviderinterface, and extracted sharedvaultFilter.ts. - Deduplication (#79): Consolidated duplicate implementations of string hashing, node map indexing, coordinate projections, and frontmatter parsing.
- Ghost Backend Cleanup (#72): Aligned
storeFactoryand documentation to eliminate unbacked claims. - Model Tiers & Cleanup (#83): Added
deepseek-reasonerto the frontier tier, eliminated caller array mutation inRelationBuilderModal, and ensured canvas interaction cleanup on teardown.
6. Full Localization & Expanded Test Suite (307 Passing Tests)
- Complete DE/EN UI Parity (#69, PR #106): Fully localized ribbon icons, commands, notices, indexing progress, synthesis modals, and canvas controls without mixed language fragments.
- 60 New Automated Tests: Expanded test suite from 247 to 307 automated unit and adversarial tests across 39 test files, with zero errors on ESLint.
Changelog
Added
- Opt-in setting
includeWikiLinksAsRelations(default:false) to restrict graph extraction and topology forces to explicit typed relations (#100, PR #101). - Quick toggle in 2D scatter plot toolbar under View to show or hide relation notes without layout reset (#59, PR #99).
- Per-hop GraphRAG context quotas (
hopLevelNeighborLimit) and round-robin assembly across hop levels (#103, PR #105). - Live scrollable context preview with compact badges (
v,g,v+g, score, hops) and real-time similarity slider in the toolbar Synthesis section (#103, PR #105). - Independent GraphRAG hop depth control (1–3 hops) in the toolbar Synthesis section (#89, PR #98).
- Settings-based context limits for vector neighbors, total context, and guideline caps (#103, PR #105).
ADR-0001: Architectural decision record on opt-in WikiLink relation extraction.
Changed
- GraphRAG neighbor assembly now respects per-hop quotas rather than cutting off deeper hops prematurely (#103).
- SQLite storage path now resolves from
this.manifest.dirwith automated directory creation before write (PR #97). - Canvas node position provider formalized as
NodePositionProviderinterface (#78, PR #94). - Model tier routing now includes
deepseek-reasonerand OpenRouter frontier endpoints (#83, PR #96).
Fixed
- Fixed SQLite database and WASM initialization failing with ENOENT when plugin folder name diverges from manifest ID (PR #97).
- Fixed dual-identity discrepancy for vector IDs across store boundaries (#81, PR #92).
- Fixed caller array mutation in
RelationBuilderModal(#83, PR #96). - Fixed canvas listener leaks by registering clean interaction teardown on view close (#83, PR #96).
- Fixed hardcoded UI strings, error notices, and toolbar labels across the plugin by routing them through the i18n layer (#69, PR #93, PR #106).
- Fixed lost relation edits and added validation for default types and duplicate filenames (#90).
Documentation
- Documented
ADR-0001for opt-in WikiLink relation extraction indocs/adr/0001-wikilinks-opt-in-graph-relations.md. - Updated
README.md,CHANGELOG.md,docs/ARCHITECTURE.md,docs/CONFIGURATION.md, anddocs/GRAPHRAG.md.
Installation & Upgrade
Community Plugins (Automatic)
Search for MemVector Knowledge Engine in Obsidian Community Plugins and click Update (or Install).
Manual Installation
- Download
main.js,manifest.json, andstyles.cssfrom the release assets on GitHub. - Copy all three files into your vault's plugin directory:
<vault>/.obsidian/plugins/obsidian-memvector-knowledge-engine/ - Reload Obsidian or toggle the plugin off and on under Settings → Community Plugins.
0.1.5
Release 0.1.5 — Data Safety Hardening, Force Layout Optimizations & Semantic Palettes
Release Version:
0.1.5
Release Date:2026-09-23
Target Obsidian Version:>= 1.11.4(Desktop)
Assets:main.js,manifest.json,styles.css
Overview
Release 0.1.5 is a comprehensive stability, performance, and data safety release addressing findings from the deep codebase audit.
This release eliminates potential data loss during relation editing, prevents relation file slug collisions via SHA-256 identity hashing, optimizes the continuous 2D force simulation loop by removing redundant calculations and string allocations, enforces strict note exclusions across GraphRAG synthesis, introduces dedicated semantic colors for all 13 canonical relation types across light and dark themes, and expands the automated test suite to 247 tests across 31 test files.
Highlights
-
Atomic Relation Save Flow & Overwrite Guards: Resolved a critical lost-update risk in
RelationBuilderModal. Replacement relation notes and graph edges are now written and verified before previous files are cleaned up, duplicate targets in batch creations are rejected upfront, and target files cannot overwrite existing relations (#73). -
Injective Relation Slugs via Identity Suffixes: Added SHA-256 identity suffixes (
${baseSlug}-${hash.slice(0, 6)}) to bounded relation filenames. This guarantees notes with punctuation or similar folder structures remain distinct without collisions, while retaining legacy path lookup for backwards compatibility (#74). - Strict GraphRAG Context Exclusions: Enforced path and file exclusion patterns during GraphRAG context enrichment. Excluded notes and non-concept auxiliary files are strictly filtered out before neighbor scoring and prompt synthesis, preventing unwanted notes from leaking into LLM context (#82).
-
2D Force Layout Simulation Optimizations:
- Removed redundant similarity matrix rescaling inside the force projection loop, preserving single-ownership and caller-provided affinities (#75).
- Precomputed note token sets in
$O(N)$ upfront, eliminating$O(N^2)$ pairwise re-tokenization and inner-loop string allocations during force simulation (#80). - Modeled
INDEPENDENT_OFrelation edges as neutral baseline graph weight (0.05) rather than strong attraction, keeping logically independent notes organically decoupled (#68).
-
Semantic Relation Palette across Ink & Muted Canvas Modes: Added distinct, dedicated semantic colors for all 13 canonical Cypher relation labels (
IMPLIES,REQUIRES,EQUIVALENT_TO,CONFLICTS_WITH,INDEPENDENT_OF, etc.) across both default "ink" and "muted" visual themes, with dynamic hash fallback for custom domain types (#62). -
Relation Direction Resolution & Vocabulary Alignment: Fixed
resolveEdgesForSaveto strictly honorreversed: truedefinitions across both conversational keys and canonical labels, correctly preservingoriginalTermand aligning architecture and configuration documentation (#70). - Expanded Test Suite (247 Passing Tests): Added 71 new automated unit and adversarial tests covering batch edge conflicts, slug identity invariance, graph topology weights, simulation scaling, and relation vocabulary resolution (#67, #70, #73, #74, #75, #80, #82).
Changelog
Fixed
- Honor reversed direction and accurate
originalTermresolution for relation definitions in save pipeline, and align vocabulary documentation (#70). - Treat
INDEPENDENT_OFrelations as neutral baseline graph weight instead of strong attraction in 2D force layout (#68). - Precompute note token sets in
$O(N)$ instead of$O(N^2)$ pairwise re-tokenization, and eliminate inner-loop string allocations during 2D force layout (#80). - Eliminate redundant similarity matrix rescaling inside 2D force layout projection, preserving single-ownership and caller-provided affinities (#75).
- Add SHA-256 identity suffixes to bounded relation filenames to distinguish folder/punctuation collisions, while preserving legacy paths for edits and duplicate detection (#74).
- Save replacement relation files and graph edges before deleting previous data; reject duplicate batch targets and prevent create races from overwriting other relations (#73).
- Enforce exclusion rules in GraphRAG context enrichment, preventing excluded notes from polluting prompt context (#82).
- Render distinct, semantic palette colors for relation types in 2D scatter plot across default ("ink") and "muted" visual styles, with dedicated colors for all 13 canonical Cypher relation labels (#62).
Documentation
- Document canonical Cypher relation labels in active dropdown and conversational phrase mapping in
buildConversationalCategoriesas planned Issue #43 expansion (#70). - Correct unsubstantiated 15x math weighting claim, align layout force equations and initial PCA placement descriptions with implementation, fix custom endpoint defaults and setting section order, and update version and test count badges (#67, #68, #71).
Installation & Upgrade
Community Plugins (Automatic)
Search for MemVector Knowledge Engine in Obsidian Community Plugins and click Update (or Install).
Manual Installation
- Download
main.js,manifest.json, andstyles.cssfrom the release assets on GitHub. - Copy all three files into your vault's plugin directory:
<vault>/.obsidian/plugins/memvector-knowledge-engine/ - Reload Obsidian or toggle the plugin off and on under Settings → Community Plugins.
0.1.4
Release 0.1.4 — Organic 2D Manifold Layout, Canonical Relations & Full Audit Resolution
Release Version:
0.1.4
Release Date:2026-09-16
Target Obsidian Version:>= 1.11.4(Desktop)
Assets:main.js,manifest.json,styles.css
Overview
Release 0.1.4 is a major milestone that pairs an entirely rewritten, organic 2D vector canvas experience with the complete resolution of the codebase audit findings (Groups A & B).
The rigid carousel anchors, static polar grids, and frozen phyllotaxis spirals have been replaced by a continuous 2D manifold simulation initialized via PCA and refined through simulated annealing force-directed dynamics. Semantic clusters now naturally group and separate, cross-cluster bridge notes link smoothly, and single-note cluster halos are suppressed.
Alongside the visual overhaul, all core audit findings have been resolved: 13 canonical relation types are exposed directly without synonym loss, note identity is strictly injective across folders and punctuation, relation file edits are protected against silent overwrites, full vault note bodies are fed to GraphRAG synthesis, canvas view filtering is cleanly decoupled from indexing exclusions, and an automated GitHub Actions CI gate guards every commit.
Highlights
- Organic 2D Manifold Simulation & Force-Directed Clustering: Replaced rigid concentric circle layouts with an organic force-directed physics engine. Nodes initialize via 2D PCA/spectral layout, dynamic cosine similarity rescaling stretches cluster distances, and simulated annealing cools velocities into stable, natural semantic landscapes (#39, #40, #41, #42).
- 13 Canonical Cypher Relation Types: The relation builder dropdown now directly offers the 13 canonical Cypher relation types (
IMPLIES,EQUIVALENT_TO,CONFLICTS_WITH,INDEPENDENT_OF,REQUIRES,GENERALIZES,SPECIALIZES,EXTENDS,REDUCES_TO,CONSTRUCTS,EMBEDS_IN,REFUTES,ANALOGOUS_TO), eliminating lossy multi-synonym collapse while retaining custom relation flexibility (#43, #44). - Relation Overwrite Protection: Modifying a relation edge's type now pre-checks the target file path (
findRelationPathConflict). If a relation note or custom note already exists at the target path, the mutation is safely blocked with a clear user notice rather than silently overwriting user data (#14, #50). - Injective Note Identity Across Folders & Characters: Path-to-ID generation (
pathToId) preserves directory structure and URI-encodes spaces and special characters. Files likeWork/Overview.md,Work-Overview.md, andWork Overview.mdmaintain distinct identities, preventing graph and vector store collisions (#12, #51). - Live Vault Re-Reads for GraphRAG Vector Neighbors: Context enrichment re-reads full, current note bodies directly from the vault for vector neighbors, matching active notes and ensuring fresh content reaches LLM synthesis (#15, #46).
- Decoupled Transient Canvas Filter: The canvas view filter (
viewFilterQuery) is now an ephemeral, in-memory filter bar that does not touch persistent indexing settings, and hardcoded domain preset keywords have been removed (#45, #47). - Transparent SQLite Persistence Feedback & Test Coverage: Persistence errors during manual or background vector recalculation are surfaced as
[ERROR]notices, suppressing false[OK]success messages when vectors remain only in volatile WASM memory, backed by comprehensive end-to-end unit tests simulating persistence errors and reconcile rejections (#9, #48, #55). - Full UI & Button Localization: All settings action buttons (Ollama/OpenAI test connection, vault indexing), scatter toolbar actions, and sidebar headings are fully translated in German and English, immediately updating on language dropdown change (#55).
- Graph Sync Exclusions & Zero-State Reconciliation: Exclusion patterns are strictly honored during graph sync, and empty vault states (such as deleting all notes or excluding all files) fully reconcile SQLite stores to zero (#10, #52).
- Global Exclusion Scope Clarification & Clean Defaults: Clarified Path & File Exclusions descriptions to explicitly state their global effect across vector calculation, SQLite storage, graph sync, and canvas rendering, while standardizing agent guideline path defaults to vault-native
AGENTS.md(#57). - Case-Insensitive Relation Edge Matching & Force Updates: Fixed node lookup in topology force weights, edge rendering, hit-testing, and hop reachability to be case-insensitive, guaranteeing that newly created or capitalized relations immediately exert physical spring/repulsion forces and draw on the canvas (#58).
- Automated GitHub Actions CI Quality Gate: Added
.github/workflows/ci.ymland.github/PULL_REQUEST_TEMPLATE.mdensuring typecheck, lint, test, and production bundle builds pass automatically on every PR (#21, #53). - Cleaned Documentation & Localization: Purged 7 obsolete projection modes from user guides and eliminated dead i18n keys (#38, #49).
Changelog
Added
- Organic 2D manifold simulation and force-directed layout with PCA/spectral initialization and simulated annealing cooling, replacing rigid circular carousel anchors and frozen phyllotaxis spirals (#41, #42).
- Dynamic similarity matrix rescaling (
rescaleSimilarityMatrix) stretching off-diagonal cosine similarities to[0, 1], restoring organic semantic cluster separation on the canvas (#39, #40). - 13 canonical Cypher relation types (
IMPLIES,EQUIVALENT_TO,CONFLICTS_WITH,INDEPENDENT_OF,REQUIRES,GENERALIZES,SPECIALIZES,EXTENDS,REDUCES_TO,CONSTRUCTS,EMBEDS_IN,REFUTES,ANALOGOUS_TO) directly exposed in the relation builder dropdown without lossy synonym projection (#43, #44). - GitHub Actions CI workflow (
.github/workflows/ci.yml) and Pull Request template (.github/PULL_REQUEST_TEMPLATE.md) for automated typecheck, lint, test, and bundle verification on PRs and default branch pushes (#21, #53). - Conflict guard (
findRelationPathConflict) in relation builder modal preventing silent overwrites of user notes or metadata on edge type modifications (#14, #50).
Fixed
- Fetch fresh note body from vault for vector neighbors during GraphRAG context enrichment instead of using truncated canvas previews (#15, #46).
- Decouple transient canvas view filter (
viewFilterQuery) from persistent indexing exclusions, removing confusing preset domain filters from settings (#45, #47). - Surface SQLite persistence failures as visible
[ERROR]notices in the canvas toolbar while suppressing misleading[OK]status, and add comprehensive test coverage simulating persistence failures and reconcile rejections (#9, #48, #55). - Fully localize settings action buttons (API testing, vault indexing), scatter toolbar tooltips, and sidebar headings across German and English, dynamically updating UI on language switch (#55).
- Remove 7 obsolete projection mode references from user documentation and clean orphaned translation keys (#38, #49).
- Ensure injective note IDs in
pathToId()across directory paths and special characters via URI encoding, preventing collisions across folders and naming variations (#12, #51). - Pass exclusion patterns to graph sync and allow full zero-state database reconciliation when files or notes are deleted (#10, #52).
- Clarify Path & File Exclusions description to accurately describe global scope across vector indexing, graph sync, and 2D Graph, and clean agent guideline defaults to
AGENTS.md(#57). - Match relation edges case-insensitively across force layout topology weights, canvas edge rendering, hit-testing, and hop reachability, ensuring newly created or capitalized relations immediately update graph physics and visual connections (#58).
- Document data safety status and residual risks regarding relation overwrite and exclusions in README and release documentation (#36).
Installation & Upgrade
Community Plugins (Automatic)
Search for MemVector Knowledge Engine in Obsidian Community Plugins and click Update (or Install).
Manual Installation
- Download
main.js,manifest.json, andstyles.cssfrom the release assets below. - Copy all three files into your vault's plugin directory:
<vault>/.obsidian/plugins/memvector-knowledge-engine/ - Reload Obsidian or toggle the plugin off and on under Settings → Community Plugins.
0.1.3
Release 0.1.3 — Functional Hardening, Graph Identity & GraphRAG Synthesis Overhaul
Release Version:
0.1.3
Release Date:2026-09-14
Target Obsidian Version:>= 1.11.4(Desktop)
Assets:main.js,manifest.json,styles.css
Overview
This release delivers significant hardening and core fixes from the comprehensive functional audit across data durability, note and graph identity, settings correctness, and GraphRAG context synthesis.
As an early-stage 0.1.x release under active development, several review findings have documented partial fixes with tracked residual gaps (see open issues) rather than full resolutions. Key improvements include surfaced SQLite serialization errors, path-derived node identities resolving same-basename folder collisions, interactive multi-relation fanning on the 2D canvas, and synthesis context sourced from full note bodies with a user-configurable character cap.
Highlights
- Data Durability & Safe Persistence: SQLite disk serialization failures (
adapter.writeBinary) are now reliably propagated to callers, triggering visible error notices ([ERROR] Sync-Fehler) rather than false success states when vectors exist only in volatile WASM memory (#9). In addition, relation file modification is atomic: previous files are only cleaned up after new files are confirmed written (#14; changing an existing relation's type to another type already present for that note pair remains tracked as an open issue). - Path-Based Identity Across Folders: Established a uniform, path-based node identity contract (
pathToId(path)) across the vault scanner, graph sync, and vector store. Notes sharing identical filenames across different folders (e.g.Work/Overview.mdvs.Home/Overview.md) no longer collide or overwrite each other in the graph or SQLite database (#12; edge cases with slug collisions on punctuation remain tracked). - Uncapped Synthesis Content & Full-Note Re-Reads: Selected notes are freshly re-read from the vault at synthesis time instead of reusing the 800-character canvas layout preview. A new setting
synthesisContentCapChars(defaulting to0/ unlimited) eliminates rigid cutoffs and allows full note text to reach capable LLMs (#15; vector neighbor retrieval preferring index-time payloads remains tracked). - Interactive Multi-Relation Canvas: Multiple relations connecting the same pair of notes no longer collapse into one hidden line. Connections render cleanly as a single line by default, smoothly fanning out into interactive quadratic-bezier curves on hover with individual hit-testing for every strand (#29).
- Semantic Graph Layout Pre-Hydration: Stored embeddings and typed relations are loaded into memory before force layout calculation, ensuring the 2D canvas clusters semantically immediately upon opening rather than falling back to text heuristics (#13).
- Full Re-Index Reconciliation: Re-indexing purges deleted/renamed notes, removed WikiLinks, and newly-excluded files from SQLite tables. Runtime existence checks prevent deleted notes from surfacing in GraphRAG context between index runs (#10; note that vault exclusions currently apply only to vector indexing, so excluded notes can still appear as graph neighbors).
- Native SecretStorage Integration: Settings strictly adhere to Obsidian's SecretStorage contract, storing secret reference names and dynamically resolving API keys at request time. Supports automatic legacy migration and live credential rotation without re-selection (#8).
- Testing Infrastructure: Added a local mock echo server (
testing/mock-echo-server.js) and a disposable test vault fixture (testing/fixtures/smoke-test-vault) for offline integration testing without external API dependencies (#34).
Changelog
Added
- Reusable local mock echo server (
testing/mock-echo-server.js) and disposable smoke-test fixture vault (testing/fixtures/smoke-test-vault) for offline manual and automated verification (#34, #35).
Fixed
- Align documentation with actual implementation across README, ARCHITECTURE, GRAPHRAG, and TESTING guides: clarify PCA as the single implemented projection mode (#16), scope of offline/zero-setup operation (#17), add
styles.cssto manual install steps (#18), and correct stale GraphRAG default parameter values (#19, #33). - Allow full note content in LLM synthesis via configurable
synthesisContentCapCharssetting (defaulting to 0 / unlimited), re-reading full note bodies instead of using the 800-char canvas preview and removing hardcoded 300-char neighbor excerpt truncations (#15, #32). - Disambiguate multiple relations between the same note pair on the 2D canvas by retaining distinct relation types during edge loading and fanning overlapping connections into expandable quadratic-bezier curves on hover (#29, #31).
- Include relation type in relation file paths to prevent overwriting existing relation files when multiple types connect the same note pair, and preserve the previous file until the new one is confirmed written (#14, #28).
- Hydrate stored embeddings and load relation edges before calculating the 2D vector graph layout, and re-run layout on relation mutations, ensuring semantic clustering and topology weights take effect without falling back to text heuristics (#13, #27).
- Reconcile deleted/renamed notes, removed WikiLinks, and newly excluded files during full re-indexing across both graph and vector stores, and verify target file existence at retrieval time to prevent stale content from entering synthesis context (#10, #26).
- Unify note identity across scanner, typed relations, and graph sync via canonical path-based IDs, eliminating note collisions for same-basename files across different folders and ensuring immediate GraphRAG visibility for newly saved relations (#11, #12, #25).
- Resolve SecretComponent-selected secret by name instead of using the secret reference name as the literal API key (#8, #24).
- Propagate SQLite persistence failures to callers instead of swallowing errors in background queue (#9, #23).
- Respect configured radar note count on canvas instead of flooring at 15 (#20, #22).
Installation & Upgrade
Community Plugins (Automatic)
Search for MemVector Knowledge Engine in Obsidian Community Plugins and click Update (or Install).
Manual Installation
- Download
main.js,manifest.json, andstyles.cssfrom the release assets below. - Copy all three files into your vault's plugin directory:
<vault>/.obsidian/plugins/memvector-knowledge-engine/ - Reload Obsidian or toggle the plugin off and on under Settings → Community Plugins.