Skip to content

Releases: Saiki77/smart-related-notes

1.11.1

25 Jun 23:56

Choose a tag to compare

v1.11.1: clean heading breadcrumbs in structure-aware chunking

Live verification (running the new chunker against real notes in Obsidian's console)
confirmed the rewrite works end to end — whole-note coverage with the longest notes
previously losing ~96% of their content to the 1500-char cap, real headings detected
(19 sections in one note), every chunk within the token budget (0 over 480). It also
surfaced one cosmetic issue, fixed here:

  • splitIntoSections now strips inline markdown (bold, italic, code, [[links]])
    from heading text, so a heading like # **Stage A — Ethereal Artificer:** yields the
    breadcrumb "Stage A — Ethereal Artificer:" instead of carrying the literal ** markers
    into the heading-context embed prefix. Cleaner context for the embedder.
  • INDEX_VERSION 5 -> 6 so any index already built on 1.11.0 re-embeds once with the
    cleaned prefixes.

1.11.0

25 Jun 23:40

Choose a tag to compare

v1.11.0: whole-note structure-aware chunking (foundational embedding overhaul)

Notes are no longer truncated to 1500 chars and chunked by blind sentence windows.
The whole note is now split at LOGICAL boundaries into coherent idea-chunks, so a note
is an overall embedding PLUS a set of section-level chunks other notes/queries align
with section-by-section.

  • splitIntoSections(): parse the raw note into sections at ATX headings (code-fence +
    frontmatter aware), carrying a heading breadcrumb; headings are the primary idea
    boundary, paragraphs the secondary one. A window never crosses a section/paragraph.
  • splitToBudget(): hard char guard (MAX_CHUNK_CHARS=480 ≈ 120 tokens) splitting any
    window at sentence then whitespace boundaries so the model never silently truncates
    a chunk (EN + DE). TARGET_WORDS 60->80.
  • Whole-note coverage: removed embedCharLimit truncation entirely; chunk-count cap
    16->48 (adaptive tiers raised), over-cap keeps every section's first window.
  • Heading context (new setting, default on): the first chunk of each section embeds
    with a "Note > H1 > H2:" breadcrumb prefix (embed input only; raw text kept for
    snippets), the LLM-free contextual-retrieval trick, scoped to avoid embedding
    collapse. The window is clamped so prefix+window stays within the token budget.
  • INDEX_VERSION 4->5: one-time full re-embed on update. meanVector + biMax unchanged
    (better inputs). Both build() and embedFile() embed via a shared chunkEmbedInput()
    helper so the full and incremental paths can't diverge.

Verified by a research-backed design pass + an adversarial review (fixed a high-sev
incremental-path regression and a prefix-budget truncation before shipping).

1.10.0

25 Jun 22:59

Choose a tag to compare

v1.10.0: semantic search box in the panel

A magnifier in the panel header (next to the rebuild icon) opens a search box that
ranks the whole vault by meaning against a typed query (e.g. "goa characters",
"proofwork"), on the same mean-centered scale as the related-notes cards.

  • store.rankByQuery(query): embeds the query, centers it with the corpus centroid,
    ranks entries by cosine to their centered means (floor = min(minSimilarity, 0.12),
    topK). Keyword fallback (query tokens vs note paths, excludes respected) when the
    engine can't embed or the index is empty, and on an embedding-dim mismatch.
  • view: toggle search input; debounced; async results guarded against stale runs;
    render() yields to an active search; debouncers cancelled on close.

Verified by an adversarial review (verdict: ship).

1.9.1

25 Jun 21:58

Choose a tag to compare

v1.9.1: fix cards showing through the panel header while scrolling

The header was position:sticky inside a single scrolling view, which let cards
render over/through it during scroll momentum. Switch to a flex column: a fixed
header (flex:0 0 auto) plus the card list as its own scroll area
(flex:1; min-height:0; overflow-y:auto), so cards can never paint outside the list.

1.9.0

25 Jun 21:29

Choose a tag to compare

v1.9.0: recent notes in the empty panel + link-suggestion folder exclusion

  • When no note is open, the panel now lists recent notes (recently opened, falling
    back to recently modified) as clickable cards instead of "No active note."
  • New setting "Folders excluded from link suggestions": notes in these folders stay
    indexed and ranked in the panel but are never offered as inline [[link]] targets.
    The TitleIndex now skips the union of the index-excluded folders and this list, so
    "Excluded folders" also implies no link suggestions (an excluded folder is fully
    excluded). Changing either list marks the TitleIndex dirty so the glow updates.

1.8.5

25 Jun 18:15

Choose a tag to compare

v1.8.5: docs-only release (remove em dashes from the README)

No code changes; version bump to ship the README formatting cleanup.

1.8.4

25 Jun 15:06

Choose a tag to compare

v1.8.4: rename plugin id + repo to smart-related-notes

The plugin id was related-notes, which is already taken by another community
plugin of the same id ("Related Notes" by mrboxtobox). Obsidian requires globally
unique plugin ids, so the directory submission was rejected with "An entry with this
ID already exists." The display name "Smart Related Notes" was never the problem.

Rename the id and the GitHub repo to smart-related-notes (display name unchanged).
Also updated to match: the runtime plugin-folder path (self-hosted wasm lookup), the
sidebar view type (avoids clashing if both plugins are installed), the release zip /
packaged folder, the package name, and the manual-install docs. Internal console log
prefixes and CSS class names are intentionally left as-is (no conflict).

Existing BRAT installs should be removed and re-added from Saiki77/smart-related-notes;
because the plugin folder changes, settings and the index rebuild fresh.

1.8.3

25 Jun 14:09

Choose a tag to compare

v1.8.3: revert auto->WebGPU (memory crash) + add Indexing speed setting

The 70GB memory crash returned: 1.7.0 made "auto" prefer WebGPU again, and onnxruntime
-web's WebGPU backend still accumulates GPU/unified memory across reindexes (and plugin
reloads) until Obsidian dies — per-pass tensor disposal wasn't enough. Revert: "auto"
(and "wasm") resolve to multi-threaded WASM, which is memory-stable (verified flat at
~9GB across 3 back-to-back reindexes, no growth). WebGPU stays available only as an
EXPLICIT pin, with a clear warning in the setting + README.

