Artem31 downloadsPreview-first Dropbox sync for an entire Obsidian vault, with conflict copies and deletion tombstones.
An experimental, preview-first Dropbox sync plugin for Obsidian on Windows and iPhone.
Synced Vault synchronizes your notes, attachments, images, and the visible Trash/ folder used by Synced Trash. It saves deletion tombstones in Dropbox so that an out-of-date second device cannot silently restore a deleted note. Concurrent edits are preserved in Sync Conflicts/ rather than discarded.
Version 0.2.3 is an early test release. Back up important notes before testing. Automated tests cover mocked Dropbox and simulated Windows/iPhone vaults; they are not a substitute for a real two-device test.
Use the command palette (Ctrl+P on Windows) and run Open Synced Vault panel. The panel opens in the left sidebar and displays whether Dropbox authorization is stored, the last successful sync time, and buttons for Sync now and Settings. Drag its tab beside File explorer, Search and Synced Trash to arrange the icons however you like. Obsidian remembers the tab position in its local workspace settings.
Sync now opens the existing change preview; it never skips confirmation before applying changes. The original sync button in the Ribbon and the Review and synchronize Dropbox vault command remain available. Connected to Dropbox means a saved authorization token is present, not that a network request has just succeeded.
Copy manifest.json, main.js, and styles.css from the install archive to:
<vault>/.obsidian/plugins/synced-vault/
Enable the community plugin in Obsidian → Settings → Community plugins. Installation must be repeated on each device, including iPhone. The plugin uses standard Obsidian APIs, not Node.js or Electron.
files.content.read, files.content.write, and files.metadata.read in the app's Permissions tab. Save the settings. You might need to reauthorize after changing scopes.main, on your Windows and iPhone Obsidian vaults. Use a unique ID for any unrelated vault.push uploads, pull downloads, tombstone records a local deletion, remove applies a remote deletion, and conflict preserves your local file in Sync Conflicts/ before applying Dropbox's version.Do not run Remotely Save and Synced Vault simultaneously on a live vault. First duplicate your vault to a separate test vault, disable Remotely Save in that copy, and try Synced Vault there on both devices. Synced Vault uses a separate Dropbox App Folder and never deletes Remotely Save's Dropbox data. Keep your existing Dropbox and local backups until you have validated repeated sync cycles, deletion, restoration, and conflicts yourself.
For each Vault ID, Dropbox stores a manifest at /vaults/<id>/manifest.json, plus immutable, SHA-256-named file payloads in /vaults/<id>/blobs/. The manifest records current paths and persistent deletion tombstones. Manifest updates use Dropbox's revision-based conditional write; a competing write fails rather than silently replacing another device's state. Each device records its last successfully synchronized hashes inside its local plugin settings, so it can distinguish a new edit from a deletion.
Conflicts favor the Dropbox version only after the previous local version is saved to Sync Conflicts/. The conflict copy can be reviewed and renamed manually. The plugin checks downloaded payloads against their content hashes before writing local files.
.obsidian configuration directory is excluded by default. You can opt in before the first sync to include most settings and community plugins. Workspace layout, Remotely Save configuration, and Synced Vault's own OAuth credentials and state are always excluded. The setting must be the same on both devices..trash, .git, and empty directories are not synchronized. The visible Trash/ is synchronized. All tombstones and immutable blobs remain in Dropbox indefinitely; server-side garbage collection is not implemented.The installed plugin has no runtime dependencies. Development source is kept in src/main.js; npm run build reproducibly creates the release main.js.
To run the built-in tests on a development machine with Node.js 18+:
npm ci
npm test
package-lock.json is committed so that CI can reproduce dependency resolution. The .github/workflows/release.yml workflow verifies the version tag, builds and tests the source, generates provenance attestations, and publishes a GitHub Release with a description taken from RELEASE_NOTES.md and the three installation files. Push the exact version tag from manifest.json without a v prefix. Let the workflow create the Release; do not create it manually first. GitHub Actions and workflow-token write permissions must be enabled.
The sync engine must list the vault's files to compare changes, detect deletions, and protect conflicting edits. This use of vault.getFiles() is intentional; removing it would break full-vault synchronization. .obsidian, .trash, and other excluded paths are filtered by the plugin's sync rules, and vault contents are sent only to the Dropbox App Folder you authorize. The scanner may continue showing a Vault Enumeration recommendation even when the code is functioning as designed.
Source contributions and bug reports should include the Obsidian version, platform, proposed preview operations, and the redacted error message. Never upload your OAuth code, token, or private notes.
MIT — see LICENSE.