I picked Immich over PhotoPrism in 2024. It was a close call that I keep getting asked about. This essay is the benchmark run that settled it for me, with numbers from a real 2.1 TB household library, not a synthetic test set. If you're on Google Photos and thinking about leaving, this is the spreadsheet you were looking for.
The rig: Minisforum MS-01, i9-13900H, 64 GB DDR5, no dedicated GPU. The library: 2.1 TB, 54,300 photos, 1,280 short videos, spanning 2012 to present. Part of the full stack.
What I actually need from a photo app
Not every feature matters equally. My priorities, in order:
- Full-fidelity original files survive the trip, including RAW.
- Face recognition I can trust to tag 12 years of family photos without me hand-labeling.
- Mobile apps on iOS and Android for my household — backup in the background, browse offline.
- Reasonable search: by year, by person, by location, by text.
- Not break when the household library hits 3 TB in a few years.
Both Immich and PhotoPrism check all 5 boxes at the feature level. The difference is how they perform under real load, and how willing I am to live with their rough edges.
The head-to-head benchmarks
I installed both on the same host (separate LXC containers, same ZFS pool, same library mounted read-only from TrueNAS). I let each finish its initial index, then ran a week of backups from two iPhones into each. Measurements:
| Metric | Immich 1.107 | PhotoPrism 2026-01 |
|---|---|---|
| Initial index (54k photos) | 14h 22m | 22h 05m |
| Peak RAM during index | 11.2 GB | 6.8 GB |
| Avg CPU during index (8 cores) | 92% | 74% |
| Post-index idle RAM | 2.8 GB | 1.9 GB |
| Face recognition accuracy* | 94.6% | 87.3% |
| Search query latency (p95) | 210 ms | 340 ms |
| Mobile backup throughput | ~12 photos/s | ~7 photos/s |
| Database | Postgres 16 | MariaDB 10.11 |
| Total disk (app + thumbs) | 347 GB | 420 GB |
* Accuracy measured on a hand-labeled subset of 900 faces across 14 people in my household. "Correct" means the person was identified; clusters splitting one person into multiple "faces" counted as wrong.
Face recognition is the decider
At library-sized scale, face recognition accuracy is not an abstract number — it's "does my photo app actually group 2,400 pictures of my partner under one name, or do I have to stitch together 23 clusters." Immich's 94.6% means almost every face got the right tag. PhotoPrism's 87.3% means I'd be hand-merging face clusters every weekend.
Immich uses a newer on-host ML pipeline (InsightFace + ArcFace embeddings stored in Postgres with pgvector for kNN search). PhotoPrism uses TensorFlow with an older face-detection model. Both are CPU-driven on my box — neither pulls a GPU — but Immich's model is just a generation ahead for faces. On non-face search (object recognition, "photos of bicycles"), PhotoPrism is actually slightly better, for whatever that's worth.
What Immich gets wrong
Honest: the project is young, and it shows in ways that matter.
- Breaking changes between versions. I've had two "read the release notes before upgrading" moments in the last year — schema migrations that required manual intervention, once requiring a full re-index of 54k photos.
- No live photo support on Android (as of 1.107). iOS only. Minor for me; major if your household is Android-first.
- Memory appetite. 11 GB during full-indexes is a lot. On a host with less than 16 GB free, plan accordingly.
What PhotoPrism gets right
Equal honesty:
- More mature project. Fewer breaking changes. If you're averse to monthly maintenance, this matters.
- Better object tagging. "Photos of pasta" works better on PhotoPrism for me.
- Leaner. On a smaller rig (NUC, Raspberry Pi 5, etc.) PhotoPrism will simply run where Immich will thrash.
The quadlet I run
For the record, this is the Immich quadlet I'm running (abbreviated — there are 4 containers in the stack, I'll share the full compose-equivalent in a dedicated post):
# ~/.config/containers/systemd/immich-server.container
[Container]
Image=ghcr.io/immich-app/immich-server:v1.107.0
PublishPort=2283:2283
Volume=%h/stacks/immich/upload:/usr/src/app/upload:Z
Volume=/tank/photos:/usr/src/app/external:ro,Z
EnvironmentFile=%h/stacks/immich/.env
Network=immich.network
[Service]
Restart=on-failure
What I'd tell someone starting fresh
If you have a library under 50k photos and a mid-range homelab: Immich. The face-recognition accuracy alone pays for it.
If you have a library over 100k photos, a modest rig, and aversion to breaking changes: PhotoPrism. Steadier platform, lower memory ceiling, still excellent.
If you have less than 10k photos and want something that mostly just works: either will serve you, and you'll be fine.
Next in the self-hosted series: Self-hosted alternatives to 10 services you still pay for. Backup strategy for a 2TB photo library: Borg, Restic, and Kopia.
# issues (0)
$ no issues filed yet. be the first — the form is below.