Backup iPhone photos without iCloud
The Photos app treats iCloud Photos as backup. That is fine if you are staying on one Apple ID and you are happy paying for the plan. It is not a copy you can take to a Pixel, plug into a Windows box, or keep when the subscription lapses. Azalea (bundle net.duguying.photos) exports PhotoKit assets onto storage you already own: Amazon S3, a USB volume, or a Samba share. Originals never sit on an Azalea host. There is no Azalea photo cloud.
I keep iCloud Photos on during the first export. Two writers deleting locals at once is how people lose a week of baby photos. Turn the Apple switch off only after you have opened real files on the destination.
Full access is the other non-negotiable. Limited Library means the backup set is whatever you ticked in the system sheet. A later claim will not invent the rest. Background work is still at the mercy of iOS; a lock screen can pause the job. Opening the app resumes from the index rather than starting at zero.
Steps that have shipped
- Install Azalea on iOS 15 or later. When the system photo sheet appears, tap Allow Full Access. If you already chose Selected Photos, open Settings → Azalea Photos → Photos and switch to full access before you treat Pending as a library count.
- Open Cloud Album → Backup Storage. The empty state reads No backup storage profiles yet. Tap + to add one. Add an S3 profile (bucket, region, AccessKey, SecretKey) or a USB Device profile. For USB, pick a folder in Files so the app can store a security-scoped bookmark. iOS will not list mounted volumes; there is no “SanDisk detected” row.
- Fill Bucket (e.g. photos-backup) and Region (optional, e.g. us-east-1). English object-storage tests used S3 Standard in us-west-2. The form also accepts COS and OSS; the Chinese write-ups of the same method often name COS Guangzhou. The client only cares about signature and key layout. Tap Test Connection. A wrong region fails on the first list with a signature error or a 301.
- Turn on automatic backup. Status shows Pending as unfinished photo rows, not a doubled resource count. Keep the phone on power. For a bucket, stay on Wi-Fi unless you have explicitly allowed cellular in the backup settings. For USB, keep the disk attached and the app in the foreground; iOS only grants external-device access while the app is active.
- A Live Activity should appear while work is in flight. If you lock the phone during a USB run, the Live Activity can stay up while the task has already halted. Reopen Azalea and tap Resume Backup or Check again after you replug. The index is not wiped.
- When Pending hits 0, open one HEIC, one Live Photo pair, and one 4K clip from the destination. Check bytes and pixel width, not just the thumbnail. Only then decide whether to turn on Optimize iPhone Storage or to leave iCloud Photos alone.
On 14 Mar 2026 an iPhone 15 (iOS 18.6.1, 256 GB) with a full 200 GB iCloud plan wrote 18,432 items and 86.41 GB to a SanDisk Extreme 1 TB disk in 257 minutes. Twenty-three names with colons were escaped. Settings → iPhone Storage showed Photos at 88.1 GB before the run. The object-storage equivalent in the Pixel → iPhone case was slower because of Wi-Fi and PUT round trips: 11,614 items, 81.95 GB, 664 minutes on S3 us-west-2.
What actually leaves the phone
Azalea copies the PhotoKit asset. A Live Photo is a still plus a motion clip, so the byte count runs higher than a grid count. HEIC was 71% of that March library; the rest was JPEG and a few DNG. Videos were mostly 4K30. That mix is why a 10 Gbps portable SSD still averaged about 5.7 MB/s: each still pays an export, not a raw block copy.
A Finder DCIM dump from Image Capture is not this. It has no incremental index, it mishandles Live Photos, and it cannot be claimed on Android. If your goal is “get off iCloud and still open the files on another phone,” the claim path on USB or S3 is the one that has been reproduced. The USB feature page and the object-storage page spell out the backends. Download is at /en/download.
Cellular use is yours to forbid in iOS Settings. USB does not touch the radio. Secrets for S3 go in the Keychain, not a world-readable prefs file. The in-app copy says so: AccessKey and SecretKey are stored on this device’s Keychain and saved automatically once both fields are filled.
Failures worth writing down
Wrong region fails on the first list. Picking a folder inside iCloud Drive is not an external volume; the “looks risky” confirm exists because that happened in a lab session and the copy would have landed back in Apple’s cloud. Killing the app mid-run does not wipe the index. Unfinished keys stay pending.
The colon names are the other lab scar. Twenty-three WhatsApp screenshot titles contained :. exFAT rejected them. After escaping, the logical key k in .album/manifest.jsonl stayed the original name and p was the on-disk path. Do not “fix” those ugly names in Explorer if you still expect a later claim to find them.
If iCloud Photos is on and the plan is full, Optimize iPhone Storage will not save you: originals cannot upload, so placeholders never replace the locals. That was the March machine, which is why USB went first. Backup without iCloud, in this product, means a second copy on media you control. It does not mean Azalea will flip Apple’s switches for you.
FAQ
Can I backup iPhone photos without iCloud and keep iCloud Photos on?
Yes. Azalea does not require you to turn iCloud Photos off. Leave it on until you have opened originals on the disk or in the bucket. Then decide. Turning both iCloud Optimize and a third-party “delete after backup” switch against the same roll is how people create an empty week.
Does Azalea store my originals on its servers?
No. The app writes to your COS, OSS, S3, USB folder, or Samba share. Bundle id net.duguying.photos. There is no Azalea-hosted original. If you never fill a profile, nothing leaves the phone through this app.
Why is Pending not dropping even though the Live Activity is visible?
On USB, iOS pauses when the app leaves the foreground or the phone locks. The Live Activity can outlive the worker. Reopen the app, keep it frontmost, tap Check again if the disk was unplugged, and watch Pending rather than the Dynamic Island.
Will a later Android phone see this backup?
If you used the same bucket or the same USB folder, yes, via claim. Android cannot reuse iOS local_identifier values, so Favorites will not come along. The files will. Finish Pending first; a blank claim is usually a backup that is still running or a second profile pointing at a different bucket.
What if I only want a cable copy to a Mac?
Image Capture will copy DCIM. It will not give you an incremental index, Live Photo pairs as the Photos app knows them, or a library another phone can claim. That is a different job. If the search intent is backup iPhone photos without iCloud in a form you can reopen on Android, use Azalea’s profile and wait for Pending to hit zero.