Skip to content

otaviof/obsidian-vfs

Repository files navigation

Obsidian VFS

@obsidian-vfs/core @obsidian-vfs/cli VSCode Extension
CI Audit

Obsidian VFS

Read-only virtual filesystem exposing an Obsidian vault via the obs:// protocol. Three entrypoints — a VS Code extension, a Claude Code plugin, and a CLI — built on a shared core engine.

Packages

Package Description Docs
packages/core obs:// URI resolution, LRU cache, Obsidian CLI wrapper, direct file reads via node:fs README
packages/vscode VS Code FileSystemProvider for obs:// — browse, search, and edit your vault in the editor README
packages/claude-plugin Claude Code plugin resolving @obs: and /obs: mentions into context via UserPromptSubmit hook README
packages/cli npx obsidian-vfs — inspect, resolve, list, and provision vault skills and agents README

The consumer packages (vscode, claude-plugin, cli) depend on core but have no cross-dependencies between each other.

Getting Started

pnpm install
pnpm build
pnpm test

Vault Configuration

Place a JSON file at .obsidian/obsidian-vfs.json inside your vault. All fields are optional and default to empty arrays:

{
  "agents": ["path/to/agents"],
  "skills": ["path/to/skills"],
  "allowed": ["folder-a", "folder-b"],
  "blocked": ["folder-a/private"]
}
Field Type Description
agents string[] Vault-relative directories containing agent definitions (flat .md files)
skills string[] Vault-relative directories containing skill definitions (name/SKILL.md)
allowed string[] Restrict general vault access to these directories. Empty = full vault access
blocked string[] Deny access to these directories (evaluated before allowed)

Two-Tier Access Model

allowed and blocked restrict general vault content — notes, wikilinks, directory browsing, and workspace mounts. agents and skills directories are implicitly allowed and exempt from these restrictions.

blocked is evaluated first (deny wins). When a path matches both allowed and blocked, it is blocked. A blocked entry may be a child of an allowed entry (carving an exception), but not a parent — that configuration is rejected at load time.

Wikilinks inside allowed notes that reference disallowed targets are visible but inert: the text remains, but the target cannot be resolved, read, or clicked.

Contributing

See CONTRIBUTING.md for development setup, scripts, architecture, and coding conventions.

About

Virtual file-system sharing Obsidian notes with VSCode and Claude Code

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors