Synchronize your Obsidian vault with Google Drive. Bidirectional sync with conflict resolution, pull-only mode, and git integration.
.gitignore compatible)gdrive-bisync.zip from the releases page.obsidian/plugins/gdrive-bisync/ folder in your vault (the folder name must match the plugin ID) and unzip the archive into itEach release also attaches the flat
main.js,manifest.json, andstyles.cssfiles, which is what the Obsidian community installer uses. Thegdrive-bisync.zipis an additional convenience for manual/BRAT installs and is also produced locally bybash build/build-release.sh(output:dist/gdrive-bisync.zip).
☁️ GDrive: idle. Use Test All in the Directory Mappings section to verify folder accessDocuments)https://drive.google.com/drive/folders/<FOLDER_ID>)| Command | Description |
|---|---|
| Sync now with Google Drive | Full bidirectional sync (upload + download + delete) |
| Pull from Google Drive | One-way download only (no uploads, no Drive deletions) |
| Show sync status | Display last sync time and synced file count |
| Resolve pending conflicts | Currently shows sync status (same as above); conflict review is handled inside the sync/pull flow |
| Action | Sync | Pull |
|---|---|---|
| Local file changed → upload to Drive | ✅ | ❌ Skipped |
| Drive file changed → download to local | ✅ | ✅ |
| Local file deleted → delete from Drive | ✅ | ❌ Skipped |
| Drive file deleted → delete locally | ✅ | ✅ |
| Conflict (both changed) | Prompt for resolution | Prompt for resolution |
Files and folders can be ignored during sync:
*.tmp, .DS_Store).trash, .obsidian).gitignoreAll settings are stored in .obsidian/plugins/gdrive-bisync/data.json:
data.json). This is standard for Obsidian plugins but means anyone with filesystem access to your vault can decrypt the tokens. Treat your vault's config with the same care as your credentials.npm install
npm run build
Output: main.js
bash build/build-release.sh
Output: dist/gdrive-bisync.zip
src/
├── auth/ # OAuth device code flow, token management
│ ├── OAuthClient.ts
│ └── TokenManager.ts
├── drive/ # Google Drive API client
│ ├── DriveClient.ts
│ ├── DriveChanges.ts
│ └── DriveFile.ts
├── git/ # Git integration
│ └── GitIntegration.ts
├── settings/ # Plugin settings UI and config
│ ├── SettingsManager.ts
│ └── SettingsTab.ts
├── sync/ # Sync engine and conflict detection
│ ├── ConflictDetector.ts
│ ├── SyncEngine.ts
│ ├── SyncPlan.ts
│ └── SyncStateManager.ts
├── types/ # TypeScript type definitions
│ └── index.ts
├── ui/ # Modal dialogs and status bar
│ ├── ConflictResolutionModal.ts
│ ├── SyncPreviewModal.ts
│ └── SyncStatusBar.ts
├── utils/ # Utilities
│ ├── CryptoUtils.ts
│ ├── FileUtils.ts
│ └── IgnoreUtils.ts
└── main.ts # Plugin entry point
MIT