Migrate from Apple iCloud Photos
Move your entire iCloud Photos library into PrivoHub Photos using immich-go, a free command-line tool that imports an Apple privacy-portal export while preserving albums, dates, and iCloud Memories.
New: we can do this for you. The managed importer in your Portal uploads your iCloud export parts through the browser and runs the import on our servers, with no command line needed. The guide below is for doing the same thing yourself with the immich-go CLI.
Step 1 - Request your iCloud Photos export
- Sign in at privacy.apple.com with your Apple ID.
- Click Request a copy of your data and select only iCloud Photos.
- Choose the largest part size (25 GB) to keep the number of files manageable.
- Submit your request. Apple typically takes up to 7 days to prepare the export and will email you when it's ready.
- Download promptly. The download links expire after approximately two weeks.
Step 2 - Download all parts into one folder
Download every part Apple sends you into a single folder on your computer. Do not unzip them. The metadata CSV files that preserve your dates, albums, and Memories live inside the zips; immich-go reads them directly. Keep all parts together so albums spanning multiple files are reassembled correctly.
Step 3 - Install immich-go
immich-go is a single binary, with no NodeJS or Docker required. Download the build for your OS (Windows, macOS, Linux) from the releases page and unpack it. On macOS and Linux, make it executable:
chmod +x immich-goStep 4 - Create an API key
You need an API key so immich-go can upload on your behalf:
- Open your Photos library at
https://photos-yourname.privohub.comand sign in. Note thephotos-prefix:yourname.privohub.comis your workspace home page, not Photos itself, and it has no API keys. - Click your avatar in the top right, then Account Settings → API Keys, and click New API Key.
- Name it (e.g.
icloud-import). When asked which permissions to grant, the simplest is Select all. The key is only for this import and you can delete it right afterwards. - Copy the generated key somewhere safe. It's shown only once.
Prefer a minimal-permission key?
immich-go needs these scopes for an iCloud Photos import:
asset.read, asset.statistics, asset.update, asset.upload, asset.copy, asset.replace, asset.delete, asset.download, album.create, album.read, albumAsset.create, server.about, stack.create, tag.asset, tag.create, user.read, plus job.create and job.read so it can pause background jobs during the upload.
Step 5 - Run the import
From the folder containing your export parts, run the upload command, replacing the server URL and API key with your own:
immich-go upload from-icloud --server=https://photos-yourname.privohub.com --api-key=YOUR_API_KEY --manage-heic-jpeg=StackCoverJPG *.zip--manage-heic-jpeg=StackCoverJPG tells immich-go how to handle Apple's HEIC/JPEG pairs: Apple exports both formats together for older-device compatibility; this flag stacks them in Immich with the JPEG as the visible cover photo, keeping both versions accessible without cluttering your library.
Optional: import iCloud Memories as albums. Add the --memories flag to create an album in PrivoHub Photos for each iCloud Memory:
immich-go upload from-icloud --server=https://photos-yourname.privohub.com --api-key=YOUR_API_KEY --manage-heic-jpeg=StackCoverJPG --memories *.zipimmich-go scans the archives, skips duplicates, recreates your albums, and uploads everything at full resolution. You'll see live progress in the terminal. Large libraries can take a while, so leave it running.
Step 6 - Verify and clean up
- Open PrivoHub Photos and check that your timeline and albums look right.
- Spot-check a few photos for correct dates and map locations.
- Once you're happy, you can delete the export zips and, when you're confident your library is safe, reduce or close your iCloud storage plan.
Re-running the same command later is safe: immich-go detects already-uploaded photos and skips them, so you can resume an interrupted import or add a later export.
Tips & things to know
- Check your storage quota first. Make sure your plan has room for the full library. Check usage in your Portal and upgrade if needed.
- Keep all parts together. Importing only some zips can split albums, so point the command at the full
*.zipset. - Shared album photos may be missing. Apple's export only includes photos you own. Photos shared with you from other people's albums are not included. This is an Apple limitation, not an immich-go one.
- Live Photos arrive as pairs. Apple exports Live Photos as a still image + a short video. Immich automatically pairs them so they play back as Live Photos in your library.
- Re-running is safe. Duplicates are detected and skipped, so you can safely re-run the command without double-importing anything.
Migrating from Google Photos instead?
We support Google Takeout exports too. See the Migrate from Google Photos guide.
Need a hand?
Email us at support@privohub.com and we'll help you get migrated.