Nick70 downloadsSync file contents with Google Drive using AES-256-GCM encryption, with encryption keys kept on your device.
Sync file contents with Google Drive using AES-256-GCM encryption, with encryption keys kept on your device.
Requires Obsidian 1.13.0 or later on desktop. Settings are indexed by Obsidian's global settings search.
This plugin needs your own Google account and a Google Cloud OAuth client. It sends authorization and encrypted file data only to Google (accounts.google.com, oauth2.googleapis.com, and www.googleapis.com). It does not upload your vault to any other server.
127.0.0.1, protected by OAuth state and PKCE. No telemetry is collected.Password
│ PBKDF2 (SHA-256, 600K iterations, random salt)
▼
Password-Derived Key
│ AES-256-GCM wrap/unwrap
▼
Master Encryption Key ← stored wrapped in plugin data
│ AES-256-GCM (unique 12-byte IV per file)
▼
Encrypted file: [version · 1B] [IV · 12B] [ciphertext + auth tag]
Each file is encrypted independently with a fresh IV. The master key never leaves your device in plaintext.
main.js, manifest.json, and styles.css from the latest release.<your-vault>/.obsidian/plugins/encrypted-gdrive-sync/ (use your vault's configured settings folder if it is not .obsidian).Version 1.1.0 and later use the directory-compliant ID encrypted-gdrive-sync, and version 1.1.1 adopts the name Encrypted Google Drive Sync. The encrypted file format is unchanged.
e2e-gdrive-sync plugin folder, including its data.json.encrypted-gdrive-sync as described above.data.json to the new plugin folder. It contains your wrapped encryption key, Google authorization, and sync state. Keep the original key data to decrypt the existing backup.If your app is in "Testing" mode, add your Google account as a test user under OAuth consent screen → Test users.
Open Settings → Encrypted Google Drive Sync:
| Scenario | Action |
|---|---|
| New local file | Encrypt → upload |
| New remote file | Download → decrypt |
| Local file modified | Re-encrypt → upload |
| Remote file modified | Download → re-decrypt |
| File deleted locally | Restore from Google Drive (no automatic deletion) |
| File deleted remotely | Re-upload local copy (no automatic deletion) |
| Both sides modified or both exist without a previous sync record | Create a local conflict copy of the remote version, upload local version |
Default exclusions: .obsidian/, .trash/, .git/. Additional patterns can be configured in settings.
Deletion is intentionally not propagated: removing a file on one side restores it from the other. To remove a synced file permanently, delete it on every device and on Google Drive before syncing again. Back up your vault before the first sync. To decrypt an existing Drive backup on a second device, securely transfer the original plugin's key data (keyData in its data.json) and use the same Google Cloud OAuth client; a new password/key or an unrelated Google OAuth app cannot access the existing backup.
crypto.subtle), not a custom implementation.drive.file — the plugin can only access files it created.npm ci
npm run lint
npm test
npm run build # production build
npm run dev # watch mode
Tagged releases are built and tested in GitHub Actions. The workflow verifies the committed bundle and publishes signed artifact attestations for main.js, manifest.json, and styles.css.