Mindwtr 0.9.2
Highlights
- Mobile navigation, Focus, Settings, Review, calendar, and capture surfaces were refreshed so daily planning and inbox capture feel more direct.
- Android capture gained more entry points: Quick Settings capture, App Actions shortcuts, and assistant-compatible voice create-note intents all route into the confirm-first capture flow.
- Sync is more resilient with saved-filter sync, focus-limit sync, stricter WebDAV/cloud fingerprint handling, background sync task support, and safer attachment cancellation across backends.
- Desktop views are steadier with persisted view options, restored filters during startup, a cleaner sync footer, improved quick-add refresh behavior, and derived focused project counts.
- Localization and release quality gates are stricter, with broader locale coverage hygiene, better i18n regression tests, and per-file coverage floors for cloud and MCP code.
Mobile & Android Capture
- Reworked the mobile tab shell, Focus screen, menu, settings pages, and quick capture flow.
- Added Android Quick Settings capture and assistant/App Actions capture routing through
CREATE_NOTEandmindwtr:///capturedeep links. - Kept assistant-triggered and external capture confirm-first instead of silently saving tasks.
- Added startup tracing for Android capture entry points and tests for app shortcuts, quick capture, and startup ordering.
- Made the daily review calendar collapsible and restored missing review modal translations.
- Preserved mobile calendar day scroll position and made calendar labels, composer placeholders, and review copy use locale keys.
- Replaced native-looking confirmation alerts with Mindwtr-themed alerts.
- Improved capture modal parsing, URL JSON sanitization, audio capture handling, and quick capture picker behavior.
Sync, Cloud & Data
- Added saved filters as a syncable settings group with local SQLite storage, normalization, merge logic, tombstones, and delete-conflict handling.
- Synced the Focus task limit and kept GTD sync timestamps updated when synced GTD fields change.
- Added mobile background sync task wiring and AppState abort handling.
- Propagated cancellation through CloudKit, Dropbox, WebDAV, file, and cloud attachment sync paths.
- Preserved caller abort errors so cancelled sync operations report the real cancellation reason.
- Made WebDAV weak-fingerprint warnings clearer and avoided unsafe unchanged-sync shortcuts when validators are unreliable.
- Aligned cloud HEAD and GET behavior by serving raw data bytes, matching content length, and skipping trusted GET parsing.
- Improved pending remote write and attachment sync behavior so local/remote work is not skipped while uploads or deletes are pending.
Desktop & Core Experience
- Persisted desktop view options and restored filters during startup.
- Opened the desktop quick-add popup before refresh work can steal focus.
- Refined the sidebar sync footer and removed stale board filter open state.
- Derived focused project counts from shared helpers and reused focused task count logic.
- Added shared saved-filter helpers, labels, tests, and core exports.
- Improved fast sync helpers, local watcher behavior, sync service fingerprinting, and runtime sync coverage.
- Expanded MCP and cloud server test/type/lint coverage.
Localization, CI & Release
- Routed mobile settings, review modal, calendar labels, and composer placeholders through locale keys.
- Removed mixed English partial locale entries and added checks against verbatim English placeholders.
- Added locale coverage hygiene and stricter locale parity checks.
- Repaired CI coverage gates, added cloud/MCP coverage floors, and clarified LCOV handling.
- Updated Android release workflow support for Google Play listing metadata preparation.
- Resolved Bun audit advisories and updated shared lint/typecheck scripts for cloud and MCP packages.
Full Change List (since v0.9.1)
- fix(desktop): refine sidebar sync footer
- test(core): cover abort reason fallbacks
- fix(desktop): preserve restored filters during startup
- test(desktop): cover fast sync helpers
- fix(i18n): enforce locale coverage hygiene
- fix(core): normalize WebDAV weak fingerprint warnings
- fix(ci): clarify LCOV coverage gates
- fix(cloud): skip trusted GET parsing
- fix(desktop): remove stale board filter open state
- fix(mobile): abort file and WebDAV attachment sync
- fix(projects): use derived focused project count
- fix(desktop): open quick add popup before refresh
- fix(mobile): make daily review calendar collapsible
- feat(desktop): persist view options
- fix(deps): resolve Bun audit advisories
- fix(ci): repair coverage gates and focus test
- fix(calendar): localize composer time placeholders
- refactor(settings): use named settings interfaces
- ci: add mcp per-file coverage floors
- refactor(cloud): extract data cache helpers
- refactor(desktop): extract fast sync state helpers
- fix(mobile): propagate Dropbox attachment aborts
- test(store): document active focus limit counting
- fix(i18n): migrate mobile localize calls to locale keys
- fix(i18n): remove mixed English partial locale entries
- test(core): cover abort reason fallback
- fix(mobile): abort CloudKit sync operations
- test(mobile): cover AppState sync abort
- ci: gate non-line coverage metrics
- fix(mobile): preserve calendar day scroll position
- refactor(settings): use named settings types
- fix(webdav): warn once per weak fingerprint source
- fix(cloud): serve raw data bytes for GET
- fix(store): derive focused project counts
- fix(sync): align saved filter delete conflicts
- fix(mobile): restore review modal translations
- fix(i18n): reject verbatim English locale placeholders
- fix(mobile): preserve day calendar scroll position
- fix(desktop): resolve core importer subpaths
- fix(mobile): honor lifecycle abort during attachment pre-sync
- fix(cloud): align data HEAD length with GET
- fix(mobile): route calendar labels through i18n keys
- fix(mobile): localize review modal labels
- ci: gate cloud and mcp coverage
- fix(desktop): skip redundant local watcher merges
- fix(core): reuse focused task count
- docs(perf): clarify calendar virtualization bounds
- fix(i18n): route settings literals through locale keys
- refactor(settings): use exported settings types
- fix(sync): preserve caller abort errors