Skip to content
SELF-HOSTED

Immich vs. PhotoPrism on a 2 TB library

Four weeks, two installs, the same 2.1 TB photo library. Real indexing times, face-recognition accuracy on 900 labeled faces, and CPU cost on a single i9 host with no GPU.

published
author
read
3 min (~734 words)
Interior view of a camera store showcasing a variety of photography products including Fujifilm items.
0%

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:

  1. Full-fidelity original files survive the trip, including RAW.
  2. Face recognition I can trust to tag 12 years of family photos without me hand-labeling.
  3. Mobile apps on iOS and Android for my household — backup in the background, browse offline.
  4. Reasonable search: by year, by person, by location, by text.
  5. 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.

# add an issue

Comments are moderated. Links are capped. Be kind, be specific.