# Ollama Notes Chat A right-sidebar chat panel that lets you chat with your notes using a remote Ollama server over its native chat API. Personal-use, local-first — nothing leaves your LAN. ## Features - **Right-sidebar chat** — opens from the left ribbon (chat-bubble icon), the command palette, or the editor right-click menu. - **Native Obsidian look** — styled with theme CSS variables, so it adapts to any light/dark theme automatically. - **Streaming responses** — tokens arrive live over NDJSON. - **Context modes** — chat about the current note, the current selection, the current note plus its one-hop linked notes, retrieved passages from across the whole vault (RAG), or no context at all. Tap the subheader to cycle modes. - **Retrieval (RAG)** — embed your question and pull the most relevant passages from anywhere in the vault. Citations render as real `[[Note#Heading]]` links you can click. Index builds incrementally in the background; edits and renames re-embed automatically with a 2s debounce. Embedder model is configurable and independent from the chat model. - **Markdown rendering** — AI responses are rendered with Obsidian's own Markdown renderer: code blocks, callouts, tables, and `[[wikilinks]]` all work. - **Slash commands** — `/summarize`, `/expand`, `/rewrite`, `/brainstorm` out of the box, fully editable in settings. - **Per-note overrides** — add `ai: { model: ..., systemPrompt: ... }` to a note's frontmatter to override global settings when chatting with that note. - **Save as note** — dump the conversation to a Markdown file (`Chats/YYYY-MM-DD — .md` by default). - **Insert into note** — one click to paste an AI response at the cursor in the active editor. - **Regenerate** — redo the last response with the same prompt. - **Token estimate** — rough context-budget warning turns amber/red as you approach the model's limit. - **Multi-session history** — keep as many parallel chats as you want. The header's history icon opens a drawer listing every conversation with its preview and "last updated" stamp; click any row to switch, click the title to rename in place, trash icon to delete. New chat via the `+` icon or command palette. - **Auto-titled conversations** — new chats derive their title from your first message (slash-command prefix stripped). Manual rename sticks forever; the auto-titler never overwrites it. ## Prerequisites 1. **Ollama running on another PC on your LAN.** On the host: ```bash # macOS launchctl setenv OLLAMA_HOST "0.0.0.0:11434" launchctl setenv OLLAMA_ORIGINS "*" # restart Ollama # Linux (systemd) sudo systemctl edit ollama.service # add under [Service]: # Environment="OLLAMA_HOST=0.0.0.0:11434" # Environment="OLLAMA_ORIGINS=*" sudo systemctl restart ollama # Windows # Set OLLAMA_HOST=0.0.0.0:11434 and OLLAMA_ORIGINS=* in System Environment Variables, # then restart the Ollama app. ``` `OLLAMA_ORIGINS=*` is required so Obsidian can make streaming `fetch` requests to Ollama across the LAN. If you want tighter security, set it to `app://obsidian.md` instead (comma-separate for multiple values). 2. At least one Ollama chat model pulled, plus (if you want retrieval / RAG) an embedder model: ```bash ollama pull llama3.1:8b # chat ollama pull nomic-embed-text # embedder — only needed for the retrieval context mode ``` 3. Node.js on your Mac (only needed once, to build this plugin): ```bash brew install node ``` ## Install 1. Build the plugin: ```bash cd "/path/to/Obsidian_Plugin_Ollama_Chat" npm install npm run build ``` This produces `main.js` alongside `manifest.json` and `styles.css`. 2. Copy (or symlink) the plugin folder into your vault's plugins directory: ```bash ln -s "/path/to/Obsidian_Plugin_Ollama_Chat" \ "/path/to/vault/.obsidian/plugins/ollama-notes-chat" ``` 3. In Obsidian, open **Settings → Community plugins**, turn off restricted mode if needed, reload plugins, and enable **Ollama Notes Chat**. 4. Open **Settings → Ollama Notes Chat**: - Set the **Base URL** to your Ollama host, e.g. `http://192.168.1.50:11434`. - Click **Test** — you should see "Connected — N models available". - Pick a model from the dropdown. 5. Click the chat-bubble icon in the left ribbon to open the sidebar, and start chatting. ## Retrieval / RAG setup (optional) If you want to chat with the whole vault instead of a single active note: 1. In **Settings → Ollama Notes Chat**, scroll to the **Retrieval** section. 2. Pick an **embedder model** from the dropdown (`nomic-embed-text` is the small, fast default). This is separate from your chat model. 3. Leave **auto-index on load** on (default) or click **Reindex vault** to build the index manually. Progress appears in the same panel. 4. In the chat view, tap the context-mode pill in the subheader until it reads "Retrieved passages". 5. Ask a question. The response will include `From [[Note#Heading]]` citations you can click to jump to the source. Index is stored at `.obsidian/plugins/ollama-notes-chat/index.json`. It updates incrementally when notes change (2-second debounce) and invalidates automatically if you change the embedder model. On large vaults the cold reindex can take several minutes — you can click Cancel at any time and resume later. ## Keyboard shortcuts Obsidian doesn't bind a default hotkey — assign one in **Settings → Hotkeys** by searching for "Ollama Notes Chat". The most useful commands to bind: "Open chat", "New chat", and "Open chat history". ## Per-note overrides In any note's frontmatter: ```yaml --- ai: model: llama3.1:70b systemPrompt: "You are a code reviewer. Be blunt and specific." --- ``` When this note is the active context, the plugin uses these values instead of the global settings for that send. ## Troubleshooting - **"Cannot reach server"** — check that Ollama is running and that `OLLAMA_HOST=0.0.0.0:11434` and `OLLAMA_ORIGINS=*` are set on the host. Restart Ollama after setting them. - **Streams but errors partway** — the response may have hit the model's context window or max-tokens limit. Raise max tokens in settings or use a larger model. - **Model dropdown is empty** — click the refresh button next to it. If still empty, run `ollama list` on the host to verify models are installed. - **Context is too long warning** — switch the context mode to "Current selection" to only include highlighted text, or raise the truncation limit in settings. - **"Index is empty — run reindex in settings"** — retrieval mode is selected but no embeddings exist yet. Open settings, scroll to Retrieval, and click **Reindex vault**. - **"Embedding failed — check your server is reachable"** — the embedder model isn't available on the Ollama host, or the host is down. Run `ollama list` on the host and pull `nomic-embed-text` if missing. - **Retrieval returns stale results after edits** — edits debounce for 2 seconds before re-embedding. If you need an immediate rebuild, click Reindex vault. ## Architecture - `main.ts` — plugin entry; registers the view, ribbon icon, commands, editor menu, settings tab. Owns the conversation store + persistence (including the one-shot 0.1.0 → 0.2.0 migration) and, since 0.3.0, the RAG vector store + indexer. - `src/view/ChatView.ts` — the sidebar `ItemView` that owns the chat UI, streaming, and rendering. - `src/view/HistoryDrawer.ts` — overlay controller for the multi-session history drawer (mounted inside the chat view, not a separate `ItemView`). - `src/chat/ConversationStore.ts` — CRUD layer over `ConversationSnapshot[]`; filters empty conversations out of persistence. - `src/chat/Conversation.ts` — per-conversation state, auto-titling, and `ConversationSnapshot` shape. - `src/ollama/OllamaClient.ts` — `fetch`-based native `/api/chat` client with NDJSON streaming generator (keeps Ollama's timing fields for the stats modal) plus `requestUrl`-based `/api/embed` and `/api/tags`. - `src/context/NoteContext.ts` — builds the context block from the active note/selection/linked notes/retrieved passages. - `src/rag/Chunker.ts` — heading-first markdown chunker with fixed-size fallback. - `src/rag/VectorStore.ts` — in-memory map, flat JSON persistence at `index.json`, atomic tmp+rename writes, inline cosine top-K. - `src/rag/Indexer.ts` — vault walk, mtime-diff, batched embedding, debounced event handlers. - `src/settings/` — typed settings, defaults, and the settings tab. - `styles.css` — scoped under `.ollama-chat-view` / `.ollama-chat-settings`; uses only Obsidian theme variables. ## Support Ollama Notes Chat is free and open source. If it makes your notes more useful and you'd like to support continued development, you can buy me a coffee: [☕ buymeacoffee.com/tdmarchetta](https://buymeacoffee.com/tdmarchetta) 100% of contributions go to the developer. ## License MIT