Multi-threaded WASM is fast (~28s) but its shared heap holds several GB while loaded,
and that cost is roughly the same at 4 or 8 threads (it's the model's working set, not
per-thread) — only single-threaded is light (~2GB) but slow (~2.5min). Since there's no
fast-AND-light option, expose the trade-off: a new "Indexing speed" setting
(Light = 1 thread / Balanced = ~cores/3 / Fast = cores-2 capped 8), default Balanced,
wired via setEmbedThreads(); changing it recreates the engine (configureEnv re-applies
numThreads) and rebuilds, exactly like a device change. Incremental per-note updates
stay fast at any setting. No INDEX_VERSION change.

1.8.2

25 Jun 13:34

Choose a tag to compare

v1.8.2: glow gate — only suppress off-topic CONTENT-RICH notes, let stubs glow

1.8.1 gated ALL empty stubs (glow only if structurally tied), which left notes with
NOTHING highlighted — e.g. an on-topic but empty "LLM" stub stopped glowing in an
essay about LLMs. Now that off-topic notes with real content (a math "Analysis" full
of calculus) are caught by the centered semantic test, the blunt stub rule is no
longer needed.

New glowAllowed: gate ONLY a content-rich target (chunkCount > 1) that is both
off-topic (centered similarity < GLOW_CONTEXT_FLOOR) AND not structurally tied (no
link either direction, no shared tag). Everything else glows — empty stubs (concept
placeholders to link/build out), on-topic notes, and linked/tagged notes. Extracted
the structural test into structurallyTied(). No re-embed.

Verified live: in the security essay, "analysis" (now a content-rich math note) stays
gated, while "llm" (empty stub) glows again — highlighting is back without the
off-topic noise.

1.8.1

25 Jun 12:53

Choose a tag to compare

v1.8.1: context-gate the glow — don't link a common word where it doesn't fit

The inline glow linked any exact title match, so "analysis" in a security note glowed
the unrelated math "Analysis" note. Gate each glow (and Link-all / auto-link) by
whether the target fits the active note's CONTEXT, via IndexStore.glowAllowed:

  • Content-rich target: keep only when its centered (topical) similarity to the
    active note clears GLOW_CONTEXT_FLOOR (0.15) — reuses the 1.8.0 mean-centering, so
    an off-topic note scores ~0 and is dropped.
  • Empty stub target: it carries no topic to judge (the title may be an ambiguous
    word), so glow only when there's an explicit structural tie — a link either
    direction or a shared tag. An isolated empty stub (bare "Analysis") has none, so it
    no longer glows off-topic.
    Wired via glowBridge.contextGate (set from main.ts), checked in buildGlow and
    detectMentions after resolve. Verified live: "analysis" no longer underlines in the
    security note (its math target is an isolated empty stub). Note: this also gates other
    isolated empty stubs (e.g. an empty "LLM" note) until they gain content or a link —
    inherent, since an empty note's topic can't be inferred; it self-heals as notes mature.