Releases: g8row/PhotosBackup
Release list
Photos Backup 0.3.6
New
-
Back Up Photos in Shortcuts (iOS 16+). (#7) Add it to a personal automation — when the iPhone connects to power, at a time of day, or when it joins your home Wi-Fi — and set it to run immediately. Each run finds new photos in your selected albums and hands them to iOS to upload in the background. It works with Automatic Backup off, so a schedule of your own can replace it (#14), and it still follows Use Connection and Pause. Settings → Shortcuts shows when it last ran and what it did.
iOS gives each run about 30 seconds, so the action spends them finding and preparing photos, then leaves the uploads to iOS. With the app open it just adds to the queue — the uploads you are watching are not interrupted. Photos stored only in iCloud still wait until you open the app.
-
Diagnostic reports you can attach to an issue. Settings → Support → Create Diagnostic Report builds a text file you can share or copy. It opens with What stands out — the likely reason backup is not happening, in plain words (Background App Refresh off, Low Power Mode, a paused or stopped queue, no background window from iOS in days, too little free space, and more). Below that: your settings, the last 40 runs, crash and termination data from iOS, the upload queue, and a timeline of what the app did and why.
It leaves out credentials, account addresses, photo identifiers, filenames, media, and links, so it is safe to post publicly.
-
See when iOS actually runs the backup. Settings → Support → Diagnostics → Recent Runs lists every run — opening the app, Back Up Now, Shortcuts, and the background windows iOS grants — with the time it started, how long it took, what it did, and the conditions it ran under (network, battery and charging, Low Power Mode, locked or not). Background windows also record how long after the request iOS started them.
-
Event Timeline. Every decision the app makes now leaves an entry saying why: why a background run was or wasn't requested, why uploads paused, which step an upload failed at and what Google said, when an item waited for iCloud, what iOS delivered while the app was closed. It keeps two weeks of history; repeats fold into one line, and warnings and errors are kept longer than routine entries, so a big backup does not push out the one failure that matters.
-
Storage. Settings → Support → Storage shows what the app keeps on your phone — pending upload copies, backup history, transfer receipts, caches — and Clean Up Unused Data removes leftovers without touching pending uploads or your account.
Fixed
-
One photo can no longer make the app close on every launch. (#13) If the app stopped while preparing a photo or video, the next launch started with that same item, so a single file that took the app down meant it closed again every time you opened it and nothing else backed up. Now an item the app stopped on goes to the end of the queue, and if it stops the app a second time it is skipped with an explanation — tap it to retry. Everything else keeps backing up.
Suspending the app normally never counts against an item, so iOS closing the app in the background does not skip anything.
-
Checking a large video uses less memory. The file is read in pieces, and each piece is now released as soon as it has been checked, instead of possibly being held until the whole video is done.
-
The app knows when it last closed unexpectedly. If it disappears while open, while starting, or during a background run, the next launch records it and the report says so — even when iOS did not share a crash report.
-
Leftover transfer receipts are cleaned up. Receipts that no upload owns any more are removed a day after they were written, and Google's responses are no longer kept in a disk cache.
Explained
- "Storage saver" on photos uploaded in original quality. (#11) The file is kept in original quality. With Count Against Storage Quota off, uploads identify as an older Pixel phone so they don't use your Google storage, and the Google Photos app labels those uploads "Storage saver". The file size, or Google Photos on the web, shows the real quality. Settings now says this, and the diagnostic report shows exactly which profile each upload sends.
Notes
- 161 tests, 158 passing (2 opt-in live tests, and 1 Keychain test that needs a signed build, skipped).
- Checked on an iPhone 12 running iOS 17.0.3: launch, account and queue restore, background scheduling, and the event log. A background window granted by iOS overnight and a Shortcuts automation on a locked phone still need to be seen on more devices — reports from either are very welcome.
- Crash details from iOS are only included when Share With App Developers is on (Settings → Privacy & Security → Analytics & Improvements), and they arrive a day or so after the crash.
- The Simulator cannot run background uploads or schedule background tasks. Use a device to exercise real backup behaviour.
Photos Backup 0.3.5
Fixed
-
"Google returned HTTP 400" during finalization now recovers instead of failing the photo. A live run against Google reproduced it: an upload whose receipt comes back without its upload token is committed anyway, Google answers "At least one valid blueprint is required", and every retry replayed the same dead receipt. The receipt is now checked where it is produced and where it is used, and a rejected one costs the item one fresh transfer rather than its whole retry budget. Receipts saved by older versions are checked too, so a queue carrying one from before the update recovers on the next attempt.
-
A full Google account stops the backup and says so. It used to arrive as a generic HTTP failure, so the queue kept going and failed every remaining photo the same way, one at a time. Backup now pauses with an explanation and waits — freeing space and tapping Resume picks it back up. It does not ask you to reconnect the account, because signing in again does not free storage.
-
Every upload commits under the quality setting you have selected now. The choice between original quality and Storage Saver, and whether the upload counts against your Google storage, was captured when the photo was prepared and then kept with it — so a photo prepared while Storage Saver was on kept uploading as Storage Saver after you turned it off, including after restarting the app.
Improved
-
A failed upload will tell you what Google said. Tap a failed row for the full reason, selectable, with Copy Details. Diagnostics keeps the last 25 failures with their error codes and a Copy All, and counts how many there have been — the reason used to be a two-line caption that disappeared as soon as the row was retried or cleared.
-
Error messages name what failed. "Google returned HTTP 400 during finalization" rather than "check your connection", and Google's own explanation is decoded instead of shown as a hex dump.
-
A long backup no longer slows down as it progresses. The activity list, navigation, and the uploads themselves got slower the further into a whole-library backup you were: the queue's counters, its row lookups, and its search for the next upload all walked the entire queue on every progress update, and the per-album "backed up" counts re-scanned every selected album on each of those too. All of it is now maintained as it goes, so the cost no longer grows with the size of the queue.
Notes
- 132 tests, 130 passing (2 opt-in live tests skipped).
- Verified against Google with a fresh sign-in and synthetic images: authentication, duplicate check, and both the foreground and background upload paths all pass; the HTTP 400 above reproduces only with a deliberately emptied receipt. Why some devices produce an empty receipt is still open — this release makes the queue survive it.
- The Simulator cannot run background uploads or schedule background tasks. Use a device to exercise real backup behaviour.
Photos Backup 0.3.4
Fixed
-
Back Up Now no longer stops after 250 photos. (#6)
Back Up Now queued one page of 250 and left the rest to a loop that was gated on the same conditions as automatic scheduling — including "Automatic Backup is turned off", which is exactly what Stop Backup sets. With the toggle off that loop exited before doing anything, so the button uploaded 250 items and stopped, and the rest of the album stayed off the queue until you tapped again. Re-check Backups shares the loop and had the same cap, which is why it looked like it cleared the queue and then refilled only a fraction of it.
A manual run is you asking right now, so it no longer consults the automatic-backup toggle at all. It still stops when the app leaves the foreground, the account becomes unusable, or backup is paused.
-
The whole selection now goes into the queue at once. Paging the foreground meant the queue only ever held a slice of the work. Both buttons now queue everything, and the simultaneous uploads setting decides how much of it moves at a time. Background windows keep their 250-item batch, which only bounds memory — the queue is durable, so whatever one window cannot finish waits for the next.
-
The count the buttons report is now the real total. "Backing up 250 items" was the size of the first page. It is now everything the run will attempt, including failures released for retry.
-
A photo waiting on an iCloud download no longer stalls the rest of the run. Those rows never finish on their own, and the run treated them as work in progress — so one of them held the run open indefinitely and nothing further was queued behind it.
Notes
- 107 tests, 104 passing (2 opt-in live tests and 1 Simulator Keychain test skipped).
- The Simulator cannot run background uploads or schedule background tasks. Use a device to exercise real backup behaviour.
Photos Backup 0.3.3
Fixed
-
Stop Backup no longer freezes the app. (#1)
Stopping a backup cancelled the queue one row at a time, and every one of those rows rewrote the entire saved queue to disk — on the main thread. A queue of a few hundred rows therefore made a few hundred full rewrites of a file that was itself a few hundred rows long, and the app stayed unresponsive for the whole thing. Stopping 1,000 rows took 6.15s on the Simulator; it now takes 0.068s, and the difference grows with the size of the queue.
Stop now clears the queue in a single pass with a single save. Retry Failed Uploads worked the same way and had the same stall, so it was fixed alongside.
-
A Stop with nothing currently uploading no longer breaks the next single-row cancel. The flag that tells Stop to discard its rows was left switched on, so the next photo cancelled by swiping was quietly dropped from the queue instead of staying there as a "don't back this up" marker — which meant the next automatic scan picked it straight back up.
Notes
- 105 tests, 102 passing (2 opt-in live tests and 1 Simulator Keychain test skipped).
- The Simulator cannot run background uploads or schedule background tasks. Use a device to exercise real backup behaviour.
Photos Backup 0.3.2
Added
-
Choose how many uploads run at once, from 1 to 10, in Settings → Backup. The default stays at 2, so nothing changes unless you raise it.
More at once finishes a large backup sooner, but each upload stages a full-size copy on the device while it runs, so high values use more storage, battery and data at the same time. Raising the setting starts more work straight away; lowering it never cancels an upload already in progress, it just stops new ones starting until the count comes back down.
Changed
- The Backed up figure on Home now comes from the durable record of what has been backed up, rather than a separate counter kept alongside it. Re-checking a library that is already in the cloud no longer risks the number drifting.
Notes
- 102 tests, 99 passing (2 opt-in live tests and 1 Simulator Keychain test skipped).
- The Simulator cannot run background uploads or schedule background tasks. Use a device to exercise real backup behaviour.
Photos Backup 0.3.1
A follow-up to 0.3.0, fixing one thing that release missed.
Fixed
- Re-check Backups skipped items that had failed to upload. A failed item is not recorded as backed up, so there was nothing for the re-check to forget — and because its row was already in the queue, it blocked that photo from being queued again. The action you would reach for to confirm everything is safe quietly ignored exactly the photos that were not. Re-check now releases failed items first and counts them in what it reports.
Verified
The re-check round trip was confirmed against a live Google account: a photo still present in Google Photos is forgotten, queued again, matched by its hash, and re-recorded as backed up without being uploaded a second time.
Notes
- 99 tests, 96 passing (2 opt-in live tests and 1 Simulator Keychain test skipped). Re-check had no test coverage before this release; it now has three cases, including the failed-item one.
- The Simulator cannot run background uploads or schedule background tasks. Use a device to exercise real backup behaviour.
Photos Backup 0.3.0
Fixes from a full audit of the UI, background execution, upload queue, and general UX.
Important
Pause, Cancel and Stop behave differently in this release — see Behaviour changes below.
Behaviour changes
- Pause is now durable. It used to clear itself whenever the queue drained, so pausing near the end of a batch silently resumed backup. It now survives the queue emptying and a relaunch, until you resume or stop.
- Cancel and Stop now mean different things. Cancelling one item is a decision that survives a relaunch and is not undone by the next automatic scan; release it with Retry or Clear Finished. Stop still discards the whole queue, so a later scan is free to pick those photos up again.
- Automatic backup retries failures on its own. Previously a single network blip parked photos in a failed state forever, recoverable only by tapping Retry by hand.
- Dark mode is supported. The app no longer forces a light appearance.
Background backup
- A processing window now enqueues up to 250 items instead of 25. The limit bounds memory, not how much a window uploads — the queue is durable, so anything a window cannot finish waits for the next one.
- The PhotoKit change token advances once a scan's items have all been handed to the queue, so a caught-up queue stops re-enumerating the whole library on every window.
- Wi-Fi Only now cancels an in-flight background upload when Wi-Fi is lost. iOS keeps the cellular permission a request was created with, so the setting previously had no effect once a transfer had started.
- Added a watchdog for a stalled upload, which the seven-day request timeout would otherwise never surface.
- Fixed a race where a background relaunch could hand iOS its completion handler before a finished upload's receipt was committed.
What the app can tell you
- Per-album backup progress on the Home and Albums tabs.
- The Backed up count no longer misses uploads finished in a background window that ended in the app being terminated.
- Back Up Now and Re-check Backups report what they did instead of appearing to do nothing.
- Diagnostics says why an automatic run cannot start, and each run logs what it did.
- Clearer failures: a background upload that cannot run in the Simulator now says so, rather than "unknown error".
- Limited photo access and items waiting on an iCloud download are both explained.
Performance
- Back Up Now and Re-check Backups no longer load an entire library into the queue at once.
- Album enumeration and counting moved off the main thread.
- Upload progress is ordered and rate-limited, so progress bars no longer jump backwards on large files.
- Fewer redundant writes of the saved queue, and the completion ledger is compacted.
Fixes
- Photos edited after being backed up are uploaded again instead of being skipped.
- The Google sign-in window can no longer be swiped away mid-flow, which discarded a single-use token.
- Removed a duplicate Connect Account button in Settings; Verify Backup is now Re-check Backups.
- A rejected empty export no longer leaves its staging directory behind.
Notes
- 96 tests, 93 passing (2 opt-in live tests and 1 Simulator Keychain test skipped).
- The Simulator cannot run background uploads or schedule background tasks. Use a device to exercise real backup behaviour.
Photos Backup 0.2.3
Added
- Settings Verify Backup. Re-checks selected albums against Google Photos. Items still in the cloud finish quickly as Already backed up; anything deleted there is queued for upload again.
Install
PhotosBackup.ipa is unsigned. Sideload with SideStore/AltStore (re-signs on device with your Apple ID) or install with TrollStore. iOS 15.0 or newer.
Full changelog: 0.2.2...0.2.3
Photos Backup 0.2.2
Fixed
- All Photos selection no longer double-counts. Selecting All Photos together with other albums showed an inflated item count (e.g. library + Favorites summed). The counter now shows the All Photos count, since every other album is a subset of it.
- Overlapping album selections now produce one queue entry per asset instead of duplicates.
Install
PhotosBackup.ipa is unsigned. Sideload with SideStore/AltStore (re-signs on device with your Apple ID) or install with TrollStore. iOS 15.0 or newer.
Full changelog: 0.2.1...0.2.2
Photos Backup 0.2.1
Fixed
- Background backup lifecycle. Uploads are now split into preflight plus the file PUT: once initialized, the PUT continues under iOS even if the background processing window expires, and the app persists the receipt before commit.
- Smarter background scans. iOS 16+ uses a persistent PhotoKit change token; iOS 15 and expired-token recovery fall back to a correctness-first current-library scan.
- Foreground scans finish the job. Automatic scans keep paging (250 items per foreground activation, 25 per background window) until every selected asset is durably handled or the app leaves the foreground.
- Sturdier queue. A failed row is the durable retry handle for its source — rescans no longer stack duplicate failed rows; Storage Saver and storage-quota choices are now persisted across launches; the dashboard surfaces failed-count states with retry guidance.
- Cloud-only PhotoKit resources are deferred during short background windows and resume with network access in the foreground.
Install
PhotosBackup.ipa is unsigned. Sideload with SideStore/AltStore (re-signs on device with your Apple ID) or install with TrollStore. iOS 15.0 or newer.
Full changelog: 0.2.0...0.2.1