Nickolay Kondratyev467 downloadsSearch your vault (Notes, Canvas, Images) with hybrid semantic and lexical retrieval, powered by an on-device embedding model.
Seeker is a fork of Obsidian-Seek by Ryan Manor. It is maintained by nickolaykondratyev at nickolay-kondratyev/Obsidian-Seeker and, like the original, is released under the MIT License. See License and Attribution.
Fork born due to being able to add Canvas and Image OCR support as well flag performance issues clearly (when GPU is not used) While there is no PR access to Seek (Ref: https://github.com/ryan-manor/Obsidian-Seek/issues/6).
Seeker is an Obsidian native hybrid search for Obsidian vaults, built to find buried information in large and complex vaults. It combines dense semantic embeddings with lexical (keyword) search to find exactly what you're looking for, all running within Obsidian. No APIs, or local servers needed.
Relevance has been tested and evaluated on hundreds of thousands of queries and notes, and offers easy customization to best suit your vault.
.base) and Canvas boards (.canvas) — the last two can be switched off in settingsSeeker shares its engine with the original Seek project, so its documentation still applies: the user guide can be found here, and more information about relevance tuning and evaluation is here.
Seeker embeds your notes with a local embedding model (by default the IBM Granite multilingual model, ~100 MB) and fuses those semantic scores with a lexical BM25 ranker. Indexing, embedding, and ranking all happens within Obsidian. Your notes and queries never leave your machine.
Seeker can read the text in your images — screenshots, photos of whiteboards, scanned pages — so it turns up in search. It is on by default; toggle it under Settings → Index (advanced) → Index text in images (OCR).
<your index folder>/ocr/ inside the vault, so it syncs with everything else and no image is ever OCR'd twice across your devices.png, jpg, webp, gif and bmp are supported. svg and heic/heif are skipped (the settings tab shows how many).eng deu fra) in settings. Each language pack downloads once (see Network Use) and is cached like the model. Changing the languages never re-OCRs images already cached — use Rebuild OCR cache for that.Seeker runs the embedding model locally, but it has to download the model and its runtime once per device, the first time you index a vault:
huggingface.co) — the IBM Granite multilingual embedding model (~100 MB, quantized).cdn.jsdelivr.net).If you enable image OCR (desktop only), the OCR engine and its language data are also downloaded once per device, and only then:
cdn.jsdelivr.net).tessdata.projectnaptha.com).These downloads happen only when the assets are not already cached. They are cached on-device afterward, so there are no repeat downloads, and Seeker works fully offline once the assets are in place. Only these model and OCR assets are ever fetched. No note content, image data, query text, or usage data is transmitted.
Seeker runs the embedding model on your GPU through WebGPU when it can, and falls back to the CPU (WASM) otherwise. Search works either way, but indexing on the CPU is much slower. On Linux, Obsidian's Electron often ships with WebGPU disabled: navigator.gpu exists but no GPU adapter is handed out, so Seeker silently lands on the CPU even with Compute → Force WebGPU set. Seeker tells you when this happens: the top of its settings tab reads "Running on: CPU (WASM). WebGPU was requested but …", and a pop-up appears whenever a full reindex starts.
Verified fix (2026-09-02, Fedora Linux, AMD Ryzen AI MAX+ 395 with Radeon 8060S, Obsidian 1.13.7 Flatpak, Electron 43 / Chrome 150). Launch Obsidian with these flags:
--enable-features=Vulkan,VulkanFromANGLE --use-angle=vulkan --enable-unsafe-webgpu --ignore-gpu-blocklist
~/.var/app/md.obsidian.Obsidian/config/obsidian/user-flags.conf, then restart Obsidian.obsidian <flags>, or add the flags to the Exec= line of Obsidian's .desktop file.Verify: open the developer console (Ctrl+Shift+I) and run await navigator.gpu?.requestAdapter(). It should return a non-null adapter whose info.vendor is not google (google is Chromium's software renderer, which Seeker rejects because it is slower than the CPU). Seeker's settings tab then shows "Running on: WebGPU — ".
If it still does not work: add --ozone-platform=x11 (Wayland issues). Add --disable-gpu-compositing only if you see grey video artifacts. To silence the warning instead, pick Compute → Force CPU in Seeker settings.
npm run test:e2e:obsidian drives a REAL Obsidian (Electron) under Playwright
against a vault assembled from the committed e2e corpus, and asserts on the
search modal's rendered DOM. Linux auto-downloads a pinned Obsidian; headless
flags are defaulted when no display exists. See docs/e2e-obsidian.md.
npm run test:e2e:obsidian # whole suite
npm run test:e2e:obsidian -- search.e2e.ts # extra args pass through to Playwright
# macOS: point at the installed app (no auto-download outside Linux)
OBSIDIAN_PATH='/Applications/Obsidian.app/Contents/MacOS/Obsidian' npm run test:e2e:obsidian
| Env var | Meaning |
|---|---|
OBSIDIAN_PATH |
Obsidian binary to drive; when unset, Linux downloads a pinned build. |
OBSIDIAN_VERSION |
Overrides the pinned version for the auto-download (default 1.12.7). |
OBSIDIAN_E2E_EXTRA_ARGS |
Extra Chromium/Electron flags; an explicit value disables the headless auto-default. |
OBSIDIAN_CACHE_DIR |
Where downloaded Obsidian builds are cached (default ~/.cache/obsidian-e2e). |
npm run test:e2e runs the retrieval gate (docs/e2e-retrieval.md) and then this suite.
Seeker writes diagnostic logs (indexing progress, search activity, and errors) to local files inside your vault to help debug performance and relevance. These logs stay on your device and are never transmitted anywhere. Additionaly, diagnostics for search and relevance can be generated which creates a report of your recent searches, with note titles, and metadata included. Results content is not included in these reports, and the reports are written to Seeker's local plugin folder.
Seeker transmits no logging or data to me about your index, or your queries.
Seeker is a fork of Obsidian-Seek by Ryan Manor, and is released under the MIT License (see LICENSE). The original copyright notice is retained alongside the fork's.
It builds on:
Third-party test data committed under e2e/datasets/*/ is NOT under this repo's MIT license; see each folder's LICENSE-DATA.md for its terms (e.g. BEIR CQADupstack-android content is CC BY-SA 4.0).