Sync your Obsidian vault with Koofr cloud storage. Event-driven, bidirectional, mobile-friendly.
[!NOTE] This plugin is not affiliated with Koofr. It's built against Koofr's public REST API v2. Its architecture (sync engine, conflict resolution, settings UI) is adapted from obsidian-onedrive by Jeff Steinbok.
.obsidian/workspace*.json) are intentionally excluded.bartekmp/koofr-obsidian-syncmain.js, manifest.json, and styles.css from the latest release<vault>/.obsidian/plugins/koofr-sync/| Setting | Description |
|---|---|
| Sync Interval | Periodic sync interval. Set to "Manual" to disable timer-based sync. |
| Sync on file change | Disable to only sync on the interval or manually. |
| Startup Sync Delay | Delay before first sync after launch (0 = disabled, 10 s recommended). |
| Conflict Resolution | Last write wins (default), create duplicate, or manual review. |
| Sync App Settings | Optional — sync .obsidian/app.json, appearance.json, hotkeys.json. |
| Sync Plugins | Optional — sync plugin lists, manifests, and binaries (not plugin data files). |
| Sync CSS Snippets | Optional — sync .obsidian/snippets/. |
| Excluded Patterns | Glob patterns for files/folders to skip, stored in .syncIgnore. See below. |
| Pull-Only Mode | (Experimental) Download only, never upload local edits. |
| Debug Logging | Writes a daily log under _KoofrSyncLogs/YYYY-MM-DD.md (device-local, never synced). |
Under Authentication, a Test connection button verifies your stored credentials still work by making a lightweight authenticated request — handy since Koofr has no documented token lifetime.
Add glob patterns — one per line — under Settings → Sync Configuration → Excluded patterns. They're saved to a .syncIgnore file in your vault root and applied on the next sync (you can also edit that file directly).
| Pattern | Matches |
|---|---|
*.tmp |
any .tmp file, in any folder |
Attachments/large/** |
everything under Attachments/large/ |
Drafts/ |
the whole Drafts/ folder (trailing slash = folder) |
# note |
a comment (ignored) |
* matches any characters within a single name; ** matches across folder boundaries.
Available via the command palette (Ctrl/Cmd+P):
| Command | Description |
|---|---|
| Sync now | Trigger an immediate sync. |
| Disconnect from Koofr | Clear stored credentials and sync state. |
| Force full sync | Clear tracked state so the next sync re-evaluates everything from scratch. |
| Reconcile from cloud | Destructive recovery — cloud version wins for every file, confirmation required for large deletes. |
| Show sync conflicts | Open the manual conflict review pane. |
Koofr's REST API has no incremental "what changed since X" endpoint. Every sync fetches a single recursive listing of your chosen Koofr folder and diffs it against what this device last saw, by content hash — new, changed, and deleted files are all detected from that diff. This is simpler than a delta-cursor design and works well for typical vault sizes (hundreds to low thousands of files); very large vaults will produce proportionally larger listing payloads per sync.
src/i18n/), but only English strings ship currently. Contributions welcome.npm install
npm run dev # watch build
npm run build # production build (typecheck + bundle)
npm test # unit tests
npm run lint
See src/sync/syncEngine.ts for the sync algorithm and src/api/koofrClient.ts for the Koofr REST API v2 wrapper.
MIT — see LICENSE. Architecture adapted from obsidian-onedrive (also MIT).