Move Google Photos to Immich With immich-go (Albums, Dates and All)

Immich is the closest self-hosted thing to Google Photos, and the community tool immich-go imports a Takeout straight from the zip files, matching every photo with its JSON metadata. Here is what you need, the commands, a dry run first, and how to add camera footage without copying it twice.

Share

To move a Google Photos library into Immich, download it with Google Takeout and import the zip files with immich-go, a community command-line tool that reads Takeout archives directly. It matches each photo with its JSON metadata, so dates, locations, descriptions and albums come across without a separate fix-up step. You need a running Immich server and an API key. Do a dry run first.

What you need

ItemDetail
Immich serverInstalled with Docker Compose. Immich recommends Linux; Docker Desktop on Mac or Windows works but the project says it is strongly discouraged
Server hardwareImmich's stated minimum is 6 GB RAM and 2 CPU cores; it recommends 8 GB and 4 cores. With 4 GB, it can run with machine learning turned off
Disk spaceYour library plus 10 to 20% for thumbnails and transcoded video, by Immich's own estimate
TakeoutYour complete Google Photos export, all parts
immich-goA single download for Windows, macOS, Linux or FreeBSD, no install needed

Sources: Immich's requirements page and the immich-go documentation, checked October 2026. At the time of writing the latest releases are Immich v3.3.1 and immich-go v0.32.0.

Setting up the server is covered well by Immich's Docker Compose guide. This article starts once you can log in to Immich in a browser.

Step 1: export and download the whole Takeout

At takeout.google.com, select only Google Photos. immich-go's own best-practice notes recommend zip and the largest part size, 50 GB, and warn against mixing zip and tgz in one import. Download every part. A missing part means missing photos with no error, so count them. Our guide to Takeout split into many zip files covers downloading and testing each part.

You do not need to unzip the archives or fix dates with exiftool first. immich-go reads the zips as they are and does the metadata matching itself. If you have already unzipped and fixed them, it can read the folder instead. The manual date fix is in fix Google Takeout photo dates, for when you want a plain folder of correctly dated files as well.

Step 2: create an API key

In Immich, open Account settings, then API Keys, then New API Key. immich-go lists the permissions it needs, including asset upload, album creation and tagging. It also pauses Immich's background jobs during an upload, which needs an admin user's key with job permissions. The simplest path for a personal server is a key with all permissions from the admin account, used only for the import and deleted afterwards.

Step 3: download immich-go

Get the archive for your system from the immich-go releases page and unpack it. On a Mac, you may need to allow it in System Settings, Privacy and Security, the first time it runs, as it is not from the App Store.

Step 4: dry run

The dry run reads everything and reports what it would do, without uploading. Run it from the folder holding immich-go:

./immich-go upload from-google-photos \
  --server=http://192.168.1.20:2283 \
  --api-key=YOUR_KEY \
  --dry-run \
  ~/Takeout/takeout-*.zip

Replace the address with your server's and the path with where your zips are. Read the summary at the end. You are looking for a large number of files it could not match with metadata. A handful is normal. Thousands usually means a missing part.

Step 5: the real import

Drop --dry-run. For a large library, immich-go's documentation suggests a conservative setup:

./immich-go upload from-google-photos \
  --server=http://192.168.1.20:2283 \
  --api-key=YOUR_KEY \
  --concurrent-tasks=4 \
  --client-timeout=60m \
  --on-errors=continue \
  --session-tag \
  ~/Takeout/takeout-*.zip

What the options do:

  • --concurrent-tasks: parallel uploads. Lower it on a small server or a hard disk; raise it on a fast machine on wired gigabit.
  • --on-errors=continue: keep going past individual failures instead of stopping at the first.
  • --session-tag: tags everything from this run with the session time, so you can find and review it in Immich.

The defaults that matter for a Takeout, per the documentation: albums are recreated (--sync-albums), archived photos are included, trashed photos are not, partner photos are included, and people names from Google's JSON become tags. Files with no matching JSON are skipped unless you add --include-unmatched.

If it stops partway, run the same command again. immich-go detects what is already on the server and skips it.

Optional: stack RAW and JPEG pairs

If you shot RAW plus JPEG and uploaded both to Google, --manage-raw-jpeg=StackCoverRaw groups each pair into one stack in Immich instead of showing both. --manage-burst=Stack does the same for bursts.

Step 6: check the result

  • Compare immich-go's final summary with Google's item count.
  • Open your oldest and newest years, a few albums and some long videos.
  • Look at Immich's map for a cluster in the sea off West Africa, at latitude 0, longitude 0. Takeout's JSON can hold a zero location for photos that had none.
  • Re-run with --include-unmatched if many files were left out, then check those by hand.

Bring in camera footage without copying it twice

Google Photos was likely only half your library. Drone, action camera and mirrorless footage lives on drives. Immich has external libraries: point it at a folder that Docker can see and it indexes the files where they are, read-only, showing them in the same timeline.

Two things from Immich's documentation to know before you rely on it:

  • Albums and descriptions you add to external files are stored only in Immich, not written to the files.
  • Moving a file within the library makes Immich treat it as new, and that Immich-only metadata is lost on the next scan.

So settle your folder structure first, then add the library. Immich's supported formats list includes Insta360's .insp and .insv extensions, and its web viewer can display 360 photos. For what those files are, see Insta360 file types.

Immich is not a backup on its own

Immich's own README carries a warning to follow a 3-2-1 backup plan, and its documentation says the database backups it makes automatically do not contain photos or videos. A home server is one disk failure, one bad upgrade or one burglary from zero. Keep:

  • the Immich upload folder and database backups on a second drive,
  • a copy off site,
  • and, until you are sure, the Takeout zips themselves.

Our verified copy guide shows how to prove the second copy matches.

Read more