Immich Review: Self-Hosted Google Photos Alternative
What it takes to deploy, how the mobile apps and on-device ML work, and the tradeoffs of hosting your own photos.
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 a backup you have actually rehearsed restoring 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-08-21
701 Bad Internal Links Before 49 Good Ones
A phrase-matching script inserted 750 links across 269 MDX articles. Here is where they failed, and how claim-matching cut the review pile to 128.
2026-08-21
Cloudflare Web Analytics via GraphQL: the siteTag Filter
Why accountTag and siteTag differ in rumPageloadEventsAdaptiveGroups, how the limit argument truncates silently, and which fields we did not verify.
2026-08-21
Bing Webmaster API's 100-URL Cap: 289 URLs, Three Days
Quota is 100 a day against 1300 a month, GetQueryStats was still empty at the end, and two error shapes will kill a cron job.
2026-08-19
IndexNow Batch Mode: 286 URLs Per Publish Down to 0
Bing flags full-sitemap submissions as batch mode. The ~40-line lastmod diff that fixes it, the precondition it needs, and two ways it silently breaks.
2026-08-19
Astro middleware can't serve 410 under output: 'static'
We deleted 434 articles. Middleware runs at build time and 404s in production; two prerender:false routes fix it on Cloudflare Workers.
Get the best tools, weekly
One email every Friday. No spam, unsubscribe anytime.