Repository navigation
Releases
0.2.0
This release is about the safety of the sync itself. The logic was reviewed against the Unison specification, Git's handling of its index, rclone bisync and R2's documented behaviour, and is now also tested with random histories on three devices.
Fix
- A conflict copy could be given a name that was already in use, for example a conflict copy another device had made in the same second, and replace that file. An edit that had not been synced yet could be lost this way. Conflict copies now only take names that are free both locally and on the remote, and a rename never replaces an existing file.
Safer syncing
- Changes are judged by content. The sync record now keeps a hash of each synced file. A file that was only touched (copied, restored, checked out again) is no longer uploaded and can no longer cause a false conflict.
- Edits made in the same instant as a sync are no longer missed. Files synced within three seconds of their modification time are compared by content on the next pass.
- Deletions look again first. Before deleting on the remote, the object is checked once more, so a version another device uploaded during the sync is not removed.
- An empty side always asks. If the local vault or the bucket appears empty while the record lists three or more files, the sync asks for confirmation, whatever the size of the vault.
- Case-insensitive file systems (macOS). Names that differ only in letter case are skipped and reported, instead of one replacing the other and the missing one being deleted everywhere.
- Progress is saved during long syncs, so an interrupted sync resumes cleanly.
Paths to ignore
.git,.trash,node_modules,.DS_Storeand the per-deviceworkspace.jsonfiles are now the default contents of "Paths to ignore", where you can see and edit them. Most were always skipped, but invisibly. Existing installations get them added once.- Patterns follow
.gitignoremore closely: a name without a slash, such as.gitor*.tmp, now matches at any depth. If you had a pattern without a slash, it now also matches in subfolders.
Upgrading
Nothing to do. The existing sync record is read as it is and gains content hashes as files are synced.
Install
Download main.js and manifest.json below into <vault>/.obsidian/plugins/artoo-veetoo/, then enable R2V2 under Community plugins. See the README for setup.
0.1.4
Fixes
- If the plugin's folder goes missing while Obsidian is running (for example because it was renamed), the plugin no longer syncs. Previously every sync in that state behaved like a first sync, which brought deleted files back and turned edits into conflicts, with only a console message. It now shows a notice asking you to reload Obsidian and enable the plugin again.
- A failure to save the sync record is now reported with a notice instead of only in the console.
Install
Download main.js and manifest.json below into <vault>/.obsidian/plugins/artoo-veetoo/, then enable R2V2 under Community plugins. See the README for setup.
0.1.3
Changes
- The settings tab uses Obsidian's declarative settings API, so R2V2's settings now appear in Obsidian's settings search.
- Requires Obsidian 1.13.2 or later (previously 1.11.4).
- Internal cleanups from the community directory review; the project is now linted with
eslint-plugin-obsidianmd.
No changes to syncing or encryption. Existing settings and stored secrets carry over.
Install
Download main.js and manifest.json below into <vault>/.obsidian/plugins/artoo-veetoo/, then enable R2V2 under Community plugins. See the README for setup.
0.1.2
Changes
- The interface is now available in English as well as Japanese. It follows Obsidian's language setting: Japanese for
ja, English otherwise. This covers settings, notices, dialogs and error messages. - The README is now in English, with the Japanese version in README.ja.md.
No changes to syncing or encryption.
Install
Download main.js and manifest.json below into <vault>/.obsidian/plugins/artoo-veetoo/, then enable R2V2 under Community plugins. See the README for setup.
0.1.1
The plugin ID is now artoo-veetoo. The community directory does not accept IDs containing digits, so r2v2 had to go; the display name is still R2V2.
No functional changes since 0.1.0.
Upgrading from 0.1.0
The plugin folder is named after the ID, so rename it in each vault and enable the plugin again under Community plugins:
mv <vault>/.obsidian/plugins/r2v2 <vault>/.obsidian/plugins/artoo-veetooSettings, stored secrets and the sync record carry over.
Install
Download main.js and manifest.json below into <vault>/.obsidian/plugins/artoo-veetoo/, then enable R2V2 under Community plugins. See the README for setup (in Japanese).
0.1.0
First release.
R2V2 ("R2 Vault to Vault") syncs an Obsidian vault between desktops through a Cloudflare R2 bucket. Everything is encrypted on your device before upload.
Features
- Two-way sync with a three-way comparison against the last synced state, so deletions propagate and edits are not lost
- Mandatory end-to-end encryption of file contents, file names and modification times (scrypt + AES-256-GCM)
- Conflicts keep both versions by default, or the newer one if you prefer
- Confirmation before a sync that would overwrite or delete a large share of the vault
- Sync on startup, on an interval, after edits, or on demand
- Optional sync of the config folder, ignore patterns, file size limit
- The R2 secret key and the encryption password are kept in Obsidian's secret storage
Requirements
- Obsidian 1.11.4 or later, desktop only (Linux and macOS)
- Your own Cloudflare account with an R2 bucket and an API token
Install
Download main.js and manifest.json below into <vault>/.obsidian/plugins/r2v2/, then enable R2V2 under Community plugins. See the README for setup (in Japanese).
Notes
- The plugin only talks to the S3 API endpoint of your own R2 account. No telemetry.
- If you forget the encryption password, the remote copy cannot be decrypted. Your local vaults are unaffected.
- The encryption has not been audited by a third party. Its design, limits and tests are described in the README.