Create a Tauri v2 plugin that uses EncryptedSharedPreferences (Android Keystore)
on Android and the system keychain (keyring crate) on desktop. This replaces
the direct onyx-core keyring calls in the Tauri app, which failed on Android
because keyring-storage was feature-gated to desktop only.
- New plugin crate at apps/tauri/tauri-plugin-credentials/ with Kotlin Android
code and Rust desktop fallback
- Update all Tauri credential commands to use the plugin API
- Add security-crypto dependency for Android and ProGuard rule for Tink
- Remove onyx-core/keyring-storage dependency from Tauri app features
Speed up initial folder listing by checking each subfolder for the
.onyx-workspace.json marker in parallel instead of sequentially. This
uses futures::future::join_all to run multiple PROPFIND/list_files calls
concurrently, reducing latency when detecting workspaces across many
subdirectories.
Also add the futures 0.3 dependency to the Tauri Cargo.toml and lockfile
so the async utilities are available.
Back up local files before overwriting during ConflictRemoteWins so data
is never silently lost. Fix false-positive change detection by parsing
timestamps before comparing (different formats like RFC3339 vs HTTP date
were never equal as strings). Add zeroize crate to zero WebDAV credentials
in memory on drop, preventing exposure in core dumps.
Add Tauri commands: move_task, rename_list, set/get_group_by_due_date,
watch_workspace. Implement file watcher using notify crate with 500ms
debounce and self-change suppression via mute_watcher().
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add GPL-3.0 LICENSE file
- Update README with current project status (all 3 phases), fix structure
- Update PLAN.md Phase 2 API signatures to match actual implementation
- Add WebDAV & Sync section to docs/API.md
- Update docs/DEVELOPMENT.md with Tauri app structure and setup
- Add metadata (description, license, repository) to all Cargo.toml files
- Update .gitignore with node_modules, .env, dist, build entries
- Remove stale Cargo.lock from .gitignore (apps should track it)
- Update example dates from 2025 to 2026 across all docs
- Update CLAUDE.md date to 2026-03-30