Summary
Let a workspace connect to an Obsidian vault (a folder of markdown notes with YAML frontmatter and [[wikilinks]]) so notes flow into the workspace memory system and render nicely in the dashboard. Obsidian vaults are just plain markdown on disk, so this is very feasible — most of the machinery already exists in the repo.
Why
- The memory subsystem already syncs Claude's file-based markdown memory (frontmatter +
[[wikilinks]]) into SQLite via charts/workspace/memory/sync.py. An Obsidian vault is the same shape — user-authored instead of agent-authored.
- Users keep durable personal/project knowledge in Obsidian; agents in the workspace should be able to search and cite it (via the existing
memory_search MCP tool + auto-injection hook) without copy-pasting.
- The dashboard already has a Files tab, a docs viewer, and
marked-based markdown rendering — wikilink-aware rendering is a small delta.
Existing building blocks
| Piece |
Where |
Relevance |
| File→SQLite memory sync (frontmatter parse, mtime fingerprint, namespacing, tags) |
charts/workspace/memory/sync.py |
~70% of the vault importer already written |
SQLite store + embeddings + memory_search MCP |
charts/workspace/memory/, mcp_memory.py |
vault notes become searchable by all agents |
Markdown rendering (marked) |
dashboard web (charts/workspace/web/) |
render notes; add wikilink resolution |
| Files route |
web/src/routes/files/ |
browse the vault |
| Prompt auto-injection hook |
memory_inject_hook.py |
relevant vault notes surface in agent prompts automatically |
Proposed scope
Phase 1 — vault import (MVP)
- Vault location convention:
/home/dev/vault by default, overridable (env var / values.yaml / Settings). Users get content there however they like — typically git clone of a vault repo (Obsidian's git plugin is the standard headless sync path; Obsidian Sync is proprietary and not reachable headlessly).
- Extend
memory/sync.py (or a sibling vault_sync.py reusing its scanner) to import vault notes:
- namespace
vault.<relative-path-slug>, tags auto-imported,obsidian-vault
- parse Obsidian YAML frontmatter (tags, aliases) into entry tags
- one-way (vault → SQLite), mtime-fingerprinted like the existing sync; vault files stay canonical
- skip
.obsidian/, templates, and honor a size cap per note
- Notes then automatically become searchable via
memory_search and eligible for prompt auto-injection.
Phase 2 — dashboard UX
- Wikilink-aware markdown rendering:
[[Note Name]] resolves to the target note (Files tab viewer + Memory tab detail).
- Vault section/filter in the Memory tab (filter by the
obsidian-vault tag) and a "Vault" entry point in Files.
- Settings card: vault path + sync on/off + last-sync status.
Stretch (separate follow-up issues, not this one)
- Two-way: export workspace memories as Obsidian-formatted notes into the vault (agent knowledge visible in the user's own Obsidian app).
- Graph view of wikilink structure.
- Periodic
git pull/push of the vault repo.
Non-goals
- Obsidian Sync (proprietary protocol) — git is the sync transport.
- Running the Obsidian desktop app in the workspace (possible via VNC but heavy; not needed since vaults are plain files).
- Obsidian plugin compatibility (Dataview queries etc.) — render as plain markdown.
Acceptance criteria
- With a vault at
/home/dev/vault, notes appear in the dashboard Memory tab (tagged obsidian-vault) within one sync interval.
memory_search from any agent harness returns vault content.
- Editing a note re-imports it; deleting it removes/tombstones the entry.
- Wikilinks in the dashboard viewer navigate to the linked note.
- No vault → existing behavior unchanged.
Summary
Let a workspace connect to an Obsidian vault (a folder of markdown notes with YAML frontmatter and
[[wikilinks]]) so notes flow into the workspace memory system and render nicely in the dashboard. Obsidian vaults are just plain markdown on disk, so this is very feasible — most of the machinery already exists in the repo.Why
[[wikilinks]]) into SQLite viacharts/workspace/memory/sync.py. An Obsidian vault is the same shape — user-authored instead of agent-authored.memory_searchMCP tool + auto-injection hook) without copy-pasting.marked-based markdown rendering — wikilink-aware rendering is a small delta.Existing building blocks
charts/workspace/memory/sync.pymemory_searchMCPcharts/workspace/memory/,mcp_memory.pymarked)charts/workspace/web/)web/src/routes/files/memory_inject_hook.pyProposed scope
Phase 1 — vault import (MVP)
/home/dev/vaultby default, overridable (env var / values.yaml / Settings). Users get content there however they like — typicallygit cloneof a vault repo (Obsidian's git plugin is the standard headless sync path; Obsidian Sync is proprietary and not reachable headlessly).memory/sync.py(or a siblingvault_sync.pyreusing its scanner) to import vault notes:vault.<relative-path-slug>, tagsauto-imported,obsidian-vault.obsidian/, templates, and honor a size cap per notememory_searchand eligible for prompt auto-injection.Phase 2 — dashboard UX
[[Note Name]]resolves to the target note (Files tab viewer + Memory tab detail).obsidian-vaulttag) and a "Vault" entry point in Files.Stretch (separate follow-up issues, not this one)
git pull/pushof the vault repo.Non-goals
Acceptance criteria
/home/dev/vault, notes appear in the dashboard Memory tab (taggedobsidian-vault) within one sync interval.memory_searchfrom any agent harness returns vault content.