First stable release — Community Plugin submission.
- Content-hash based change detection (no mtime dependency)
- Three-layer delete protection: event tracking + bulk delete guard + Dropbox trash
- Three conflict strategies: keep_both (default), newest, manual (side-by-side diff)
- Rev-based optimistic locking for concurrent edits
- Cursor-based incremental sync with full rescan on cursor expiry
- Desktop: IndexedDB state store + obsidian:// protocol one-click auth
- iOS: VaultFileStore (JSON-based) + paste-code auth flow
- Dropbox longpoll real-time change detection (30s)
- Rate limit auto-retry with exponential backoff
- Active file protection (skip download/conflict for files being edited)
- Delete catch-up: base-based intent detection for missed vault events
- All-or-nothing cursor advancement (retry on partial failure)
- Bulk delete confirmation modal (threshold configurable)
- Onboarding modal on first run
- Status bar with sync state (idle/syncing/success/error)
- Sync progress percentage
- Ribbon icon: click to sync, right-click for status
- Custom Dropbox App Key support
- Selective sync with glob exclude patterns
- Device-specific log files (200-line cap) with View Logs modal
- 304 tests passing (bun test)
- TypeScript strict mode
- Simulation tests for multi-device scenarios
- Automated release via GitHub Actions (version change detection)
- refactor: sync engine restructuring (classifyChange, runCycle method decomposition)
- fix: deleteLog persistence error logging (was silently swallowed)
- fix: RevConflict + dispatchConflict double-failure protection
- refactor: conflict handler deduplication (readLocalWithHash helper)
- fix: increase retry delay for iOS network connection lost (-1005)
- fix: add diagnostic logging for persistent download failures
- fix: ensureParentDir race condition on parallel downloads
- fix: mobile network disconnect retry
- chore: manifest version sync
- ux: ribbon icon click → immediate sync (status modal moved to right-click)
- fix: prevent delete/rename event drop during sync
- fix: always trigger sync on file delete/rename
- docs: README rewrite + 3 detailed guides + settings doc links
- ux: settings accessibility + onboarding English unification + sync summary + error flow
- refactor: dropbox-adapter retry deduplication → withRetry()
- refactor: dead code removal, null safety, type centralization, main.ts decomposition
- refactor: executor conflict handler separation + 5xx retry + VaultFileStore concurrency fix
- fix: remove auto-merge + merge logic separation
- fix: prevent cursor advance on conflict skip
- feat: onboarding modal, conflict side-by-side UI, longpoll, selective sync
- feat: status bar click modal + ribbon icon + commands
- feat: file change debounce sync + create/delete/rename options
- feat: device-specific log system + View Logs modal
- Initial release: sync engine MVP (91 tests)