ae22d7a73978dfca732a237bf1ca3489a4e9ed20
- BackupView: action button shows "Checking status…" with spinner and blocks taps while coordinator.phase == .checking — prevents starting a backup before reconciliation has determined what actually needs uploading - BackupView: NAS status row shows statusService.refreshError (actual SMB error reason: auth failure, timeout, host unreachable) instead of the generic "Unreachable" string — surfaces the real diagnosis to the user - BackupStatusService: invariant assertion after every full reconcile — logs .error if alreadySafe + needBackup ≠ phoneTotal so filter mismatches and off-by-ones surface immediately in Console.app - BackupStatusService.buildManifestIndex: full diagnostic logging — remotePath, manifest file path, download byte count, decoded entry count, bootstrap fallback reason — all visible in Console.app filtered by "BackupStatus" Co-Authored-By: Kutesir <kutesir@provoc.ug> Co-Authored-By: Sentry <sentry@provoc.ug>
perf: eliminate full rescans with local caches; add queue tracking, notifications, SyncView redesign
perf: eliminate full rescans with local caches; add queue tracking, notifications, SyncView redesign
Description
Privacy-first iOS photo backup to NAS — SMB + SFTP, auto LAN trigger
Languages
Swift
100%