Add biometric enrollment validation flow
Details
After enabling biometric unlock in settings, the app now locks
immediately and prompts the user to verify biometric works. If the user
successfully unlocks with biometric, the feature stays enabled. If they
cancel biometric and unlock with their master password instead, biometric
is automatically disabled and unenrolled — ensuring the user has proven
the biometric flow works before relying on it.
Fix macOS biometric unlock for unsigned debug builds
Details
The modern SecItem keychain API requires the keychain-access-groups
entitlement, which unsigned .NET debug builds lack (errSecMissingEntitlement
-34018). Split MacBiometricService into two code paths using preprocessor
directives:
- DEBUG: Uses legacy SecKeychainAddGenericPassword / FindGenericPassword
(file-based keychain, no entitlements needed) with separate LAContext
Touch ID evaluation via ObjC block bridging.
- RELEASE: Uses modern SecItemAdd / SecItemCopyMatching with biometric
access control (kSecAccessControlBiometryCurrentSet) for signed builds.
Both paths store the master password in the macOS Keychain gated by
biometric verification and fall back to manual password entry on failure.
Add cloud sync entity progress indicator to status bar pill
Details
Track entity-level sync progress (synced/total) through the full stack:
Rust SyncProgress shared state computed from cursor count + outbox
distinct entities, exposed via FFI get_status, deserialized into C#
CloudSyncStatus, and displayed in the storage state pill as
"Cloud · X/Y" while entities are pending upload. Falls back to the
existing storage percentage display once all entities are synced.
Modernize startup loader UX: shimmer animation, chromeless windows, auto-focus
Details
Replace the plain indeterminate ProgressBar in UnlockView and SetupWizardView
with a custom shimmer ping-pong animation using Avalonia keyframe animations.
A 60px indicator slides left-to-right inside a 200x3px track with opacity-masked
edges for a polished shimmer effect.
Remove macOS title bar chrome from UnlockWindow and SetupWindow by switching to
SystemDecorations="BorderOnly" with ExtendClientAreaToDecorationsHint and
NoChrome hints. This removes the traffic lights while preserving the window
shadow, letting the existing CornerRadius="16" card design stand on its own.
Add auto-focus behavior: UnlockWindow.Opened calls Activate() to bring the
window to the front, and UnlockView.AttachedToVisualTree focuses the PasswordBox
so users can immediately start typing their master password.
Version bump to 1.66.5.
Fix crash on photo drop from cloud-mounted drives
Details
LocalStorageProvider.StoreFileAsync was synchronous despite the async
signature — it called File.OpenRead + SHA256.HashData on the UI thread.
When the source file is on a cloud mount (Google Drive, iCloud), the
read can stall or timeout, throwing an IOException that propagated up
through the Avalonia dispatcher as an unhandled exception, killing the app.
Fixed by making StoreFileAsync truly async: file hashing now uses an
async FileStream with SHA256.ComputeHashAsync on a background thread,
with a 30-second timeout via linked CancellationTokenSource.
Desktop v1.66.4
Get notified about new releases