7heozzz47 downloadsAsk AI questions about your vault in natural language. Semantic search over notes and PDFs, answers with clickable citations, running entirely on your own machine.
English · 简体中文
A local alternative to enterprise knowledge-QA products like Feishu/Lark — free, unmetered, and entirely on your own machine. Ask your Obsidian vault in natural language. Semantic and keyword search over notes and PDFs, answers with clickable citations, nothing ever leaves your computer.
The experience this is built for: hit a shortcut, a search box appears, type "what have I written about X" — no opening a sidebar, no picking files by hand first.
Home — takes over new tabs. A centered search box; click it or just start typing.

Ask — a shortcut opens the centered modal. Answers stream in with clickable sources at the end.

Read and ask side by side — the right pane stays open. Asking "summarise the page I'm on" reads only the PDF page you're currently viewing, and the citation links back to it.

Ask
Three surfaces, one conversation
Conversations move freely between all three, and can take over new tabs as a home page.
It knows what you're looking at
+ to pick specific files yourselfRewrite
Indexing
In a hurry? If you use Claude Code, Codex or a similar CLI agent, just hand it this README and let it do the install — see Method 2.
Download from obsidian.md. Requires 1.5.0 or newer.
This plugin is isDesktopOnly — desktop only (macOS / Windows / Linux). It will not run on mobile.
Ollama runs the models locally. Download from ollama.com/download.
After installing it runs as a background service on http://localhost:11434. Verify:
ollama --version
You need two kinds: an embedding model (for the index — required) and a chat model (for answers).
ollama pull bge-m3
bge-m3 · ~1.2 GB · 1024 dimensions · multilingual
If your vault contains any non-English content, use this one. It is the best multilingual embedding model that runs locally today. An English-only vault can use the smaller nomic-embed-text (274 MB) instead — but note that switching embedding models invalidates every existing vector and forces a full rebuild.
Apple Silicon users, read this. Ollama ships -mlx variants of these models that use Apple's native MLX backend. Measured at roughly 1.5× faster than the equivalent GGUF at the same size, with better grounding too. If an MLX build exists, use it.
| Model | Size | Decode speed* | Best for |
|---|---|---|---|
qwen3.5:4b-mlx |
4.0 GB | ~62 tok/s | Tight on RAM, or you want instant answers |
qwen3.5:9b-mlx |
8.9 GB | ~38 tok/s | Recommended — best balance |
gemma4:e4b-mlx |
8.8 GB | — | A different flavour, worth comparing |
* Measured on an M4 Pro (14-core CPU / 20-core GPU / 24 GB unified memory). Treat as relative, not absolute.
# Recommended
ollama pull qwen3.5:9b-mlx
# If the machine is tight on memory
ollama pull qwen3.5:4b-mlx
# To compare a different model family
ollama pull gemma4:e4b-mlx
Intel Mac / Windows / Linux: MLX is Apple-only. Drop the -mlx suffix; everything else is identical:
ollama pull qwen3.5:9b
All sizes and quantisations: qwen3.5 tags · gemma4 tags
Which matters more for speed, parameter count or quantisation? Measured answer: quantisation. At the same 9B, 4-bit is 1.5× faster than 8-bit; going from 4B to 9B only costs 1.65× (not the 2.25× the parameter ratio would suggest). With enough RAM, prefer a bigger model at lower precision over a smaller one at higher precision.
To ask questions about screenshots you need a model that can see. Note: Ollama's MLX backend cannot currently receive images — the model gets a placeholder and will confidently tell you it can't see anything. So the vision model must be a GGUF build (i.e. without the -mlx suffix).
ollama pull gemma4:e4b
The plugin has a separate "Vision model" setting so it can differ from your chat model — text quality and vision rarely come in the same package. After setting it, hit Test: capability tags reported by models are unreliable, so verify for real.
Method 1: From the community directory
Open it directly in Obsidian:
obsidian://show-plugin?id=lark-knowledge-ai
Or find it yourself: Settings → Community plugins → Browse → search for Lark Knowledge AI → Install → Enable.
Updates arrive through Obsidian like any other community plugin.
Method 2: Hand this README to an AI agent
If you use Claude Code, Codex or similar, just say:
Install Lark Knowledge AI for me following this README (attach this file)
Everything except the install click — Obsidian, Ollama, the models, the config — can be done for you. The equivalent commands, if you'd rather run them yourself:
# 1. Obsidian and Ollama
brew install --cask obsidian
brew install ollama
ollama serve & # macOS: start the service after installing
# 2. Models (embedding required; pick a chat model by available RAM)
ollama pull bge-m3
ollama pull qwen3.5:9b-mlx # 16 GB RAM or more
# ollama pull qwen3.5:4b-mlx # under 16 GB
# Not on Apple Silicon? Drop the -mlx suffix.
# 3. Install the plugin — easiest is to open this in Obsidian:
# obsidian://show-plugin?id=lark-knowledge-ai
# Obsidian has no CLI for installing plugins, so this one click is on you.
# 4. Optional: preset the chat model instead of picking it in settings
VAULT="$HOME/Documents/MyVault"
DIR="$VAULT/.obsidian/plugins/lark-knowledge-ai"
mkdir -p "$DIR"
cat > "$DIR/data.json" <<'JSON'
{ "chatModel": "qwen3.5:9b-mlx" }
JSON
The one step an agent cannot do: open Obsidian → Settings → Community plugins → enable Lark Knowledge AI. Obsidian exposes no CLI switch for this; you have to click it.
Once enabled you don't need to build the index manually — autoIndex is on by default, so the first file change kicks it off within 15 seconds. To start immediately, use the Build index button in settings.
Why is the config a single line? Settings are
defaults + data.jsonmerged, so you only write what you want to change. The endpoint (localhost:11434/v1), embedding model (bge-m3) and auto-indexing defaults are already correct.
Choosing a chat model is mostly about RAM, not CPU:
| RAM | Recommendation |
|---|---|
| 8 GB | qwen3.5:4b-mlx only, and turn off "Index PDFs" |
| 16 GB | 4b is comfortable, 9b is tight alongside other apps |
| 24 GB+ | 9b is comfortable |
A 9B model plus its context cache measures over 10 GB in practice. When RAM runs short macOS starts swapping — the symptom is "it works but is unbearably slow", not an error. Don't force it.
Open Settings → Lark Knowledge AI:
http://localhost:11434/v1bge-m3; hit its Test tooAll four green means you're ready to index.
The plugin turns your vault into a searchable vector index before it can answer anything.
Settings → Index status → Build index.
Progress shows in the status bar (Indexing 42/318). You can ignore it and keep using Obsidian.
How long? Depends on vault size. Rough orders of magnitude:
| Vault | Approximate time |
|---|---|
| A few hundred notes, no PDFs | 1–3 minutes |
| Plus a few dozen PDFs | 10–20 minutes |
| Hundreds of PDFs (including textbooks) | 30+ minutes |
PDFs dominate — a several-hundred-page book becomes thousands of chunks. You can turn off "Index PDFs" first, get notes working, then enable it.
Incremental updates happen automatically. Add, edit or delete files and the index updates itself after a 15-second debounce, touching only what changed — unchanged files are never re-embedded.
If you turn off "Auto-index", use the Update index button in settings instead.
Only two situations:
The Rebuild button wipes and re-runs everything. PDF text extraction is cached, so rebuilds don't re-parse PDFs — much faster than the first run.
| Action | Result |
|---|---|
| A hotkey you assign | Open the centered modal (none is bound by default — see below) |
| Click the ribbon icon | Same |
Command palette → Lark Knowledge AI: Ask |
Same |
Type and press Enter. Answers stream in, with references at the end.
Enter to ask · Shift + Enter for a newline · Esc to stop generating (press again to close)
No hotkey ships by default. Bind one under Settings → Hotkeys → search
Lark Knowledge AI.
These phrasings are recognised automatically:
| You ask | What happens |
|---|---|
| "What is this paper about?" | Searches only the file you have open |
| "What's on this page?" | Reads only the current PDF page |
| "What did I write last week?" | Only files modified in the last two weeks |
| "What have I read in the last three months?" | Time-filtered |
You can also be explicit: click + above the input in the side or center pane and pick one or more files — every question then searches only those. The file list is ordered by most recently opened.
Open in right pane / Open in center paneConversations are saved with the Obsidian workspace — collapsing the sidebar or restarting won't lose them.
Select some text, then:
Lark Knowledge AI: Rewrite selectionSix presets (tighter / clearer / more formal / key points / expand / to English), or write your own instruction.
The result is shown as a line-level diff — struck-through red is the original, green is new. Nothing touches your note until you click Replace selection.
Cmd/Ctrl + V a screenshot into the inputImages are downscaled to 1024px on the long edge before sending — vision models bill by image tile, and an un-resized Retina screenshot can fill the entire context on its own.
Command palette → Open home, or enable "Replace new tab with home" in settings.
The home page is a centered search box — click it (or just start typing) to open the ask modal. A button in the header toggles "minimal mode", which leaves only the title and the box.
If you also use Beautitab, Home tab or similar, both will fight over the same empty tab. Enable only one.
| Setting | Notes |
|---|---|
| Endpoint URL | Any OpenAI-compatible endpoint. Ollama is http://localhost:11434/v1 |
| Chat model | Dropdown lists models available on the endpoint |
| Vision model | Used when a question includes images; falls back to the chat model if blank |
| API key | Only needed for cloud endpoints; leave blank for local Ollama |
| Setting | Notes |
|---|---|
| Interface language | Follows your Obsidian setting by default |
| Answer language | Follows the language you asked in by default |
| Setting | Default | Notes |
|---|---|---|
| Vault-grounded answers | On | On: answer strictly from your notes, with citations. Off: notes are optional context and the model may answer freely |
| Scope | Whole vault | Restrict indexing to specific folders |
| Index PDFs | On | PDFs dominate first-build time |
| Index image content | Off | Describe each image with the vision model. ~10s per image — test the vision model first |
| Embedding model | bge-m3 |
⚠️ Changing this invalidates every vector and forces a full rebuild |
| Embedding endpoint | Follows main | Set separately if chat runs in the cloud but embeddings stay local |
| Storage location | Outside the vault | Defaults to the OS app-data directory so it isn't synced |
| Auto-index | On | Incremental update on file changes (15s debounce) |
| Setting | Default | Notes |
|---|---|---|
| Passages to retrieve | 8 | Raising it noticeably costs context and time |
| Similarity threshold | 0.5 | Passages below this score are discarded |
About the threshold: 0.5 is where the measurements land — genuinely relevant passages usually score above 0.60, while completely unrelated content still reaches 0.35–0.49. Dropping to 0.3 feeds the model irrelevant material.
One exception: cross-language retrieval scores systematically lower. A Chinese question matching a French original may only reach the low 0.50s. If your vault has foreign-language books that never surface, try 0.45.
| Setting | Default | Notes |
|---|---|---|
| Show ribbon icon | On | The launcher icon in the left ribbon |
| Replace new tab with home | Off | Conflicts with Beautitab and similar — enable only one |
Test says it can't connect
Check Ollama is running: ollama list in a terminal should list your models. On macOS you may need to launch the Ollama app once after installing.
It says nothing relevant was found, but I know it's there
Three possibilities:
.md and .pdf are indexedA PDF yields no text
Scanned PDFs are images and need OCR, which this plugin does not do. The Test button in settings will tell you which file failed and why.
Answers are slow
Time to first token goes into two places: retrieval (1–2s) and model prefill (grows with how much material is sent). You can:
qwen3.5:4b is ~1.6× faster than 9b)-mlx variants (~1.5× faster than equivalent GGUF)Error: context window is only 4096 tokens
GGUF models pulled straight from HuggingFace get Ollama's 4096 default. The plugin detects this and retries, but if it keeps happening, switch to a model from Ollama's official library.
The model says it can't see my image
Ollama's MLX backend doesn't support image input. Set "Vision model" separately to a GGUF model (no -mlx suffix) and hit Test to verify.
How much disk does the index use?
Roughly 4 MB per 1000 chunks. It lives outside the vault in the OS app-data directory by default, so Obsidian Sync and git never see it. The location is configurable.
Everything stays on your machine.
The plugin only talks to the endpoint you configure. By default that's http://localhost:11434 — Ollama on your own computer. Note content, PDF text, questions and answers never leave the machine.
If you point the endpoint at a cloud provider, your note content goes to that provider. That's your choice; the plugin makes no hidden requests.
On local file access: vault files are read through Obsidian's Vault API. The index is written outside the vault (OS app-data directory) on purpose — it's a machine-local build artifact, tens of megabytes, and putting it in the vault means Obsidian Sync and git carry it around. That part uses Node's fs, which is why the plugin is marked isDesktopOnly.
On streaming: answers stream back over Node's http (Obsidian's requestUrl doesn't support streaming, and fetch in the renderer is subject to CORS). Requests go only to your configured endpoint.
| This plugin | Feishu/Lark Knowledge QA | Copilot for Obsidian | Claudian | Claude Code / Codex | |
|---|---|---|---|---|---|
| Form factor | Obsidian plugin | Cloud service | Obsidian plugin | Obsidian plugin | Terminal CLI |
| How you invoke it | ✅ Centered search box | ✅ Centered search box | ❌ Sidebar only | ❌ Sidebar only | Terminal |
| Data stays local | ✅ Fully local | ❌ Cloud | ⚠️ Depends on config | ❌ Cloud | ❌ Cloud |
| Model choice | ✅ Any OpenAI-compatible endpoint | ❌ Fixed | ✅ Many providers + local | ⚠️ Coding agents only | ⚠️ Vendor-locked |
| Use your own fine-tune | ✅ | ❌ | ✅ | ❌ | ❌ |
| Live file editing | ⚠️ Rewrites need confirmation | ❌ Read-only | ⚠️ Partial | ✅ Fully agentic | ✅ Fully agentic |
| Retrieval | Semantic + keyword | Semantic (cloud) | Semantic + keyword | No index — greps and reads files | Same |
| Citations | ✅ Click to jump to line/page | ✅ | ✅ | ⚠️ Model's own claim | ⚠️ Model's own claim |
| Works offline | ✅ | ❌ | ⚠️ Only with a local model | ❌ | ❌ |
| Ongoing cost | 0 | Subscription | 0 or API fees | API fees | API fees |
How you invoke it
This is the reason the plugin exists.
Feishu's knowledge QA puts a prominent search box front and centre — you ask without first working out which document to read. This plugin brings that into Obsidian: one shortcut, a centered box, type the question. Same muscle memory as Cmd+O for the Quick Switcher.
Obsidian AI plugins are overwhelmingly sidebar-shaped: open the right panel, chat in it, often after telling it which files to read. Verified in code: Copilot (3.3.3) and Claudian (2.0.41) register only sidebar views — no modal entry point at all.
Sidebars are good for long conversations and bad for asking one quick thing: you have to make room on screen before you can start thinking. This plugin offers all three shapes, but the modal is the default and the point.
Data stays local
This plugin talks only to localhost by default. Feishu, Claudian and Claude Code / Codex must send content to a cloud model to work at all — not a flaw, just what they are.
Copilot for Obsidian gets a ⚠️ because it supports both: point it at OpenAI/Anthropic and it's cloud; point it at local Ollama and it's fully local. Your call.
Model choice
This plugin targets "any OpenAI-compatible endpoint", so local Ollama, mlx_lm.server, a self-hosted inference server or a cloud API all work. Copilot is similarly open.
Feishu uses its own model with no user choice. Claude Code and Codex are tied to Anthropic and OpenAI respectively; Claudian wraps those two and inherits the same constraint.
Use your own fine-tune
Strictly speaking, none of these train models for you. The real difference is whether you can bring a model you trained.
This plugin and Copilot can — LoRA-tune a 4B model, serve it behind an OpenAI-compatible endpoint, put the URL in settings. Cloud products can't do this at all.
Live file editing
The biggest difference, and the one worth thinking through.
This is a trade-off, not a ranking. Want AI to restructure a whole folder of notes? This plugin can't. Want to safely tighten one paragraph? The agent approach is overkill.
Retrieval
This plugin, Feishu and Copilot all build vector indexes. This plugin and Copilot both also do hybrid retrieval — a keyword pass running alongside the semantic one, then fused.
That second pass matters: semantic search has a blind spot for rare proper nouns (acronyms, model numbers, surnames). Ask "what is XYZ" and you may be told there's nothing in your vault when there are several passages. A wrong negative is more dangerous than a mediocre answer, because there's nothing to tip the user off.
Claude Code / Codex / Claudian build no index — the agent greps and reads files itself. Upside: no preprocessing, always current. Downside: conceptual questions are hard to hit, because your note might say "work in five-minute blocks" without ever using the word "focus".
Citations
References here are generated by the program from the passages actually used, not written by the model — in testing, models omitted sources two times in three and sometimes invented them. Clicking a reference jumps to the exact line in a note or page in a PDF.
Agent-style tools state their sources inside the answer text, so accuracy depends on the model.
| If you… | Then |
|---|---|
| Handle sensitive material that can't go to the cloud | This plugin, or Copilot with a local model |
| Want AI to restructure notes at scale | Claudian / Claude Code |
| Work in a team and don't want to configure anything | A cloud service like Feishu |
| Want the most feature-complete Obsidian AI plugin | Copilot — this plugin is narrower on purpose (QA + citations) |
| Have your own fine-tuned model to use | This plugin, or Copilot |
| Just want to hit a key and ask one question | This plugin |
Notes: Feishu's behaviour varies by version and deployment; the table reflects its public form. Copilot and Claudian details come from the versions current at the time of writing (Copilot 3.3.3 / Claudian 2.0.41). Everyone iterates fast — verify against what you actually have.
Per Obsidian's developer policies, two things need stating explicitly:
Network use — fully offline by default.
The plugin's only outbound destination is the endpoint you configure in settings.
The default, http://localhost:11434, is a loopback address (127.0.0.1) —
traffic stays inside the operating system and never touches a network interface.
Once installed, it works with networking switched off entirely: indexing, asking
and rewriting need no connection.
Internet is only needed to install — downloading Obsidian, Ollama and the models. Once.
No telemetry, no ads, no self-update mechanism. localhost is the only address in the source.
The one exception: if you deliberately point the endpoint at a cloud provider (OpenAI, say), your note content goes to that provider. The plugin won't stop you, but that is your explicit choice.
File access outside the vault — the vector index is written outside your
Obsidian vault (by default the OS app-data directory, e.g.
~/Library/Application Support/knowledge-ai/ on macOS). The location is configurable.
Why not inside the vault: the index is a machine-local build artifact that grows to
tens or hundreds of megabytes. Putting it in .obsidian/ means Obsidian Sync,
obsidian-git and friends carry it around — wasted bandwidth for something that has to
be recomputed on another machine anyway. That part uses Node's fs, which is why the
plugin is marked isDesktopOnly.
Everything else — reading and writing files inside your vault — goes through Obsidian's Vault API.
MIT