Kerekes Stefan34 downloadsAI-powered branching knowledge trees. Grow a concept into tens of thousands of interconnected notes with a polymathic taxonomist LLM.
AI-powered branching knowledge trees for Obsidian. Type a single concept ("democracy", "tree", "consciousness") and a polymathic-taxonomist LLM grows it into a deep, interconnected tree of notes — one branch at a time, up to tens of thousands of nodes.
Built around a four-prompt system (Discovery, Expansion, Connection Discovery, Batch Generation) and designed for large-scale scalability: incremental growth, Markdown+frontmatter storage, response caching, background indexing via Obsidian's metadataCache, and virtualized rendering.
| Capability | How |
|---|---|
| Discovery (root concept) | Polymathic taxonomist prompt → 3–7 domains × 3–5 children |
| Expansion (drill deeper) | Knowledge-graph engineer prompt → 5–10 granular sub-concepts with can_expand / estimated_depth |
| Connection Discovery | Ranked vault-note candidates (background index) → relationship types + priorities; link or create notes |
| Batch expansion | Level-by-level BFS with bounded concurrency, node budget, live progress bar |
| Incremental growth | Never generate the whole tree at once; expand branches on demand |
| Markdown storage | One note per concept, full frontmatter (parent, domain, complexity, children, connections, path), wikilink ## Connections section |
| Response cache | Identical queries hit the cache (LRU, expiry, disabled at 0) |
| Background indexing | Vault note names/tags indexed from metadataCache — powers connection matching without loading files |
| Virtualized rendering | Only visible rows are in the DOM; smooth with tens of thousands of nodes |
| Any OpenAI-compatible API | DeepSeek (default), OpenAI, OpenRouter, Ollama, LM Studio… with optional SSE streaming |
| Feature | How |
|---|---|
| Hover preview | Hover a node → tooltip with its description; the same preview follows keyboard selection |
| Keyboard navigation | ↑ / ↓ move the selection, → expand, ← collapse, Enter toggle — preview follows the selected node |
| Filter that jumps | Type in the search box: matching nodes keep their ancestor chain, matches are highlighted, and the view jumps to the first hit; a No matching nodes hint appears when nothing matches |
| Copy link / path | Right-click → Copy [[link]] or Copy note path |
| Safe delete with undo | Right-click → Delete node + descendants, then press Undo on the notice to recreate every deleted note |
| Export tree | Right-click → Export tree… → Markdown outline, JSON snapshot, or SVG graph, written to the vault root |
| Batch connections | Right-click → Find connections in subtree — runs the connection pass over every node and auto-links high-priority hits |
| Tree stats & health | Right-click → Tree stats & health — depth distribution, complexity breakdown, orphaned / dangling-node detection |
| Duplicate detection | Right-click → Find duplicates across trees — lists concepts present in 2+ trees with Link and Merge A→B / B→A actions |
| Batch without collapsing | Batch expansion preserves the current expansion state, then expands the batch subtree afterwards |
| Expand all / Collapse | Toolbar buttons to show or hide the whole tree at once |
| Manual reindex | ♺ Index toolbar button (or the Reindex vault notes command) rebuilds the connection index on demand |
main.js, manifest.json, styles.css into <vault>/.obsidian/plugins/cognitree/ and enable the plugin. (Or git clone and run npm run build.)deepseek-v4-flash). To use another provider, pick it from the Provider dropdown — the endpoint and model list switch automatically (Ollama / LM Studio need no key).democracy in the input and press Generate. The Discovery prompt creates the root + domain children as notes under CogniTree/Democracy/.Example flow: democracy → Discovery → Political Science / Direct Democracy / Referendums → click Referendums → Expansion → Mandatory / Optional / Popular Initiative → 🔗 Find connections → link to Elections, Switzerland, Popular Sovereignty.
Mirrors the spec's PluginSettings:
| Setting | Default | Purpose |
|---|---|---|
apiKey |
— | Key for the OpenAI-compatible endpoint (not needed for local providers) |
| Provider | — | Preset picker: DeepSeek, OpenAI, OpenRouter, Groq, Mistral, xAI, Together, Cerebras, Perplexity, NVIDIA NIM, Fireworks, SiliconFlow, Zhipu GLM, Moonshot, Qwen (DashScope), Ollama, LM Studio, or Custom… |
modelEndpoint |
https://api.deepseek.com |
Base URL (/chat/completions is appended if missing) |
model |
deepseek-v4-flash |
Model id — dropdown lists the provider's curated models + anything fetched via GET /models; Custom… accepts any id |
temperature |
0.7 |
Sampling temperature |
streaming |
true |
Live text during generation |
maxTokensPerRequest |
4000 |
Token cap per call (reasoning models auto-retry with a larger budget if they run out mid-reasoning) |
maxChildrenPerLevel |
7 |
Children cap per expansion |
maxDepth |
10 |
Deepest auto/batch expansion level |
maxNodesPerBatch |
100 |
Node budget for batch expansion |
autoExpandDepth |
1 |
Levels auto-expanded on open (no API calls) |
showComplexity |
true |
Beginner/Intermediate/Advanced badges |
virtualizeRendering |
true |
Windowed rendering (recommended for large trees) |
cacheExpiryHours |
24 |
Cache TTL; 0 disables caching |
treeFolder |
CogniTree |
Vault folder holding generated trees |
Also: Clear cache (currently N cached generations) and tree folder relocation.
The four prompts from the spec are implemented verbatim in src/prompts.ts:
suggested_starting_branch. Strict JSON schema.can_expand + estimated_depth depth indicators.relationship_type (parent-of / related-to / contrast-with…), High/Medium/Low priority, suggestions for concepts to create.path-based hierarchical output).Responses are parsed tolerantly (markdown-fence stripping, trailing-comma repair, balanced-brace extraction) in src/parser.ts.
metadataCache frontmatter (no full-file reads); a raw YAML parse is the fallback for notes Obsidian hasn't indexed yet.src/treeView.ts), ~50 rows in the DOM regardless of tree size.kind|model|prompt, LRU-capped, persisted in the plugin data file.VaultIndexer subscribes to metadataCache changed/deleted/resolved (debounced) and ranks candidate note names by token overlap.done/total reported to the UI.Every concept is one Markdown note, e.g. CogniTree/Democracy/Direct Democracy.md:
---
concept: "Direct Democracy"
tree: "Democracy"
parent: "Democracy"
domain: "Political Science"
description: "Citizens vote directly on laws and policies rather than through representatives."
complexity: "Beginner"
can_expand: true
estimated_depth: 4
connections: ["Athenian Democracy", "Referendums", "Citizen Assemblies"]
children: ["Referendums", "Citizen Assemblies"]
path: "/democracy/political_science/direct_democracy"
created: "2025-01-01T00:00:00.000Z"
---
# Direct Democracy
…
## Connections
- [[Athenian Democracy]]
- [[Referendums]]
This stays fully Obsidian-native: the graph view, backlinks, and search all work on generated trees.
npm install # dev deps (esbuild, typescript, obsidian types)
npm run dev # watch mode → main.js
npm run build # typecheck + production bundle
| Key | Action |
|---|---|
| ↑ / ↓ | Move the selection (description preview follows) |
| → | Expand the selected node |
| ← | Collapse the selected node |
| Enter | Toggle expand / collapse |
| Tab | Focus the tree list (then use the arrows above) |
Click any node once to grab keyboard focus for the list. The toolbar actions (⚡ Batch, ♺ Index) act on the currently selected node.





MIT © 2026 Kerekes Stefan