Jeff Steinbok707 downloadsSync your Obsidian vault with OneDrive Personal/Consumer

Sync your Obsidian vault with OneDrive Personal accounts. Zero-config, mobile-friendly, battery-efficient.
📖 How It Works · Troubleshooting · Development
[!TIP] 🦞 OpenClaw Users - This pairs well with the 🦞🐚📝 Carapace Obsidian toolset when integrating these vaults with OpenClaw, so synced vault content can plug directly into your broader tool-driven workflow.
[!IMPORTANT] While I do work for Microsoft and on the OneDrive team, this plugin is in no way an official Microsoft plugin. Just a thing I needed and wanted to share. If you like it, give me a ⭐. As a friend of mine says, "I'm only in it for the subs and likes.".
.obsidian/workspace*.json) are intentionally excluded.[!NOTE] Upgrading from 1.0.x? Version 1.1.0 uses a new Azure app registration. After updating, you'll need to disconnect and reconnect to OneDrive in the plugin settings. Your files in OneDrive are not affected — the plugin will re-sync on first connection.
To clean up the old app authorization, visit account.live.com/consent/Manage, find the old entry (it may appear as "Obsidian OneDrive Sync by Jeff Steinbok"), and click Remove. You can also delete the old
/Apps/Obsidian OneDrive Sync by Jeff Steinbokfolder from your OneDrive if present.
JeffSteinbok/obsidian-onedrivemain.js and manifest.json from the latest release.obsidian/plugins/onedrive-sync/| Setting | Description |
|---|---|
| Sync Interval | Set to 0 for manual-only sync (recommended for battery) |
| Startup Sync Delay | Delay before first sync after launch (0 = disabled, 10s recommended) |
| Conflict Resolution | Last write wins (default), create duplicate, or manual |
| Sync App Settings | Optional — sync .obsidian/app.json, .obsidian/appearance.json, and .obsidian/hotkeys.json to keep appearance and hotkeys consistent across devices |
| Sync Plugins | Optional — sync plugin lists, manifests, and binaries (main.js, styles.css). Does not sync plugin data files (data.json) |
| Reset Sync Token | Clears delta cursors and tracked file state — the next sync re-reads everything from OneDrive. Upload-biased: any local-only files will be re-uploaded to cloud |
| Reconcile from Cloud | Treats cloud as authoritative. Deletes local-only files and downloads remote-only files. Use when Reset Sync Token can't clear stale local files. Large deletes confirmed |
| Custom Client ID | Optional — bring your own Azure AD app (see GitHub docs) |
| Debug Logging | Enable for troubleshooting. Writes a daily note under _OneDriveSyncLogs/YYYY-MM-DD.md (device-local, never synced) |
Available via the command palette (Ctrl/Cmd+P):
| Symptom | Use |
|---|---|
| "Plugin lost track of state, want a fresh re-read from cloud" | Reset sync token |
| "Files I deleted on another device are still here" | Reconcile from cloud |
| "I have files that pre-date the plugin and they need to be in cloud" | Reset sync token |
| "Vault has cruft that doesn't exist in OneDrive — wipe it" | Reconcile from cloud |
Reset sync token is upload-biased: local always wins, so any local-only file gets pushed to cloud on the next sync. Reconcile from cloud is the opposite: cloud always wins, local-only files get deleted (with a confirmation prompt for large deletes). Empty folders left behind by reconcile are pruned automatically — except folders that also exist in OneDrive.
The plugin hardcodes these exclusions for safety:
.obsidian/plugins/onedrive-sync/ — the plugin's own folder is always excluded to prevent syncing its data.json (which contains sync state and configuration) and to avoid self-downgrade scenarios where one device overwrites another's plugin binary. Authentication tokens are stored separately using Obsidian's SecretStorage API, not in data.json..obsidian/workspace*.json — per-device UI state (Obsidian Sync excludes these too)_OneDriveSyncLogs/ — device-local debug logs.syncIgnoreCreate a .syncIgnore file at your vault root to skip extra files/folders from sync (similar to .gitignore).
# starts a comment! negation patterns are not supportedprivate/*.tmp| App Folder (Default) | Full Access | |
|---|---|---|
| Permissions | Minimal — isolated app folder | Full OneDrive access |
| Scopes | User.Read, Files.ReadWrite.AppFolder, offline_access |
User.Read, Files.ReadWrite.All, offline_access |
| Location | /Apps/ObsidianOneDrive/ |
Anywhere you choose |
| Sharing | No | Yes — share via OneDrive |
| Browseable | Not easily | Yes — visible in OneDrive web/app |
| Best for | Personal vaults, privacy-focused | Shared/family vaults |
To switch modes: Settings → OneDrive Sync → Access Mode, then disconnect and reconnect.
/Documents/MyVault)Tip: Use "Create duplicate" conflict resolution to avoid overwriting each other's changes.
This plugin is designed with mobile as a primary target:
By default the plugin uses a shared Azure AD app registration. For privacy or rate-limit reasons you can bring your own:
Obsidian OneDrive Sync (or anything you like)Then paste the client ID into Settings → OneDrive Sync → Advanced → Custom client ID.
data.json and in a platform-appropriate secure store. They are never written to files that could be accidentally synced or exposed..obsidian/plugins/onedrive-sync/) is always excluded from sync. Even though tokens are no longer in data.json, the exclusion remains to prevent self-downgrade (one device overwriting another's plugin binary) and to keep device-specific sync state separate.