semantic-search

Search vault notes by meaning using local embeddings

SKILL.md

GitHub

Vault Semantic Search

Search the Obsidian vault by meaning, not just keywords. Uses local all-MiniLM-L6-v2 model — no API calls, no data leaves your machine.

Usage

# Search by meaning
node daemons/semantic-search/search-vault.js "your query here"

# Re-index (run after significant vault changes)
node daemons/semantic-search/embed-vault.js

# Re-index only changed files
node daemons/semantic-search/embed-vault.js --changed-only

Setup

cd daemons/semantic-search && npm install
node embed-vault.js  # Initial index (~30 seconds)

Confidential-class deny list

If your vault also holds client work, deal notes, or anything under NDA, keep it out of the index:

cd daemons/semantic-search
cp index-deny.example.json index-deny.json
# then edit index-deny.json and list your own folders

Each entry in deny_prefixes is a vault-relative path prefix, matched case-insensitively and with either slash style. embed-vault.js drops matching files before they are embedded, so their text never reaches embeddings.json (which stores note excerpts in plaintext). search-vault.js re-checks the same list at query time, so an index built before you added a prefix still can't return one.

Only index-deny.example.json is tracked by git. Your index-deny.json is gitignored, because the names of your confidential folders are themselves confidential. With no index-deny.json at all, both scripts index and search everything and print a notice on stderr saying so. If the file exists but can't be read or parsed, they exit non-zero instead of falling back to an unfiltered index. Add a prefix the same session confidential material enters your vault, then re-run embed-vault.js: it also purges anything already indexed under a newly added prefix.