spider
approvedby huangtao
AI chat branches as an interactive knowledge map. Tab to drill down, arrow keys to navigate, structured exports. - This plugin has not been manually reviewed by Obsidian staff.
Spider
π Other languages: δΈζζζ‘£
AI conversations that branch like a spider's web β press Tab to spin off a deep-dive from any answer. Explore, compare, and trace back without losing context.
An Obsidian plugin that turns ChatGPT / Claude / DeepSeek / any OpenAI-compatible API into a branching knowledge map. Read an AI answer, hit an unfamiliar term, select the text, press Tab β a child node appears, ready for the next question. Infinite depth, instant backtrack, one-click export to Obsidian Canvas / Markdown / Mermaid mindmap.

π¬ Looking for an animated demo? A GIF should live here β record a 5-second Tab-branch interaction, save as
.github/demo.gif, and replace the image above. See Recording a Demo for tools.
π€ Why Spider?
| Scenario | Plain AI chat | Spider |
|---|---|---|
| Mid-answer, want to drill into a term | Copy-paste β new window β lose the original thread | Select text β Tab β child node carries the context |
| Want to compare 3 phrasings of the same question | Open 3 tabs and alt-tab | Same parent, 3 children, side-by-side |
| Done exploring, want it as notes | Copy-paste into a note, links break | Add personal node notes, then export Markdown + Canvas |
| Want AI to live inside your docs, not a separate tab | Constant window switching | Stay in Obsidian the entire time |
vs Copilot plugin: Copilot is a single-thread chatbot. Spider is a multi-thread knowledge graph β same topic, Copilot gives you one line, Spider gives you one tree.
β‘ 30-Second Quick Start
- Install: Settings β Community plugins β Browse β search
spiderβ Enable - Configure your API key: Settings β Spider β fill in
apiBaseUrl+apiKey+model(any OpenAI-compatible endpoint) - Create your first map: Click the spider ribbon icon (or run command
Spider: New map) β start chatting - Try Tab-branching: Select any text in an AI response, press
Tabβ that's it
β¨ Features
π³ Infinite-Depth Branching Chat
- No depth limit: drill down as deep as you need; the graph grows with you
- Optional parent context: child node requests automatically include parent title / summary / anchor
- Streaming responses: typewriter-style real-time rendering with Markdown & code-block highlighting
- Select-to-branch: highlight any text in an AI response β
Tabβ the child's "anchor" is that exact highlight - Auxiliary actions: retry, summarize, AI auto-title
πΈοΈ Interactive Knowledge Graph
- Full-tab canvas powered by React Flow
- Click a node to switch context; the chat panel follows automatically
- Collapse / expand subtrees to keep large maps clean
- Auto-layout via Dagre algorithm with active-path highlighting
- Drag nodes β positions persist, the canvas looks the way you left it
- Personal node notes β hover the pencil for a preview, click to pin and edit with autosave
π¦ One-Click Structured Export
Spider Maps/
βββ index.md # Obsidian entry-point note
βββ brief.md # Findings, open questions, and progress
βββ nodes/ # One Markdown file per node
βββ map.canvas # Visual knowledge map
- Canvas nodes are color-coded by state (purple = root / green = understood / gray = archived / blue = open)
- Edges carry labels (anchor text or first-question excerpt) with clear arrow directions
- Markdown files cross-link parent / child / index β backlinks wire up the full thinking chain
π Works with Any OpenAI-Compatible API
- Official OpenAI (
https://api.openai.com/v1) - DeepSeek / Moonshot / Qwen / GLM (OpenAI-compatible mode)
- OpenRouter / Together / Groq (aggregator APIs)
- Local LLMs: Ollama, vLLM, LM Studio β all expose OpenAI-compatible endpoints
- Anthropic Claude via proxy
π‘ Because it's the OpenAI Chat Completions spec, you just need a base URL + key + any model name that endpoint supports.
π Privacy & Network Disclosure
- The plugin requires network to call AI, but you fully control which endpoint
- API key stays local (Obsidian's plugin data.json); never uploaded
- Never reads your vault β only sends the current node's messages + optional parent context + optional anchor text
- Maps are 100% local: stored as
.spider/maps/*.json, syncable via Obsidian Sync - Offline-capable: knowledge graph, navigation, export, history β everything works offline. Only "send message" needs network.
π Bilingual UI
Switch between Chinese and English any time in settings. Export artifacts are intentionally hard-coded to Chinese β exports are historical records and shouldn't be retroactively rewritten when the UI language changes.
β¨οΈ Keyboard Shortcuts
| Key | Action |
|---|---|
Tab | With text selected in an AI response β create child node from that anchor. Without selection β create empty child node. |
Shift + Tab | Jump to parent node |
β β | Parent β first child |
β β | Move between sibling nodes |
Enter | Send message (inside composer) |
Shift + Enter | Newline (inside composer) |
Esc | Clear current selection |
Delete / Backspace | Delete current node (non-root, focus not in input) |
βοΈ Settings
| Setting | Description | Default |
|---|---|---|
| API Base URL | OpenAI-compatible endpoint | https://api.openai.com/v1 |
| API Key | Your API key (password input, stored locally) | β |
| Model | Any model name your endpoint supports | gpt-4o-mini |
| Interface Language | Chinese / English | English |
| Include parent context | Send parent title/summary/anchor with child requests | β on |
| Include full context | Also send parent's full message history (more tokens) | β off |
| Stream responses | Stream tokens as they arrive | β on |
| Tab to create child nodes | Enable the Tab shortcut | β on |
| Auto-summarize nodes | AI auto-summarizes each node | β off |
| Default export folder | Where export packages go | Spider Maps |
π₯ Installation
From Community Plugin Store (recommended)
- Obsidian β Settings β Community plugins
- Turn off Safe mode (if it's on)
- Browse β search
spiderβ Install β Enable - Settings β Spider β fill in your API key and model
From Source (development)
git clone https://github.com/111pointer111/spider
cd spider
npm install
npm run build
# Copy main.js, manifest.json, styles.css into
# <vault>/.obsidian/plugins/spider/
# Then enable the plugin in Obsidian
Or use npm run link to symlink the build output to your vault and pair with npm run dev for live-reload during development.
π Development
npm install # install dependencies
npm run dev # watch mode (esbuild)
npm run build # production build (runs tsc --noEmit first)
npm test # run vitest tests
npm run link # symlink build output into your vault
Project Structure
src/
ai/ OpenAI-compatible API provider (streaming + sync + summarize)
domain/ ChatMap immutable factories + tree ops + guards + Dagre layout
export/ Markdown / Mermaid / Canvas / JSON exporters
state/ Multi-view session store + per-session ViewState
storage/ Vault JSON persistence (backward-compatible with old directory)
ui/ React components (graph, chat panel, gallery, modals)
utils/ ID generation, path handling, activeDocument shim
tests/ vitest unit tests (domain + export + AI layers)
__mocks__/ Obsidian API stub for vitest
π₯ Recording a Demo
π¬ Want to contribute a demo GIF?
- Record 5β10 seconds with Kap (macOS) / ScreenToGif (Windows) /
ffmpeg(Linux)- Show: open spider β ask a question β select text in AI response β press
Tabβ child node appears β continue asking- Export as GIF, save to
.github/demo.gif- Open a PR; we'll swap the static screenshot above for

π§ Roadmap (running list)
- Full-text node search (Ctrl/Cmd+F inside the canvas)
- Multi-select nodes + batch operations
- Node backlinks (auto-track "which nodes reference me")
- Custom system prompts
- Optional AI summary attached to export package
π License
π Credits
- Obsidian β the endlessly extensible note app
- React Flow (@xyflow/react) β canvas engine
- @dagrejs/dagre β auto-layout
- Feynman Technique β the pedagogical idea: if you can't explain it simply, you don't understand it
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.