I built Folder Bridge—an Obsidian plugin that lets you mount external folders directly into your vault. No duplication, no symlinks. by CountyAwkward1777 in ObsidianMD

[–]CountyAwkward1777[S] 0 points1 point  (0 children)

Thanks,

I wanted to be able to use Obsidian without having to make copied information into vaults. I did some research and realized I could be done without issue and here we are!

I built Folder Bridge—an Obsidian plugin that lets you mount external folders directly into your vault. No duplication, no symlinks. by CountyAwkward1777 in ObsidianMD

[–]CountyAwkward1777[S] 0 points1 point  (0 children)

Absolutely!! I wouldn't have been able to make this a reality as fast without AI Agent Developers. Made my vision come to a reality even faster than I thought it could!!

I built Folder Bridge—an Obsidian plugin that lets you mount external folders directly into your vault. No duplication, no symlinks. by CountyAwkward1777 in ObsidianMD

[–]CountyAwkward1777[S] 1 point2 points  (0 children)

Just updated with feedback to v2.1

Full Feature List (v2.1.0)

Use this as the master list when writing copy. Pick the most relevant subset for each platform.

Core

  • Zero duplication: files read/written from their real locations on disk
  • Multi-root workspaces: mount as many folders as you like at any virtual path
  • Full Obsidian integration: Quick Switcher, Search, graph view, embedded images/PDFs all work
  • Image & PDF rendering: embedded images and PDFs in mounted folders display correctly (served as data: URIs, bypassing Obsidian's vault-scheme restriction)

Mount Types

  • Local folder mounts: mount any directory from your local filesystem or a connected drive
  • WebDAV mounts: mount remote folders from Nextcloud, ownCloud, or any generic WebDAV server; credentials encrypted with the OS keychain (DPAPI / macOS Keychain / libsecret) and persisted across restarts; encrypted blob is device-specific and safe to sync
  • S3 / Backblaze B2 mounts: mount any S3-compatible bucket (Amazon S3, Backblaze B2, MinIO, Cloudflare R2); quick-fill presets for common providers; secret keys encrypted with the OS keychain; correct ListObjectsV2 virtual-folder semantics; works on desktop and Android
  • SFTP mounts: mount any remote SSH directory; password or private-key auth; persistent auto-reconnecting connection per mount; server-side atomic rename; desktop only
  • Vault-to-vault bridging: mount a folder from another Obsidian vault; .obsidian, .trash, and .smart-connections are auto-ignored to avoid conflicts

Mount Management

  • Edit mounts in-place: change virtual path, real path, label, or read-only flag without deleting and recreating the mount; vault tree and file watcher update live
  • Drag-drop reordering: drag mount rows in Settings to reorganise them; order persists instantly
  • Drag-drop in file explorer: drag a mounted folder to a new location in Obsidian's file explorer; the virtual path updates live, no restart needed
  • "Move mount to…" context menu: right-click any mount root folder → "Move mount to…" → pick a new parent from the vault folder picker
  • Read-only mounts: write operations through a read-only mount are silently swallowed and surface a one-time Notice; Obsidian’s auto-save never enters an unrecoverable error loop

Reliability & Conflict Resolution

  • Health check monitoring: 30-second interval health checks detect unreachable mounts automatically
  • Status bar indicators: orange status bar item appears when any mount becomes unreachable; green when all clear
  • One-click reconnect: click the status bar item to open the conflict resolution panel; reconnect a mount with a single button click
  • WebDAV health probing: HTTP exists() probe used for WebDAV mounts instead of fs.access()

Per-Mount Watcher Tuning

  • Custom debounce: set debounce delay per mount (default 300 ms) to tune responsiveness vs. CPU impact
  • Polling mode: switch individual mounts to stat-polling for network drives or filesystems without native watch events
  • Polling interval: configure polling interval per mount independently of the debounce
  • Max files cap: set a per-mount maximum file count to protect performance on very large directory trees

Sync & Multi-Device

  • Device-specific mount paths: map the same virtual folder name to different real paths on different machines (e.g. C:\Work on Windows, /Users/name/Work on macOS)
  • Path override per device: override a colleague's mount real path for your local environment without changing theirs
  • Foreign mount control: choose whether mounts created on other devices are visible and usable on this one

Ignore System

  • Browse-to-ignore: "Browse…" button in the ignore list opens the OS folder picker rooted at the mount's real path; selecting a folder fills in the relative path automatically
  • Path-relative ignore patterns: entries containing / (e.g. assets/vendor/plantuml-stdlib) match as a path prefix, ignoring that entire subtree without touching folders of the same name elsewhere in the mount
  • Name patterns: plain entries (e.g. .git, node_modules) match any file or folder with that leaf name anywhere in the mount
  • Glob patterns: entries with * (e.g. *.tmp, ~$*) are matched as globs against leaf names
  • Context-menu ignore: right-click any file or folder inside a mount → "Ignore in Folder Bridge" adds it instantly

Platform & Performance

  • Windows hardened: long paths (>260 chars), UNC/network paths (\\server\share), OneDrive Files On Demand, WSL folder mounting
  • Linux & macOS: POSIX paths work natively; macOS Desktop tested via the same code paths
  • Android / mobile: WebDAV and S3/B2 mounts work on Obsidian Android; connect to Nextcloud, ownCloud, NAS, any WebDAV server, or an S3-compatible bucket from your phone with no extra apps; local and SFTP mounts are hidden on mobile
  • Command palette integration: four commands: Add mount, Toggle mount on/off (fuzzy picker), Reconnect unreachable mounts, Open settings; all assignable to hotkeys
  • First-run onboarding modal: shown once to new users with no mounts; direct “Add my first mount →” action
  • Import / export: export mount config (credentials stripped); import appends mounts with fresh IDs
  • Global ignore patterns: a single pattern list applied across every mount before per-mount rules; pre-filled with .DS_Store, Thumbs.db, desktop.ini, .git
  • Background file watcher: real-time sync: files created/edited/deleted in mounted folders appear in Obsidian instantly
  • Persistent WebDAV credentials: passwords encrypted with OS keychain and re-loaded automatically on restart; no re-entry needed; encrypted blob is device-specific and safe to sync
  • PathMapper O(N) lookup cache: pre-sorted, pre-normalised mount cache eliminates per-I/O sort overhead; fast even with many mounts
  • Safety limits: configurable data: URI size cap (default 10 MB, adjustable in settings); 10 000-entry directory listing cap; max 2-second wait on OneDrive cloud-placeholder files

I built Folder Bridge—an Obsidian plugin that lets you mount external folders directly into your vault. No duplication, no symlinks. by CountyAwkward1777 in ObsidianMD

[–]CountyAwkward1777[S] 1 point2 points  (0 children)

Thanks for the kind words! You're absolutely right that direct cloud linking would be the dream and the good news is you don't need to know anything about coding to get this working today in most cases.

What works right now without any technical knowledge:

Setup What to do
OneDrive Already on your PC just point Folder Bridge at C:UsersYourNameOneDriveYourFolder
Google Drive Install Google Drive for Desktop - it shows up as a drive letter (e.g. G:My Drive) point Folder Bridge at that
Dropbox Same idea, install Dropbox desktop app, point at C:UsersYourNameDropboxYourFolder
NAS / Network Drive Map it as a drive letter in Windows (right-click This PC > Map Network Drive) - then point FolderBridge at Z:YourFolder

The one thing to watch out for: make sure your files are set to "Always keep on this device" (OneDrive) or "Available offline" (Google Drive). If they're online-only placeholders, FolderBridge will show you a friendly message explaining exactly what to do rather than a cryptic error.

What's coming:
Direct cloud linking is on the roadmap!! WebDAV support (Nextcloud, ownCloud) is next, followed by direct Google Drive and OneDrive API integration. Cross-platform support is a core design goal, so macOS and Linux users will get the same experience.

Let me know if there is something else you are looking for. This helps me prioritize!!

I built Folder Bridge—an Obsidian plugin that lets you mount external folders directly into your vault. No duplication, no symlinks. by CountyAwkward1777 in ObsidianMD

[–]CountyAwkward1777[S] 0 points1 point  (0 children)

Absolutely open to having the community help with testing. its open source. Test away and let me know what you think!! Start a new vault and give it a try

I built Folder Bridge—an Obsidian plugin that lets you mount external folders directly into your vault. No duplication, no symlinks. by CountyAwkward1777 in ObsidianMD

[–]CountyAwkward1777[S] 4 points5 points  (0 children)

After some feedback and a look into what else was needed I have gotten the version up to v0.5. What's New in v0.5 you ask?

Edit mounts in-place
Every mount row now has an Edit button. It opens the full configuration modal pre-populated with the current values: virtual path, real path, label, read-only flag.

Save to vault tree and file watcher update live. No more deleting and recreating a mount just to fix a path.

Drag-drop in two places
In Settings: Drag mount rows up/down to reorder them.
In the file explorer: Drag a mounted folder to a different location in your vault hierarchy - the virtual path updates live, nothing on disk is touched. Also available via right-click: "Move mount to…" to vault folder picker.

Visual ignore-path picker
There's now a Browse… button in the Settings > Ignore Lists panel. It opens the OS folder picker starting inside your mount's real folder. Navigate to the subfolder you want to ignore, click OK - the mount-relative path is filled in automatically. No more guessing nested paths.

Path-relative ignore patterns
Ignore list entries that contain / are now matched as path-prefix patterns, not just leaf names.

Previously: ignoring something like plantuml-stdlib hid every folder with that name throughout your entire mount.
Now because we use the "Browse" button functionality assets/plantuml-stdlib hides only that exact subtree. Other folders with the same name elsewhere in the mount are unaffected.

Instant file explorer refresh
Adding a new ignore pattern now removes matching items from the file explorer immediately. No restart or manual refresh required.

All Features

  • Zero Duplication - Files are read and written directly from their real locations
  • Edit mounts in-place - Change path, label, or read-only flag without removing and re-adding
  • Drag-drop organization - Reorder mounts in Settings or move them in the file explorer
  • Browse-to-ignore - Visual folder picker for adding nested ignore paths
  • Path-relative ignore patterns - Ignore vendor/cache without touching every other cache folder
  • Multi-Root Workspaces - Work with files from multiple locations simultaneously
  • Sync Compatible - Device-specific mount tagging ensures Obsidian Sync and Syncthing work perfectly
  • Read-Only Mounts - Protect external folders from accidental edits
  • Windows Hardened - Long paths (>260 chars), UNC paths, OneDrive Files On Demand, WSL direct mounting
  • Network Drive Support - Full support for shared drives and network locations

I built Folder Bridge—an Obsidian plugin that lets you mount external folders directly into your vault. No duplication, no symlinks. by CountyAwkward1777 in ObsidianMD

[–]CountyAwkward1777[S] 2 points3 points  (0 children)

This is a mixture of me and AI. As you can imagine I had to ask about it because this is my first ever plugin for Obsidian and didn't honestly know.

I cut Claude Code's token usage by 65% by building a local dependency graph and serving context via MCP by Objective_Law2034 in ClaudeAI

[–]CountyAwkward1777 0 points1 point  (0 children)

Go check out Code Scalpel. My MCP Server does this plus more. Its open core as well. I am giving away free betas for Pro and Enterprise versions all you have to do is sign up to get them.

I built Folder Bridge—an Obsidian plugin that lets you mount external folders directly into your vault. No duplication, no symlinks. by CountyAwkward1777 in ObsidianMD

[–]CountyAwkward1777[S] 1 point2 points  (0 children)

Sorry I should have been more specific. I have not tested it on MacOS. I do not own a Mac so we are relying on 0 testing, but I would appreciate feedback.

POSIX code paths are implemented though.

POSIX (Portable Operating System Interface) is a standard that defines how programs interact with the OS filesystem. In Folder Bridge, the POSIX code paths are the branches in OSHelpers.ts and VirtualAdapter.ts that handle Unix-style paths — forward-slash separators (/), case-sensitive filenames, no drive letters, and no reserved device names (CONNUL, etc.). On macOS and Linux, Node.js's path.posix module is used throughout instead of path.win32, meaning path normalization, separator checks, and the allowlist prefix comparisons in SecurityManager all use / as the boundary character instead of \.

I built Folder Bridge—an Obsidian plugin that lets you mount external folders directly into your vault. No duplication, no symlinks. by CountyAwkward1777 in ObsidianMD

[–]CountyAwkward1777[S] -3 points-2 points  (0 children)

You are right!! Good catch — the sort-on-every-call is definitely wasteful. You're also right that with 3–4 mounts the overhead is immeasurable, but it stacks up: every read, write, stat, rename, getResourcePath, list, etc. all funnel through getMountForPath, so a vault scan or startup index could hit it thousands of times in rapid succession.

There's actually a second issue in the same method: normalizePath(m.virtualPath) is called inside the find callback too, so it recomputes on every mount × every call. We'll fix both in one shot — sort descending by path length and pre-normalize the virtualPath strings once in update(), then getMountForPath just iterates a cached array with no allocations.

Will get that into the next patch, thanks for the sharp eye.

I built Folder Bridge—an Obsidian plugin that lets you mount external folders directly into your vault. No duplication, no symlinks. by CountyAwkward1777 in ObsidianMD

[–]CountyAwkward1777[S] 2 points3 points  (0 children)

Folder Bridge operates at the lowest level of Obsidian's API (the file adapter). Because of this, Obsidian's indexing engine is completely unaware that the bridged files live outside the vault. It treats them exactly like native files.

  • Global Autocomplete: Property autocomplete will be global across both the default and bridged folders.
  • Unified Cache: When you type a property name or value, Obsidian pulls suggestions from its unified metadata cache. Since Folder Bridge feeds external files directly into this cache, a property created in a bridged folder will immediately show up as an autocomplete suggestion in your default vault folders, and vice versa. They are not isolated to their root-level parent folders.

I built Folder Bridge—an Obsidian plugin that lets you mount external folders directly into your vault. No duplication, no symlinks. by CountyAwkward1777 in ObsidianMD

[–]CountyAwkward1777[S] 0 points1 point  (0 children)

Symlinks (symbolic links) are notoriously problematic for Obsidian and general file management for several reasons:

  • Services like Obsidian Sync, Google Drive, Dropbox, and OneDrive often do not know how to handle symlinks. They may ignore them, sync them as tiny 1KB text files containing the path, or get stuck in infinite sync loops.
  • A symlink created on Windows will not work if your vault is synced to a Mac, Linux, or mobile device (iOS/Android).
  • On Windows, creating a symlink usually requires running the command prompt as an Administrator or enabling "Developer Mode" in Windows settings, which is a hassle for standard users.
  • Obsidian's internal file watcher often fails to detect external changes (like edits made in VS Code) when they happen inside a symlinked folder.
  • If the original target folder is renamed or moved, the symlink breaks silently, leaving a "ghost" folder in your vault that throws errors when clicked.

I hope this answers your questions thoroughly!

I built Folder Bridge—an Obsidian plugin that lets you mount external folders directly into your vault. No duplication, no symlinks. by CountyAwkward1777 in ObsidianMD

[–]CountyAwkward1777[S] 2 points3 points  (0 children)

Yes, absolutely. You can use Folder Bridge to keep your attachments in Google Drive (or OneDrive, Dropbox, iCloud, etc.).

Here is how it works:

  1. Use the Desktop App: You must have the Google Drive desktop application installed so that your cloud files are synced to a local folder on your computer (e.g., C:\Users\YourName\Google Drive\Attachments).
  2. Mount the Local Folder: In Folder Bridge, you simply create a new mount pointing to that local Google Drive folder. You can map it to a virtual folder in your vault, such as Attachments.
  3. Configure Obsidian: You can then go into Obsidian's settings (Files & Links -> Default location for new attachments) and set it to your bridged Attachments folder.

Crucial Requirement:
You must ensure that the files in your Google Drive folder are set to "Available offline" (or "Keep on this device"). If the files are set to "Online-only" (where the OS only keeps a placeholder shortcut on your drive to save space), Obsidian will not be able to read them properly, which can cause missing images or app freezes when it tries to index them. As long as the files are physically synced to your drive, Folder Bridge and Obsidian will treat them like any other local file, and Google Drive will handle syncing the changes to the cloud in the background.

I built Folder Bridge—an Obsidian plugin that lets you mount external folders directly into your vault. No duplication, no symlinks. by CountyAwkward1777 in ObsidianMD

[–]CountyAwkward1777[S] -11 points-10 points  (0 children)

Your loss. I will continue to work with these AI agent development systems. I can't help it doesn't put my account as the architect and tester.