DNDark125 downloadsShare vault folders with trusted people on your LAN in real time - invite links, per-folder access control, and live sync. No cloud, no separate server required.
Vault Rooms shares selected folders of your Obsidian vault ("rooms") with trusted people on the same local network. One device hosts a small relay server; everyone else joins it from the plugin.
Create a room, invite members, grant per-path permissions, and collaborate on Markdown-backed workflows like Kanban boards and Tasks. It is LAN-first, deny-by-default, and never exposes your whole vault.
Identity is per-server: each device gets one token for the server it joined. Teams are named permission groups you can grant to a room at once; rooms are the shared folder boundary and are owned independently of any team. A room's access list grants or denies a user or a team, per path pattern.
Not cloud sync, not NAT traversal, not mobile, and not a sandbox for other Obsidian plugins. It syncs every regular file in a shared folder - text as text, everything else as binary - except dotfiles and dotfolders (see "Known limitations"). Character-level co-editing applies only to Markdown notes (see "CRDT sync"); it starts on for new rooms and can be changed per room.
On the hosting device:
The plugin cannot discover the LAN address automatically. After the entered address passes the host-side check, automatic server startup is enabled. The guided flow applies the current room defaults without asking for technical settings, including Live editing for Markdown notes.
On the teammate's device: install Vault Rooms, click the link, add a display name, join, then choose Add to this computer for the room under Rooms.
LAN share: reachable from this device only proves the host can reach its own address. It cannot prove the teammate's firewall or Wi-Fi client isolation will allow the connection - if they can't connect, use Test connection and see "Troubleshooting".
One device runs the relay; every other device is a client that only makes outbound connections to it. Your vault content never leaves your local network: there is no cloud service, no relay outside your LAN, and no analytics or telemetry of any kind.
There is exactly one exception to "no Internet traffic at all", and it carries no vault data: on load, the plugin
makes a single anonymous GET to the public GitHub Releases API to see whether a newer version exists, and shows
a notice if so. It sends no vault content, no room or file names, and no identifier of you or your server - only
what any HTTPS request reveals to GitHub (your IP address and the fact that a request was made). It fails
silently, so being offline costs nothing. See SECURITY.md.
The relay can run two ways, speaking the same protocol either way:
The relay owns all permission enforcement and keeps each room's file history in a local database. Clients hold a working copy of the rooms they mount.
See SECURITY.md for the threat model, token handling, and revocation limits. In short:
One status chip answers a single question - is your work syncing - using six states: Syncing, Connecting, Reconnecting, Not syncing, No access, Not set up. Hosting is a separate line below it, and appears only when this computer hosts, needs recovery, or has a hosting error; the two can disagree, which is exactly what happens when you work on a teammate's server while your own keeps running for others.
Below that are three tabs:
A tab with something needing attention shows a count next to its name. Technical detail - the server address, raw permissions, plugin suggestions, the folder overrides - lives behind Connection details, Manage, or Advanced rather than on the default screen. Destructive actions sit inside those surfaces and confirm first. Tabs are keyboard-navigable with arrow keys.
The room's source is the folder in the owner's vault that it shares - the one real copy everyone else reconciles against. In the room's Manage surface the owner sees it as In your vault at …, and everyone else as Shared from the owner's vault at …. Each device then keeps its own working copy: the owner shares in place (no second copy), while everyone else downloads the room into a folder under their root. Both the folder name teammates see and the folder used on this computer can be changed under Manage → Advanced.
Access can be withdrawn at four granularities, all enforced by the relay:
Deleting a room removes it and its history from the server; files already downloaded to someone's vault stay on their disk, only the sync tracking is dropped. Deleting a team removes its memberships and grants, not the rooms themselves.
Revocation stops future access. It cannot delete copies that were already synced to someone's device.
Rejoining creates a fresh identity, and the relay's file list is always the source of truth: files it has newer versions of are downloaded, files it has deleted are removed locally, files already in sync are left alone, and local edits you never pushed are preserved as a timestamped conflict copy rather than discarded. The same reconciliation runs on first mount, re-mount, and reconnect.
By default, concurrent edits to the same file are first save wins: the device that saves second keeps its version as a local-only conflict copy rather than losing it. The Rooms panel marks the room Needs a choice and offers Keep mine / Keep teammate's version.
Two things soften that for files which autosave constantly (a drawing plugin can save on every stroke): rapid edits to one file are coalesced into a single push, and a room can be set to Owner's version always wins instead of keeping both.
Latency: after you stop typing your edit is pushed within a fraction of a second, and the relay broadcasts it to every mounted device immediately - there is no polling. A device that was offline reconnects on its own, re-subscribes, and reconciles; you never need to add the room again. The panel's status chip tells you whether you're actually live.
New rooms start with Manage → Live editing on, giving their Markdown notes real-time, character-level merging. Existing rooms keep their previously saved value, and a manager can turn the setting on or off per room. Two people typing in the same note merge deterministically instead of one edit becoming a conflict copy.
.excalidraw.md. Every other file type in the room - including
*.excalidraw.md, which stores a drawing as structured JSON inside a Markdown file - keeps using normal
whole-file sync. Merging that JSON character by character could produce a drawing that no longer loads.This is the newest part of the plugin. Keep backups for important content while it continues its soak period. See SECURITY.md for its durability characteristics.
A room can recommend companion plugins (Kanban, Tasks); the room's Manage surface shows whether they're enabled locally. Vault Rooms never grants permission to run someone else's plugin code.
.txt,
.canvas, .json, .csv, and .excalidraw sync as UTF-8 text; every other extension (images, PDFs, audio,
video, Office documents, anything unlisted) syncs as base64-encoded binary by default. Binary content counts
against the size limit at roughly 1.33x its real size. A device predating this widening never sees a file
outside the old whitelist at all (it simply doesn't learn the path exists), rather than receiving content it
would misinterpret - see extendedBinarySync in the sync protocol.., e.g. .env, .secrets/) never sync, deliberately -
sharing a room's folder shouldn't risk shipping a teammate's local secrets file. This is the same rule that
already excludes the vault's own config folder and .git/node_modules.*.excalidraw.md.
Cursor presence is ephemeral: it appears only for authorized teammates who currently have the same note open,
is not persisted, and does not provide a room-wide participant or online list.*.excalidraw.md - re-uploads on rename.Start with Connection details → Test connection in the panel (or Test in Settings → Vault Rooms → Servers). It checks the address, whether anything answers, whether it's a Vault Rooms server with the expected identity, and whether this device's login still works - then names the step that failed.
127.0.0.1 always means "the computer that's asking", so it sends every teammate back to their
own machine. Use this device's LAN address instead. A browser can't validate a pinned server, so it isn't a
useful check either.file:read access to that exact path.
Cursor presence is intentionally absent when a note is only synced in the background..docx, .mp4, a file with no extension): they're on a build older
than 0.2.6, which only understood a fixed list of file types. Rather than hand them content they'd write to disk
incorrectly, the relay hides those paths from them entirely. Both devices need 0.2.6 or newer. Also check the
file isn't a dotfile and isn't over the server's size limit.MIT - see LICENSE.