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.
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 thepgvecto.rsorpgvectorextension 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? +
How does Immich compare to PhotoPrism? +
Are my photos encrypted at rest? +
Related tools
Beehiiv
Newsletter platform with built-in ad network and Boost referrals.
Try Beehiiv →
Webflow
Visual site builder with real CSS export and a CMS that scales.
Try Webflow →
Some links above are affiliate links. We may earn a commission if you sign up. See our disclosure for details.
Related reading
2026-05-27
Fly.io Edge Platform Review: Deploy Apps to 37 Regions With WireGuard Networking
We deployed a Go API and Next.js app across Fly.io's edge network, measuring cold starts, regional latency, and DX against Railway, Render, and Heroku — plus WireGuard networking and fly.toml deep-dive.
2026-05-27
OrbStack Deep Review: The macOS-Native Container Runtime That Replaces Docker Desktop
We migrated 18 Docker containers from Docker Desktop to OrbStack on an M1 Max MacBook Pro — measuring memory, CPU idle, and cold starts. Review of macOS-native architecture, Docker API compat, and real-world dev performance.
2026-05-27
Temporal Deep-Dive: Durable Execution That Survives Process Death and Network Outages
We built payment processing, user onboarding, and AI orchestration on Temporal — measuring durability, replay, and SDK learning curve vs Step Functions and job queues. Review of workflow-as-code, deterministic execution, and where durable execution replaces retry logic.
2026-05-27
Turso libSQL Deep-Dive: The SQLite Fork That Ships With an Edge Replication SDK
We integrated Turso's libSQL SDK into a TypeScript analytics pipeline with embedded replicas across 3 regions — review of the architecture, replication model, and how it compares to Cloudflare D1, PlanetScale, and vanilla SQLite.
2026-05-27
Upstash Review: Serverless Redis and Kafka With Per-Request Pricing
We replaced self-hosted Redis and Kafka with Upstash's serverless offerings, measuring latency from 3 regions vs AWS ElastiCache and Confluent Cloud. Review of Redis REST API, Kafka HTTP bridge, and where per-request pricing wins.
Get the best tools, weekly
One email every Friday. No spam, unsubscribe anytime.