Browse, search, and edit your Obsidian vault directly in VS Code via a virtual file system (obs://). Mount vault folders into the Explorer sidebar, navigate [[wikilinks]], and open notes in Obsidian — all without leaving your editor.
- Mount vault folders or individual notes into the Explorer tree view
- Browse and read Markdown files through the
obs://virtual file system - Edit existing files with writes going directly to the vault on disk
- Link navigation, click
[[wikilinks]]or[text](obs://...)links in Markdown to jump between notes - Search notes via Quick Pick across all vault Markdown files
- Open in Obsidian, jump to the current file in the Obsidian app
- Copy path as
obs://URI to the clipboard (Shift+Alt+Cmd+Conobs://files) - Move into Vault — move files from your project into mounted vault folders
- Duplicate into Vault — duplicate files from your project into mounted vault folders
- Auto-mount configured folders on startup
- Status bar showing vault name and connection mode (
full/degraded) - Workspace folder, vault browsable in Explorer with Quick Open (
Cmd+P) and Search (Ctrl+Shift+F) support - Workspace file, generate a named
.code-workspaceto avoid the "Untitled Workspace" label - File watching, changes in the vault are reflected in real time
Available via the Command Palette (Cmd+Shift+P / Ctrl+Shift+P):
| Command | Description |
|---|---|
Obsidian VFS: Mount Folder |
Pick a vault folder (depth controlled by depthLimit setting) and add it to the Explorer tree view |
Obsidian VFS: Mount Note |
Search vault notes and add one to the Explorer tree view |
Obsidian VFS: Unmount Entry |
Remove a mounted vault entry from the tree view |
Obsidian VFS: Open in Obsidian |
Open the active vault file in the Obsidian app (works from both obs:// and file:// documents) |
Obsidian VFS: Search Notes |
Quick Pick search across all vault Markdown files |
Obsidian VFS: Copy Path |
Copy the active file's obs:// URI to the clipboard (Shift+Alt+Cmd+C on obs:// files) |
Obsidian VFS: Move into Vault |
Move a file from the current project into a mounted vault folder (Explorer context menu, editor title, or Command Palette) |
Obsidian VFS: Duplicate into Vault |
Duplicate a file from the current project into a mounted vault folder (Explorer context menu, editor title, or Command Palette) |
Obsidian VFS: Reload Vault |
Re-scan the vault root and refresh files.exclude patterns and Explorer tree view |
Configure via Settings UI or settings.json:
| Setting | Type | Default | Description |
|---|---|---|---|
obsidianVFS.cliPath |
string |
"" |
Path to the Obsidian CLI binary (empty = auto-detect) |
obsidianVFS.timeoutMs |
number |
10000 |
CLI operation timeout in milliseconds |
obsidianVFS.autoMount |
string[] |
[] |
Vault-relative paths (folders or notes) to display in the Explorer tree view and workspace folders |
obsidianVFS.depthLimit |
number |
4 |
Maximum directory depth when listing vault folders and notes (0: unlimited, 1: top-level only) |
Controls vault-side files.exclude policy written to <vault>/.vscode/settings.json.
| Setting | Type | Default | Description |
|---|---|---|---|
obsidianVFS.vault.mode |
"rw" | "ro" | "partial" |
"rw" |
Write access mode: "rw" (read-write, all writes allowed), "ro" (read-only, no writes through obs://), "partial" (writes only to autoMount paths) |
obsidianVFS.vault.gitIgnore |
boolean |
true |
Add the vault to git.ignoredRepositories so VS Code's Git extension skips it |
obsidianVFS.vault.excludeBlocked |
boolean |
true |
Hide blocked folders (from .obsidian/obsidian-vfs.json) via files.exclude |
obsidianVFS.vault.excludeDotfiles |
boolean |
true |
Hide dot-files and dot-directories at the vault root (.obsidian, .trash, etc.) |
obsidianVFS.vault.excludeDotfilePattern |
string |
^\\. |
Regex for dotfile names to hide (e.g., ^\\.(obsidian|trash) to only hide those two) |
| Setting | Type | Default | Description |
|---|---|---|---|
obsidianVFS.statusBar.enabled |
boolean |
true |
Show vault name and mode in the status bar |
| Setting | Type | Default | Description |
|---|---|---|---|
obsidianVFS.explorer.enabled |
boolean |
true |
Show the Obsidian VFS tree view in the Explorer sidebar |
obsidianVFS.explorer.contextMenu |
boolean |
true |
Show Obsidian VFS items in right-click context menus (Explorer, editor title, tree view) |
obsidianVFS.explorer.title |
string |
"" |
Custom title for the Explorer tree view (defaults to obs://<vault>) |
| Setting | Type | Default | Description |
|---|---|---|---|
obsidianVFS.workspace.enabled |
boolean |
true |
Add the vault as a workspace folder for Quick Open and Search (see below) |
obsidianVFS.workspace.codeWorkspaceFile |
boolean |
false |
Generate a .code-workspace file named after the project. Avoids the "Untitled (Workspace)" label. |
obsidianVFS.workspace.excludeUnmountedFolders |
boolean |
true |
Hide sibling directories at partially-mounted vault levels not in autoMount |
obsidianVFS.workspace.excludeUnmountedFiles |
boolean |
true |
Master toggle for file exclusion at partially-mounted levels |
obsidianVFS.workspace.excludeUnmountedFilePattern |
string |
\.(md|base|canvas)$ |
Regex for file basenames to hide. Covers Obsidian's three core formats by default. Examples: \.(md|base|canvas|pdf)$, ^README. |
All toggle settings take effect immediately — no reload required.
When obsidianVFS.workspace.enabled is true and at least one autoMount entry is configured, the extension adds a single file:// workspace folder at the vault root (named obs://<vault> in the sidebar). VS Code's Quick Open (Cmd+P) and Search (Ctrl+Shift+F) discover vault files through this folder.
The Explorer tree view (the obs:// custom sidebar panel) only shows entries in autoMount. The workspace folder shows everything unless hidden by files.exclude — the extension writes patterns to match the tree view's visibility.
Non-autoMount vault content (.obsidian/, .trash/, and any directories not in autoMount) is hidden from Explorer and Quick Open via files.exclude patterns managed by the extension. Your own files.exclude patterns are never modified or removed.
Requirements:
- At least one local folder must be open — the vault workspace folder is appended to the list to avoid triggering an extension host restart.
- At least one
autoMountentry must be configured — the workspace folder is not added whenautoMountis empty.
How it works:
- The extension scans the vault root and adds
files.excludepatterns for entries not inautoMount. Patterns are split into two tiers: vault-global patterns (dotfiles andblockedpaths) are written to<vault>/.vscode/settings.json— controlled byvault.excludeDotfiles,vault.excludeDotfilePattern, andvault.excludeBlocked; remaining non-autoMount directories and file extension globs are written to workspace settings — controlled byworkspace.excludeUnmountedFolders,workspace.excludeUnmountedFiles, andworkspace.excludeUnmountedFilePattern. All managed patterns are tracked internally for cleanup. - When
autoMountentries or anyvault.*/workspace.*toggle changes, patterns are re-synced automatically — stale patterns are removed and new ones added. - When new dotfiles or directories are added to the vault outside VS Code, run Obsidian VFS: Reload Vault to manually refresh patterns and the tree view.
- When
obsidianVFS.workspace.enabledis disabled, all managed patterns are removed and the workspace folder is deleted. - The vault's
.gitrepository is automatically added togit.ignoredRepositories(user-level setting) whenvault.gitIgnoreis true and a workspace folder is active, preventing VS Code's Git extension from listing it in Source Control. The entry is removed whenvault.gitIgnoreis disabled or the workspace folder is removed.
Sub-path mounting: When autoMount contains nested paths (e.g., ["areas/projects"]), only the mounted sub-directory is visible. Sibling directories under the same parent are hidden:
autoMount: ["areas/projects"]
Vault structure: File explorer visibility:
areas/ areas/
projects/ projects/ ← visible (mounted)
personal/ (personal/ hidden)
work/ (work/ hidden)
This matches the tree view — only mounted paths appear in both views.
Known limitations:
- Vault
.vscode/directory: The extension creates.vscode/settings.jsoninside the vault for vault-globalfiles.excludepatterns (dotfiles andblockedpaths). These patterns are independent ofautoMountand apply to any workspace that includes the vault. The.vscode/directory itself is never managed by the extension — if you want to hide it, add.vscodeto your ownfiles.exclude. WhenobsidianVFS.workspace.enabledis disabled, all managed patterns are removed from both folder and workspace settings. If your vault is git-tracked, consider adding.vscode/to the vault's.gitignore. - Not a security boundary:
files.excludehides content from Explorer and Quick Open but does not enforce access restrictions. Theobs://FileSystemProvider's path security (allowed/blockedlists in.obsidian-vfs.json) applies to tree view, wikilink, and drag-and-drop operations. - Write protection covers
obs://only:vault.mode("ro"/"partial") guards write operations through theobs://FileSystemProvider— tree view sidebar, drag-and-drop into the tree, andobs://editor saves. Thefile://workspace folder (Explorer panel, Quick Open, Search) bypasses the provider and remains writable regardless of vault mode. This gap closes when VS Code stabilizesFileSearchProvider/TextSearchProvider, allowing a singleobs://workspace folder. - Temporary workaround:
files.excludeis used because VS Code'sFileSearchProvider/TextSearchProviderAPIs are still proposed (unstable). When stabilized, the extension can switch to a singleobs://workspace folder with native search, eliminating thefiles.excludepatterns entirely. - Title bar: Adding the vault as a workspace folder creates a multi-root workspace. VS Code may show "UNTITLED (WORKSPACE)" in the title bar.
Notes:
- The Explorer tree view and the workspace folder both appear in the sidebar. The tree view provides custom UI (welcome view, context menus, drag-and-drop), while the workspace folder enables Quick Open and full-text search.
- The
obs://FileSystemProviderremains registered for the tree view sidebar, link navigation, and drag-and-drop — it does not back a workspace folder.
When obsidianVFS.workspace.enabled adds the vault folder dynamically, VS Code transitions to a multi-root workspace. Because no .code-workspace file is involved, the title bar shows "UNTITLED (WORKSPACE)" — this is standard VS Code behavior for unsaved multi-root workspaces.
Enable obsidianVFS.workspace.codeWorkspaceFile to fix this. The extension generates a <project-name>.code-workspace file in your project root (e.g., my-app.code-workspace) and prompts you to open it.
What happens when you enable it:
- The extension creates
<project-name>.code-workspacein your project root containing the local folder(s) and thefile://vault folder entry (namedobs://<VaultName>). - A notification asks: "Open workspace file? This will reload the window."
- If you click Open, the window reloads once. After that, the title bar shows the project name and the vault is part of the saved workspace.
- On subsequent activations, the extension detects you're already in a saved workspace and skips the prompt. Vault-global
files.excludepatterns (dotfiles andblockedpaths) are written to<vault>/.vscode/settings.json; workspace-specific patterns (non-autoMount directories) are written to workspace settings (routed to the.code-workspacefile when one is active, or to the project's.vscode/settings.jsonotherwise). - If you click Not Now, the extension falls back to adding the vault dynamically via
updateWorkspaceFolders(withfiles.excludepatterns in the vault's.vscode/settings.json). You can open the generated workspace file later.
UX trade-offs:
- One-time window reload — opening the workspace file causes VS Code to reload the window. This only happens once; after that the workspace file is saved and reloads are not needed.
- File on disk — a
.code-workspacefile is created in your project root. You can commit it to version control (so teammates get the same workspace layout) or add it to.gitignore. - No overwrite — if a
.code-workspacefile already exists (e.g., from a previous run or your own), the extension will not overwrite it. It offers to open the existing file instead. files.excludecontainment — vault-global patterns (dotfiles andblockedpaths) are scoped to the vault workspace folder, preventing vault dotfiles (.git,.obsidian) from hiding same-named entries in your project. Workspace-specific patterns (non-autoMount directories like00-inbox,40-log) use workspace settings and are unlikely to collide with project entries.
When to use each setting:
| Goal | Setting |
|---|---|
| Browse vault in Explorer, Quick Open, Search (accept "Untitled Workspace" label) | workspace.enabled: true |
| Same as above, but with a proper project name in the title bar | workspace.enabled: true + workspace.codeWorkspaceFile: true |
| Browse vault only via the sidebar tree view (no workspace folder at all) | workspace.enabled: false |
This VSCode extension provides file-system access and UI integration for Obsidian vaults. If you use Claude Code, the companion @obsidian-vfs/claude-plugin enables Claude to read and search your vault via @obs: mentions and automatically resolves wikilinks in agent definitions and skills.
- Obsidian installed with a vault open
- The
obsidianCLI on your PATH (or setobsidianVFS.cliPath)
code --install-extension obsidian-vfs.vsixOr via the Extensions sidebar: ··· menu > Install from VSIX...
git clone https://github.com/otaviof/obsidian-vfs.git
cd obsidian-vfs
pnpm install
pnpm package:vscode
code --install-extension packages/vscode/obsidian-vfs.vsixReload the window after installing (Developer: Reload Window).
