Home / Lab / Replacing Google Photos with Immich
Complete Self-Hosting 6 min read

Replacing Google Photos with Immich

After years of Google Photos, I migrated my entire photo library to a self-hosted Immich instance. The migration took a weekend. The result is faster, more private, and — surprisingly — more capable for browsing.

ImmichDocker ComposePostgreSQLRedisTraefikTailscale

I had 11 years and ~47,000 photos in Google Photos. The free unlimited storage ended in 2021, and since then I’ve been paying for Google One storage while quietly uncomfortable with the fact that a company is training models on my family photos.

So I moved everything to Immich — an open-source, self-hosted photo management platform. The short version: it worked, it’s fast, and I haven’t looked back.

Why Immich

I evaluated a few alternatives before landing on Immich:

  • PhotoPrism — excellent but slow on CPU-only hardware; face recognition requires GPU for reasonable speed
  • Piwigo — mature but feels dated; no mobile-first design
  • Nextcloud Photos — works, but Nextcloud’s overhead is significant if photos are all you want
  • Immich — fast, actively developed, great mobile apps, face recognition that actually works, memories feature

Immich is still in active development (they’re transparent about the pre-1.0 status), but I’ve found it stable enough for a photo library. The development velocity is impressive.

The Stack

# docker-compose.yml (simplified)
services:
  immich-server:
    image: ghcr.io/immich-app/immich-server:release
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file: .env
    ports:
      - 2283:2283
    depends_on:
      - redis
      - database

  immich-machine-learning:
    image: ghcr.io/immich-app/immich-machine-learning:release
    volumes:
      - model-cache:/cache
    env_file: .env

  redis:
    image: redis:6.2-alpine

  database:
    image: tensorchord/pgvecto-rs:pg14-v0.2.0
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  model-cache:
  pgdata:

The machine-learning container handles face recognition and CLIP-based search (semantic search by description — genuinely impressive). It’s CPU-only on my hardware but runs offline during quiet periods.

Migration from Google Photos

Google Takeout exports your library as a set of zip files. The catch: metadata (dates, GPS coordinates) is stored in separate .json sidecar files, not in the image EXIF data.

The Google Photos Takeout Helper CLI tool (gpth) processes this correctly and reorganizes the dump into a clean folder structure with metadata applied. Run it before importing to Immich.

# Install
pip install gpth

# Process the Takeout dump
gpth --input ./takeout-folder --output ./photos-clean

Then import to Immich:

  1. In Immich admin, set up an External Library pointing to the processed folder
  2. Run the scan job
  3. Photos appear with correct dates and locations

For 47,000 photos this took about 90 minutes to index and several hours overnight for the ML processing (face clustering, CLIP embeddings).

What Surprised Me

Search is genuinely good. Immich uses CLIP embeddings so you can search “beach sunset” and it finds relevant photos even with no tags. This works better than I expected on CPU.

The mobile apps are polished. Both iOS and Android apps auto-backup and feel native. The timeline view is smooth. It doesn’t feel like self-hosted software in the way that some projects do.

Memories work. The “On this day” feature surfaces photos from past years the same way Google Photos does. This was the feature I was most worried about losing.

What I Had to Accept

No sharing ecosystem. Google Photos’ shared albums with non-technical family members are hard to replicate. I share albums via Immich’s shareable links now, which work, but it’s not as seamless.

Maintenance overhead. Updates come frequently. I run Watchtower to handle automatic container updates, but you should review changelogs before blindly applying them to a photo library.

ML processing is slow without GPU. Face clustering for 47K photos ran overnight. It’s a one-time cost, but worth knowing.

Storage

My photos live on a 2TB external SSD connected to the Proxmox host, passed through to the Docker host as an NFS mount. I also have a nightly rclone job syncing to Backblaze B2 for offsite backup.

The 3-2-1 rule: 3 copies, 2 different media types, 1 offsite. Self-hosting doesn’t mean no backups.

Would I Go Back to Google Photos?

No. The combination of Immich’s features, the privacy improvement, and the cost saving (eliminating the Google One subscription) makes this clearly worth the setup time.

The setup took a Saturday. The migration took overnight. The maintenance overhead is one container update every few weeks.

For a photo library this personal, owning the infrastructure is worth it.

Common questions

Short, direct answers to what people actually ask about this.

Is Immich a viable replacement for Google Photos?

For a personal library, yes. Migrating 11 years and roughly 47,000 photos took a Saturday to set up and one overnight run. CLIP-based search, face recognition, memories and polished mobile apps with auto-backup all work. The gap is sharing with non-technical family, which relies on shareable links rather than a shared ecosystem.

How does Immich compare with PhotoPrism, Piwigo and Nextcloud Photos?

PhotoPrism is excellent but slow on CPU-only hardware, with face recognition that really wants a GPU. Piwigo is mature but dated and not mobile-first. Nextcloud Photos works, but carries all of Nextcloud's overhead if photos are all you want. Immich was the fastest with the best mobile apps.

What do you give up by self-hosting your photo library?

The sharing ecosystem, mainly — shared albums with non-technical family are hard to replicate. You also take on maintenance, since updates land frequently and a photo library deserves a changelog read before applying them. Machine-learning processing is slow without a GPU; face clustering 47,000 photos ran overnight.

How should a self-hosted photo library be backed up?

By the 3-2-1 rule: three copies, two media types, one offsite. Mine live on an external SSD passed through to the Docker host, with a nightly rclone job syncing to Backblaze B2. Self- hosting removes a provider, not the need for backups.

Discussion