Convert iCloud Photos backup to a useful folder structure
Project description
bye-cloud
Convert the iCloud photos archive from Apple so you can move to immich.
How to get your photos from Apple
Go to https://privacy.apple.com/accounts and request a copy of all of your data. It will take a while -- a few days, and when you get it, it won't be in a very useful format. It's almost like Apple doesn't want you to control your own photos. (You can also get your iCloud Drive files and stuff while you're there.)
Now that you have your iCloud Photos
Once you have downloaded your iCloud backups, they will be in zip files with a very specific naming
convention, like iCloud Photos Part 1 of 3.zip. This backup tool assumes that's the case, and if that
changes, this tool won't work until it is updated. But it is open source so you can change it yourself
or at least report an issue!
It's important that you copy all those zip files into a new location where we will be operating on them. I haven't extensively tested this program out, so make sure you don't run it against your only copy.
And you must copy all of your zip files. If you only copy one of three zip files, bye-cloud will notice and complain. The reason is that apple distributes photos randomly throughout these archives, and if you try to unpack only one part, the Album spreadsheets will reference photos that bye-cloud won't be able to find.
Install
Homebrew (macOS/Linux)
brew install jakekara/tap/bye-cloud
This installs bye-cloud and ffmpeg together.
pipx
pipx install bye-cloud
uv
uv tool install bye-cloud
Note: For video date repair, ffmpeg must be installed separately when using pipx or uv. bye-cloud will warn you on startup if ffmpeg is missing.
Usage
With all of your .zip files in a folder, let's say ./icloud-parts, run the command:
bye-cloud -i ./icloud-parts -o ./export
That's it! Just wait until it finishes and your photos will be organized into folders. These should work with image libraries like immich and others.
CLI Options
bye-cloud -i ./icloud-parts -o ./export [OPTIONS]
Options:
-v, --verbose Enable detailed logging
-q, --quiet Only show warnings and errors
--dry-run Preview operations without modifying files
--keep-temp Keep temporary files (for debugging)
--check-missing Warn about photos missing from metadata
--force Overwrite output directory if it exists
A detailed log file is created in {output}/logs/ for each run.
Contributing
See CONTRIBUTING.md for development setup, running tests, and project architecture.
Note: This project includes AI-written code. I've started using Claude Code extensively since version 1.0.0 to maintain this repo as part of an effort to learn more about AI coding.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bye_cloud-1.0.1.tar.gz.
File metadata
- Download URL: bye_cloud-1.0.1.tar.gz
- Upload date:
- Size: 9.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
49581d9b69c83ba57f95dbc3af8fb99d304fea03b895aa6b3bdc12d23b1ac2cb
|
|
| MD5 |
aa8ceee9d0bdfa1c9164efddf6197c9b
|
|
| BLAKE2b-256 |
67e7cde216fdf2766004f5c4a60fe1eef3398e91d9147630a51e6d1eda1e2adb
|
Provenance
The following attestation bundles were made for bye_cloud-1.0.1.tar.gz:
Publisher:
publish.yml on jakekara/bye-cloud
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bye_cloud-1.0.1.tar.gz -
Subject digest:
49581d9b69c83ba57f95dbc3af8fb99d304fea03b895aa6b3bdc12d23b1ac2cb - Sigstore transparency entry: 864664332
- Sigstore integration time:
-
Permalink:
jakekara/bye-cloud@cdb81c7fbc5eab0228affd8aa1c556895a23e5c7 -
Branch / Tag:
refs/tags/1.0.1 - Owner: https://github.com/jakekara
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cdb81c7fbc5eab0228affd8aa1c556895a23e5c7 -
Trigger Event:
release
-
Statement type:
File details
Details for the file bye_cloud-1.0.1-py3-none-any.whl.
File metadata
- Download URL: bye_cloud-1.0.1-py3-none-any.whl
- Upload date:
- Size: 11.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba62c4b9325c1f69b8c16e83a3358f5e52372f66aa0cadee73790f0ec581f845
|
|
| MD5 |
eaa6bb711964706e8a721f63099acee3
|
|
| BLAKE2b-256 |
b159e41146e182f45124f62e7bbc6d3bbd05b90a982d6db888d17977bc1d736c
|
Provenance
The following attestation bundles were made for bye_cloud-1.0.1-py3-none-any.whl:
Publisher:
publish.yml on jakekara/bye-cloud
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bye_cloud-1.0.1-py3-none-any.whl -
Subject digest:
ba62c4b9325c1f69b8c16e83a3358f5e52372f66aa0cadee73790f0ec581f845 - Sigstore transparency entry: 864664336
- Sigstore integration time:
-
Permalink:
jakekara/bye-cloud@cdb81c7fbc5eab0228affd8aa1c556895a23e5c7 -
Branch / Tag:
refs/tags/1.0.1 - Owner: https://github.com/jakekara
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cdb81c7fbc5eab0228affd8aa1c556895a23e5c7 -
Trigger Event:
release
-
Statement type: