Releases: grotyx/rag-obsidian
Releases · grotyx/rag-obsidian
Release list
0.8.2
Changed
- Korean summaries keep medical terms in English ("Degenerative spondylolisthesis 환자에서 decompression
단독군과…"). In a blinded review, mistranslated terms were the most common summary error
(cauda equina syndrome → a spinal-tumor syndrome, PACU → ICU); term accuracy rose 4.3 → 4.8 of 5. - MCP
search_libraryreranks by default (passrerank: falseto skip) and reportsreranked/
rerankSkipped.
Added
- A notice when reranking is skipped and why (OpenRouter's daily free-model cap, a rejected key, no
credits, a missing model, a timeout) — before, results silently fell back to retrieval order. search_findingsflagsrestatedfindings — a quote reporting another study's result ("X et al.
reported…", "[7]", "previous studies") — and ranks them below the paper's own results.
Changed
- The search index no longer uses Orama at runtime. A compact BM25 index (
index/textIndex.ts)
that keeps postings and passage text in typed arrays replaces it, with identical rankings (unit
parity against Orama; 30/30 identical top-10 on real queries). On a 106k-passage library the index
takes ~45 MB of JavaScript heap instead of ~1.85 GB, loads in 4.7 s instead of 18 s, and searches in
~140 ms instead of ~240 ms — Obsidian's renderer has a fixed ~4.4 GB heap, which a large library
(and especially a rebuild) had been exhausting. - Index rebuilds stream in 400-note windows instead of holding every passage and embedding until
the end, anddocs.jsonis written in pieces instead of one 150 MB string: a 19k-note rebuild had
crashed the renderer; its heap peak is now 3.4 GB instead of 4.1 GB (of a ~4.4 GB cap).
Fixed
- The search index no longer lives in the OS cache folder (Keep the search index outside the
vault):~/Library/Caches/~/.cacheare emptied by cleaner apps and the OS, and the 0.5 GB index
vanished, forcing a rebuild. It now lives in the app-data folder (~/Library/Application Support,
~/.local/share; unchanged on Windows), and an index found in the old place is moved once.
0.8.1
Added
- Finding-level search — MCP tool
search_findings: finds the relevant papers with the normal
search, then returns their individual results (outcome, comparison, timepoint, n, effect size, CI,
p, direction, and the verbatim quote), reranked against the question. Reads a note's
## Evidence (extracted)section (a collapsed callout of Dataview inline fields); the section is
kept out of the search index, so it costs no memory.scripts/evidence-from-rag-research.mjs
fills that section from rag_research extraction JSON (matched by PMID/DOI, verbatim quotes only).
Changed
- Reranking scores the paper (title + abstract, one document per paper) over a 3× candidate pool
instead of each passage over a 2× pool, and the default rerank model is now
voyageai/rerank-2.5-lite(about $0.0002 a search). The free Nemotron model of 0.8.0 stops working
after OpenRouter's daily free-tier cap (50 requests on a small balance) and then silently fell back
to retrieval order; settings still on it move to the new default. Held-out nDCG@10: 0.76 → 0.81
(English), 0.77 → 0.83 (Korean); a search is about a second faster. - The search vocabulary and MeSH synonyms load at startup instead of on the first search, and query
embeddings are cached (first search ~7 s → ~4.5 s; a repeated question skips the embedding call).
Fixed
- Chat kept no reranker at all when the hosted reranker was on but no OpenRouter key was set (Anthropic
/ Ollama users with Rerank chat results with the LLM); the LLM reranker now applies in that case. - The search vocabulary is picked up when its file is created or renamed onto the configured path,
not only when edited. - A vocabulary edit during Build MeSH synonym list for search no longer drops the headings fetched
so far.
0.8.0
Retrieval, measured. A 96-question held-out benchmark (English and Korean versions of each
question, LLM-judged pooled relevance) drove every default below; on a 16,578-reference library
nDCG@10 went from 0.53 to 0.78 for English questions and from 0.18 to 0.78 for Korean ones.
Added
- Cross-encoder reranking (OpenRouter
/rerank, freenvidia/llama-nemotron-rerank-vl-1b-v2
by default) for the search pane and chat — the largest single gain (English nDCG@10 0.62 → 0.78),
about one second per search. Replaces the LLM reranker when on; falls back to retrieval order on
any failure. MCPsearch_librarytakesrerank: trueto use it. - Translate non-English searches. A Korean question sat far from its English twin in embedding
space (cosine ≈ 0.45), so the search pane and chat translate it to English with the chat model
first (one short request, cached). MCP never calls the plugin's LLM; its tool description asks the
agent to query in English. - Query expansion for the keyword half of every search: aliases from a user-owned search
vocabulary (JSON in the vault; any language — this is how Korean terms reach English papers) and
NLM MeSH entry terms for the library's common subject tags, built once with Build MeSH synonym
list for search and cached in the plugin folder. The meaning half keeps the user's words. - Diversify results (maximal marginal relevance) as an option; off by default — it measured
slightly worse here. scripts/eval/: the benchmark runner, judge and scorer. Questions and judgments stay local
(_eval/, git-ignored).
Changed
- Search index memory: vectors live in one packed
Float32Arrayinstead of Orama documents —
about 1.4 GB less JS heap on a 59,000-passage index (3.7 → 2.3 GB, plus 0.5 GB outside the heap),
and local search 261 → 198 ms. The on-disk format is unchanged; no rebuild needed. - Score fusion: a keyword match only gets the vector half of its score when the embedding also
ranks it among the top 500 passages (Orama's formula gave every keyword match a vector share).
Measured better (English nDCG@10 0.55 → 0.63 with expansion).
0.7.9
Added
- Citations in Live Preview.
[@citekey]now shows as its styled label (superscript number,
[1]or author–date) while you edit, the same as in reading view; put the cursor on it to edit
the source. Turned off together with reading-view rendering by the existing setting. - Hover a citation in any view to see its authors, year, title and journal.
- Choose citation style…: search about 10,000 journal styles by journal name. Picking one sets
the open manuscript'scsl:(or the default style when no manuscript is open). The style list is
downloaded once from the Zotero style repository and cached for 30 days. - Check references in this manuscript: a report of every cited reference that is missing from
the library, retracted (checked live against OpenAlex), without a DOI/PMID, or missing title,
authors, year, journal, volume or pages. - Import straight from Zotero 7: Import references → From Zotero reads the whole library or
one collection from a running Zotero (enable Allow other applications on this computer to
communicate with Zotero in Zotero's advanced settings). Duplicates are skipped as with files.
Changed
- The MCP Stop server button no longer uses the deprecated
setWarning()(same look on every
supported Obsidian version).
0.7.8
Added
- User guide in English, Korean, Chinese, Japanese and Spanish (
docs/manual/), with numbered screenshots from the
real plugin, linked from both READMEs.scripts/manual/capture.py <lang>reshoots the
screenshots by driving Obsidian, so the guide can follow UI changes and new languages.
Fixed
- Citation styles renamed in the CSL repository resolve again:
csl: vancouver(now
nlm-citation-sequence) used to fail and fall back to APA. Unknown ids are looked up in the
repository'srenamed-styles.json. - Reading view re-renders a note's citations when its
csl:style or numbering changes;
paragraphs whose text had not changed kept their old labels until the note was reopened. - Superscript styles (Spine, AMA) keep superscript citations through Compile manuscript
(text<sup>1</sup>, with no space before the number) and Export to Word; the compiled copy
showed "text 1" and the Word file lost the superscript.
0.7.7
Fixed
- PDF highlights: a highlight with a malformed quad point no longer drops its text — the
annotation's own rectangle is added whenever any quad is unusable, not only when all are. - PubMed titles: entities are decoded — "&" stayed escaped. Decoding runs once, first, so
entity-escaped markup (<i>) is stripped like real markup and&lt;stays "<";
numeric entities (β) decode too, through the same helper citeproc output uses. - Settings text fields keep what you type, spaces included: clearing "References folder",
"Ollama URL" or "OpenAI base URL" to retype it no longer snaps back to the default mid-edit, and
the empty field shows the default as its placeholder. One helper,effective(), trims the value
and applies the default (OpenRouter's base URL, not api.openai.com) wherever it is used. - OpenAI base URL / API key and Ollama URL show whenever either the embedding provider or the
chat LLM uses them — with embeddings on Ollama and chat on OpenRouter the key field was hidden. - Custom summary language no longer hides itself while you type (typing "en" made it vanish).
- Abstracts and titles: tag stripping keeps comparators ("grade IV", "ASA <I and
III") and still removes any real tag — JATS (
<jats:p>), MathML (<mi>),<scp>, and tags
with attributes. A tag is a name followed by>or byattr="value"pairs. - Settings search on 1.13+: every row is declared once with a
visiblerule, so a row shows
up in search as soon as it applies (e.g. "Ollama URL" right after switching the provider). The
definitions are now type-checked against Obsidian's ownSettingDefinitionItem(no cast). - Ollama embeddings are validated with the same
isNumberArraycheck as the OpenAI path.
Changed
- Release workflow split: a read-only
buildjob runsnpm ci, lint, build and tests; only
thepublishjob holds write, OIDC and attestation permissions, and it signs the artifact the
build produced. Code from a dependency no longer runs with a token that can create releases or
request a signing token; the attestation still only proves which workflow and commit built the
files. - The 0.7 talk ships as a narrated video (
presentation/v07/video/): MiniMax Speech 2.8 HD via
OpenRouter, every sentence transcribed back and checked against the script, deck frames
rendered exactly, captions and chapters for YouTube.
0.7.6
Changed
- Settings are searchable on Obsidian 1.13+. The settings tab is described once as
declarative definitions (getSettingDefinitions()), which 1.13+ renders and indexes for its
settings search ("Contact e-mail", "OpenRouter", "API key" now find the plugin). On 1.11.4–1.12
display()draws the same definitions with the older Setting API, so there is one source of
truth. Password fields and multi-button rows (MCP, CLI test) use the definitions'renderrows. - One PubMed record mapping. Add-by-PMID and PubMed search shared a copy-pasted esummary →
CSL conversion that had drifted; both now useesummaryToItem. Titles have HTML tags stripped
in search results too, PMCID is set in both paths, and the first DOI/PMC article id wins. - CI on Windows, macOS and Linux (
.github/workflows/ci.yml): lint, build, unit and MCP
tests on every push, including a real.cmdspawn test for the CLI providers on Windows.
Fixed
- MCP on Windows: the bridge resolved the vault with the JS
realpathSync, the plugin with
nativerealpath; on Windows only the native one expands 8.3 short names (RUNNER~1), so the
two sides hashed different paths and the bridge never found the server. Both use native now.
Found by the new Windows CI job.
0.7.5
Changed
child_processis required directly again in the Codex/OpenCode CLI provider and the Word
export. Routing it through the sharednodeRequirehelper in 0.7.4 hid it from the Community
review's static scan, so the review stopped reporting that the plugin runs external programs.
It does (only when those features are used, and the README says so); the scan should see it.- Embedding vectors and PDF highlight rectangles are checked with an
isNumberArraytype guard
instead of a cast.
0.7.4
Answers the Community directory's automated review of 0.7.3.
Changed
- Type-checks without
@types/node. The review lints without Node's type definitions, so
everytypeof import("node:…")in the desktop-only files (local index cache, Codex/OpenCode
CLI, MCP bridge and server, Word export) became an unresolved type and hundreds of
type-safety warnings. Those files now use small local interfaces for exactly the Node APIs
they call (src/util/nodeTypes.ts), andtsconfig.jsonsets"types": []so the local lint
sees what the review sees. Runtime code is unchanged. - Releases are built, attested and published by GitHub Actions when an
X.Y.Ztag is
pushed (.github/workflows/release.yml), somain.js,manifest.jsonandstyles.csscarry
build-provenance attestations. - Dropped the unused
js-yamland@orama/plugin-data-persistencedependencies.
Fixed
- A CLI process error always rejects with an
Error.
0.7.3
Answers the Obsidian Community directory's automated review.
- Minimum Obsidian version is now 1.11.4. API keys are kept in
secretStorage, which arrived in 1.11.4; using it under an olderminAppVersionwas the review's one error. LICENSEis the plain MIT text so it is recognized; the CC BY-SA 3.0 note for the bundled CSL styles moved toTHIRD_PARTY_NOTICES.md.- Dev-only:
builtin-modules→node:module,js-yaml→yamlin tests. - Fixes: numeric tags and PMIDs from unquoted YAML, Ollama embedding validation, PDF highlight boxes from malformed points, UI text that quotes other labels.
Lint at the review's severity: 0 errors, 2 warnings (both ask for Obsidian 1.13 APIs: declarative settings and setDestructive).
Full details in CHANGELOG.md.