
PhotoVideoBackup: SSD Transfer
Incremental backup / checksum
About
What's New in PhotoVideoBackup
2.5.1
September 22, 2026
| Version | Build | Date | Type | Description | |---------|-------|------------|---------|-------------| | 2.5.1 | 47 | 2026-09-19 | Bug fix | **Three fixes around the "Max files per session" limit — the engine limit logic itself was never wrong.** **(1) The Settings field could not be validated.** *Max files per session* used a number-pad field with no way to dismiss the keyboard, so a typed value was never committed. A keyboard **Done** button now confirms it; an empty field means **Unlimited**. **(2) "Unlimited" could turn into a stray number after changing the phone's language.** The field was a locale-formatted number bound straight to storage; because the app's language override drives the on-screen locale, a system-language change could re-parse the field into a wrong value (a limit of "Unlimited" was seen becoming `6`), and a stored `0` never showed the "Unlimited" placeholder. The field is now a plain text buffer committed through a locale-independent parser — empty/zero/non-numeric all mean Unlimited — so language changes can't corrupt it. **(3) A partial backup was always reported as "file limit reached", even when it wasn't.** A backup stops early for three different reasons — the file limit, a destination that disconnected mid-run, or the user tapping Stop — but the completion **notification** and the **Report** hard-coded the "file limit reached" wording for all three. So a run that stopped because the SSD/NAS disconnected (e.g. at file 149, with the limit set to Unlimited) was mislabelled as a limit. Each cause now shows its own message: a disconnection reads **"destination disconnected — reconnect and run again"**, a user stop reads **"stopped — run again to continue"**, and only a real limit says "file limit reached". Implemented with a persisted `PartialReason` on `BackupSession` (lightweight migration; old sessions read as before), classified by a pure `DashboardViewModel.partialReason(...)`. Non-regression tests: `FileLimitFieldTests` (locale-independent parsing — grouping separators like `1,000`/`1 000`/`1.000` all parse to `1000`), `PartialReasonTests` (a disconnection/cancel is never classified as a file limit), and `BackupFromSDCardTests.test_fileLimit_skippedFilesDoNotCountAgainstLimit` (already-present files don't consume the limit budget). See also the new CLAUDE.md note on never binding a locale-formatted `TextField` directly to `@AppStorage`. |
MoreSubscriptions & In-App Purchases
$1.99
PhotoVideoBackup Pro
External sources + 2nd SSD mirror. One-time purchase.









