Chapter 12 of De-Google Your Life explains the catch in a Google Photos export: some dates and locations aren’t inside the photos, they’re in separate .json files beside them, and a plain copy loses them. Chapter 13 of Be Your Own Cloud gives you an Immich server to move to. This page joins the two, using immich-go, the community tool Immich’s own documentation recommends for importing a Takeout. It reads those .json files, puts the dates back, and rebuilds your albums.
Before you start
- Immich is running, and you’ve created your account. If not, start with Immich: Going Deeper.
- Leave the phone app’s backup off until the import is done. Then you’re checking one source at a time, not two.
- Room on both ends. On your computer you’ll briefly hold the export twice (the zip files and the unzipped folder). On the server, the library lands in
/mnt/media/photos— compare the export’s size withdf -h /mnt/media. - Run this from a computer at home, on the same network as the server.
1. Export Google Photos only
Chapter 3 of De-Google Your Life covers Takeout itself. For this job, ask for a separate export with only Google Photos selected — it’s smaller, and arrives sooner. Keep Chapter 3’s .zip and 50 GB choices, and download every file as soon as the email arrives.
If you’re working through the move, tick it off on the Takeout checklist.
2. Unzip everything into one folder
As Chapter 12 says, unzip every zip into the same folder, so a photo and its .json end up together even when Google split them across two zips.
On Linux or a Mac, with the zips in Downloads:
mkdir -p ~/takeout
for z in ~/Downloads/takeout-*.zip; do unzip -o -q "$z" -d ~/takeout; done
ls ~/takeout/Takeout
On Windows, right-click each zip, choose Extract All…, and give every one the same destination, such as C:\Users\you\takeout. If Windows asks about files that already exist, replace them — they’re the same small index files in each zip.
Either way you end up with one Takeout folder with a Google Photos folder inside. That Takeout folder is what you give immich-go — not the folder above it.
3. Get immich-go
It’s a single program, with nothing to install alongside it. From the releases page, download the file for your computer, and checksums.txt beside it. For an ordinary PC that’s immich-go_Linux_x86_64.tar.gz, immich-go_Windows_x86_64.zip or, on an Intel Mac, immich-go_Darwin_x86_64.tar.gz; Apple Silicon Macs and other ARM machines take the arm64 file.
Check the download is the one the project published, then unpack it:
sha256sum --ignore-missing -c checksums.txt
tar -xzf immich-go_Linux_x86_64.tar.gz
./immich-go --version
The check should say OK for your file. On a Mac, run shasum -a 256 followed by the file’s name; in PowerShell on Windows, Get-FileHash followed by the file’s name. Either prints a long code — it should match the one beside that file’s name in checksums.txt (Windows shows it in capitals; that doesn’t matter).
On Windows, extract the zip and run .\immich-go.exe --version in PowerShell from that folder.
4. Make an API key for this job
In Immich’s web page, click your profile picture, then Account Settings → API Keys → New API Key. Name it immich-go takeout, and give it only what immich-go’s documentation lists:
| For | Permissions |
|---|---|
| Photos | asset.read, asset.statistics, asset.update, asset.upload, asset.copy, asset.delete, asset.download |
| Albums | album.create, album.read, albumAsset.create |
| Everything else | server.about, stack.create, tag.asset, tag.create, user.read |
| Pausing Immich’s jobs (admin account only) | job.create, job.read |
Copy the key — Immich shows it once. Import from your own account, the one the photos belong to; whatever account owns the key owns the photos.
5. Dry run first
Give immich-go the key through an environment variable rather than on the command line, so it isn’t saved in your shell history. On Linux or a Mac:
read -rsp "Immich API key: " IMMICH_GO_UPLOAD_API_KEY && export IMMICH_GO_UPLOAD_API_KEY
./immich-go upload from-google-photos \
--server=http://192.168.1.50:2283 \
--dry-run \
~/takeout/Takeout
In PowerShell on Windows:
$env:IMMICH_GO_UPLOAD_API_KEY = Read-Host "Immich API key"
.\immich-go.exe upload from-google-photos --server=http://192.168.1.50:2283 --dry-run "$HOME\takeout\Takeout"
http://192.168.1.50:2283 goes straight to Immich on your network, so a big upload doesn’t depend on the proxy’s size and timeout limits. --dry-run reads the whole export and reports what it would do, without uploading anything.
Read the summary at the end. Three defaults are worth a decision before the real run:
| Flag | Default | Change it when |
|---|---|---|
--include-unmatched | off | The summary shows files with no .json beside them. With it off, those are left out; turn it on to bring them in, dated from the photo itself. |
--include-partner | on | You used Google’s partner sharing and don’t want your partner’s photos in your library: --include-partner=false. |
--include-archived | on | You want archived photos left behind: --include-archived=false. |
Trashed photos are left out unless you add --include-trashed.
6. The real run
The same command without --dry-run, plus --session-tag, which tags everything from this run so you can find it later:
./immich-go upload from-google-photos \
--server=http://192.168.1.50:2283 \
--session-tag \
~/takeout/Takeout
Leave it running — a large library takes hours. If it’s interrupted, run the same command again: immich-go skips what’s already on the server.
By default immich-go pauses Immich’s background jobs while it uploads, which is what the job. permissions are for. If it stops with a permissions error about jobs, add --pause-immich-jobs=false and run it again.
7. Let Immich catch up
When the upload ends, Immich still has to make thumbnails, read dates and places, and run face recognition over everything. Watch it in Administration → Jobs. Chapter 13’s troubleshooting box covers the machine-learning container’s CPU use — during a bulk import that’s normal, and on a base Raspberry Pi it takes longer still.
8. Check it’s all there
Use Chapter 12’s checks — counts, dates, your oldest photos, videos and edited photos — on Immich instead of Ente:
- Counts. Administration → Server Stats shows how many photos and videos Immich has. Google Photos should be close.
- Dates. Scroll the timeline back through the years. Hundreds of photos on one day usually means missing dates. If you used
--include-unmatched, those files are the likely cause: select them in Immich and correct the date from the selection menu. - Albums. Open the Albums page and check the ones you care about.
- Places. The Map page shows whether locations came across.
9. Then
- Turn on the phone app’s backup (Immich: Going Deeper). If Google kept your photos in Storage saver quality, the export holds smaller copies than the ones on your phone, so some photos may arrive twice. Immich’s Utilities page can find duplicates for you to review.
- Delete the API key in Account Settings. The job’s done.
- Back up the server with Chapter 18’s backup, and check it ran, before deleting anything from Google.
- Delete the unzipped folder on your computer, but keep the zip files, encrypted, as De-Google Your Life Chapter 3 describes.
Only after that, and after the checks in step 8, delete from Google Photos — and Chapter 14 of De-Google Your Life explains what to do with Google One storage.
Official documentation
- immich-go — its upload command, best practices and releases
- Immich: command-line interface, which points Takeout imports to immich-go
- Google Takeout
Stuck on a step? Get in touch.