nhan7 downloadsA vault management tool with integrated agentic capabilities that is Self contained inside Obsidian.
GraphRAG indexer + LLM-driven agents for Obsidian markdown vaults.
This plugin keeps an Obsidian vault easy to maintain. It builds a GraphRAG index of the notes in the vault. It uses LLM agents to clean notes, sort the inbox, and answer questions. Everything runs inside Obsidian. You do not need Python, a server, or Docker.
The indexer and agents call an OpenAI-compatible API. Use OpenAI, OpenRouter, or a local server such as OMLX.
Set the key in one of these places:
api.api_key in config.yaml.OMLX_API_KEY, OPENAI_API_KEY, or OPENROUTER_API_KEY.The plugin checks these sources in this order.
Open the plugin Settings tab. Set the API base URL and the models. Set the inbox folder, or leave it empty to auto-discover. See config.example.yaml for all options.
Run the command Build GraphRAG index. The plugin scans the vault, splits notes into header sections, extracts entities, and creates embeddings. It stores the index at {vault}/.note-maintainer/index.db.
If no _manifest.md exists, the plugin derives one from the index. Review it before you run sort.
npm run build in the repo root. This writes main.js.<vault>/.obsidian/plugins/obsidian-vault-ease-of-maintenance/.main.js, manifest.json, styles.css, and the node_modules folder into that folder. The Build command needs better-sqlite3 (the SQLite binding) and it is not shipped with the build — if it is missing, Build fails with
Cannot find module 'better-sqlite3' (require stack: electron/js2c/renderer_init).
Easiest: run ./build-plugin.sh <vault-path> — it builds and installs everything, including node_modules.| Command | Purpose |
|---|---|
| Build GraphRAG index | Full index rebuild from scratch. |
| Clean current note | Run the cleanup agent on the open note. |
| Sort inbox | Run the triage agent on the inbox. |
| Chat with your vault | Ask a question about the vault. |
| Setting | Purpose |
|---|---|
| API Key | Key for the OpenAI-compatible API. Optional when you use an env var. |
| API Base URL | Base URL of the API. |
| Agent Model | Model for clean, sort, and chat. |
| Embedding Model | Model for embeddings. |
| Inbox Folder | Folder to sort. Empty = auto-discover. |
| Ignore Patterns | One glob per line. Skips matching files and folders. |
| Manifest Filename | Name of the vault manifest. Default: _manifest.md. |
Clean, sort, and chat render in native Obsidian views. There is no browser tab and no server.
.bak backup. Reject keeps the original.See config.example.yaml. Key settings:
api.base_url — API endpoint.api.api_key — API key. Optional; falls back to an env var.embedding.model — model for embeddings.embedding.dimensions — dimension count.agent.model — model for agent calls.manifest.filename — manifest file name.preview.enabled — review-before-write for clean.preview.ttl_minutes — how long a pending review stays valid.query.top_k — default result count.Set the ignore patterns in the plugin Settings tab. The plugin skips matching files and folders during indexing and sorting. The format matches .gitignore.
| Path | Role |
|---|---|
main.ts |
Plugin entry. Registers commands and settings. |
src/config.ts |
Settings types and API key resolution. |
src/indexer/scanner.ts |
Scans the vault for markdown files. |
src/indexer/chunker.ts |
Splits notes into header sections. |
src/indexer/embedder.ts |
Calls the embeddings API. |
src/indexer/entity_extractor.ts |
Extracts wikilinks, tags, and phrases. |
src/indexer/db.ts |
SQLite index (better-sqlite3). |
src/indexer/manifest.ts |
Parses _manifest.md. |
src/indexer/indexer.ts |
Orchestrates the indexing pipeline. |
src/agent/engine.ts |
Deterministic primitives: file registry, validators, journal, receipts. |
src/agent/llm_client.ts |
API transport for local, OpenAI, and OpenRouter providers. |
src/agent/llm.ts |
Chat loop with tool calling. |
src/agent/tools.ts |
Agent tools, including apply_edits. |
src/agent/runtime.ts |
Orchestrators: build, clean, sort, chat. |
src/preview/pending.ts |
Stores pending review state. |
tests/ |
Vitest suite. |
| Change | Rebuild? | Why |
|---|---|---|
main.ts or src/*.ts |
Yes | Must compile to main.js before Obsidian loads it. |
styles.css |
No | Loaded at startup. Reload Obsidian only. |
manifest.json |
No | Loaded once at startup. Reload Obsidian only. |