pickuma.
Infrastructure

Immich Review: Self-Hosted Google Photos Alternative for Developers

A measured look at Immich, the open-source self-hosted photo platform with mobile apps and on-device ML, covering deployment, AI features, and the tradeoffs of running it yourself.

6 min read

What Immich Is

Immich is an open-source, self-hosted photo and video backup platform. The project ships a server, a web client, and native iOS and Android apps under AGPL-3.0. The mobile apps mirror the Google Photos flow: grant photo library access, and the app uploads new captures to a server you run. The web UI organizes the resulting library with albums, places, faces, and natural-language search.

The repo on GitHub ships a docker-compose.yml and a small set of services. Standing the stack up takes one command on any host with Docker installed. The team has been shipping the project publicly since 2022 and has crossed 60,000 GitHub stars, with a monthly release cadence.

Three audiences care about this project:

  • Households leaving Google Photos because of the 15 GB shared quota or the unease about cloud-side ML running on private photos.
  • Homelabbers who already run a NAS or a small server and want a “photos app” tier on top of their existing storage.
  • Developers who want an HTTP API and event hooks for their own automation — bulk imports, custom albums, family-facing share endpoints.

What makes Immich worth a review now rather than a year ago: stability landed, the mobile apps stopped requiring background-task workarounds on iOS for normal use, and the ML stack got faster CPU inference paths via ONNX runtime updates. If you bounced off Immich in 2023 because every other release broke your database schema, the picture is different today.

Architecture and Deployment

The reference deployment is six containers, all defined in the example compose file:

  • immich-server — the NestJS API plus microservices for jobs, ingest, and notifications.
  • immich-machine-learning — a Python service that runs ML models (face detection, face embeddings, CLIP image and text embeddings).
  • redis — job queue and short-term cache.
  • postgres — metadata, with the pgvecto.rs or pgvector extension for vector search.
  • A web client served from the server container.
  • An optional reverse proxy of your choice.

You point UPLOAD_LOCATION at a directory on the host, set a Postgres password, and run docker compose up -d. The web UI is reachable in under a minute on a small server. First-run setup creates an admin user and lets you invite additional users from the settings page.

Originals are stored on the filesystem and never re-encoded. JPEG, HEIC, most RAW formats via libraw, and the common video containers (MP4, MOV, ProRes) all import as-is. The server generates a thumbnail and a larger preview alongside each original, so a 50 GB phone roll lands closer to 65 GB on disk after processing.

Postgres holds metadata and the vector index. The machine learning container drives the first-run cost: bulk-importing an existing library puts every image through face detection, face embedding, and CLIP embedding. On a 4-core x86 box, an import of around 100,000 photos can take the better part of a day. After that, incremental ingest from phones is near-instant because the queue depth is just the new captures.

You can run the ML container on GPU via CUDA, OpenVINO, or Apple’s CoreML on macOS hosts. The repo documents the configurations. On a homelab box with a discrete GPU, initial import drops from hours to minutes.

AI Features and What They Actually Do

Three AI features ship in the box.

Face clustering. Every photo goes through RetinaFace for detection and an ArcFace-style model for embeddings. Embeddings get clustered into “people” you can name. You name a cluster once and the label propagates to every other photo in that cluster. Accuracy on adults is good. Embeddings for young children drift as their features change, so expect to merge clusters by hand every few months until they grow up.

Smart search. CLIP-derived embeddings let you type red bicycle at night or kitchen with morning light and get a ranked result list. The search runs over precomputed embeddings stored in Postgres. Latency on libraries under 50,000 photos is sub-second on commodity hardware, and quality on natural-language queries holds up against the equivalent Google Photos search in our spot checks.

Duplicate detection. Perceptual hashing flags near-duplicates — rotation, compression, and edit variants — for manual review. You confirm or reject each batch from the UI rather than the server deleting anything on its own. Conservative defaults, which is the right call for an irreplaceable archive.

What the AI does not do today:

  • Text OCR on signs or handwritten notes lags Apple’s on-device OCR.
  • Auto-generated “memories” reels exist but are skeletal next to Google Photos.
  • No voice tagging, AI captions, or generative editing.

For developers, the ML container is just an HTTP service. You can call it directly if you want to bolt your own pipelines onto it — for example, generating CLIP embeddings for photos already stored elsewhere and feeding them into the database.

The Tradeoffs of Self-Hosting

Mobile uploads carry platform constraints. iOS aggressively suspends background uploads, so a roll of 500 new photos may upload across several app opens rather than in one push. The Immich app uses every background API iOS exposes; the ceiling is Apple’s, not Immich’s. Android is more cooperative but still subject to manufacturer-specific power management.

The web UI is functional and clearly improving. Album sharing, public links, and collaborative albums all work. Comments and reactions exist but feel plain compared to Google Photos. If you share with non-technical family members, expect a short adjustment period — and consider keeping Google Photos on a free tier as the “share with grandma” path for the first six months.

Resource footprint is modest at rest and spiky during ML work. A household-scale instance (3–5 users, ~300,000 photos) runs steady-state on 4 GB RAM and 2 vCPUs. Initial import will saturate any CPU you give it; plan for a one-time spike or schedule it overnight.

Cost arithmetic versus Google One 2 TB ($9.99/month, $99.99/year on annual prepay): a capable Mini PC plus a 4 TB SSD is $300–500 one-time. Add Backblaze B2 offsite at $6/TB/month for proper backup and you spend roughly $144/year for 2 TB of cold copies. Plain hardware payback lands around year three. After that, you own the rails.

The right question is not whether Immich beats Google Photos on polish — it does not, and it does not need to. The right question is whether owning your photo archive is worth the operational tax of running one more service. For developers who already run a homelab, the answer is usually yes. For everyone else, evaluate honestly before you migrate.

FAQ

Can Immich run on a Raspberry Pi? +
Yes, for small libraries. A Pi 5 with an external SSD handles libraries under ~50,000 photos for a single user. ML processing during initial import will be slow — expect hours where an x86 machine takes minutes — but steady-state ingest from phones is fine. For larger libraries, move to a Mini PC.
How does Immich compare to PhotoPrism? +
PhotoPrism has been around longer and has a more polished web UI for organizing existing libraries with metadata, GPS, and ratings. Immich has notably better mobile apps and a more active release cadence. Pick PhotoPrism if you primarily curate an existing archive; pick Immich if you primarily back up phones.
Are my photos encrypted at rest? +
Not by default. Immich stores originals on the filesystem unencrypted, the same way Google Photos stores them server-side unencrypted. If you need encryption at rest, run Immich on an encrypted volume (LUKS, ZFS native encryption, or APFS encryption) rather than expecting the app to handle it.

Related tools

Some links above are affiliate links. We may earn a commission if you sign up. See our disclosure for details.

Related reading

See all Infrastructure articles →

Get the best tools, weekly

One email every Friday. No spam, unsubscribe anytime.