Skip to content
Go back

Immich vs PhotoPrism: Escape Google Photos Without Losing Your Mind

By SumGuy 10 min read
Immich vs PhotoPrism: Escape Google Photos Without Losing Your Mind

The Google Photos Betrayal

Before we get into the technical weeds, let’s acknowledge why you’re reading this. Google Photos:

A self-hosted photo library gives you: privacy, control, and the smug satisfaction of not paying a tech giant monthly.

TL;DR: Pick Immich for the Google Photos experience — great mobile app, fast modern UI, AI features that work out of the box, releases every few weeks. Pick PhotoPrism if you want fine-grained sharing controls, slower release cadence, and don’t need a polished mobile app.

Immich: The Google Photos Clone That Works

Immich is the new kid who showed up and immediately started winning. It launched around 2022, and it’s been aggressively feature-complete ever since.

Why Immich Wins for Most People

The mobile app is actually good. This cannot be overstated. The iOS and Android apps feel native, sync fast, and auto-upload works like you expect. PhotoPrism’s mobile offering is basic—web app level—and that matters when you’re trying to actually use your library from your phone.

UI/UX is intuitive. If you’ve used Google Photos, Immich’s web interface will feel familiar. Timeline, search, albums, sharing—all in the place you expect them.

Face recognition and AI tagging work out of the box. Immich ships with CLIP for object detection and a face recognition pipeline. Set it up, let it run overnight, and your library is indexed.

Smart features. Immich has “Memories” (photos from one year ago), smart search (“show me photos with dogs”), and a feature that automatically creates albums of your best shots.

Immich: The Honest Bits

It moves fast. Immich hit v1.0 in late 2024 and migrations have been clean since then — but releases still ship every couple weeks. Pin a specific tag in prod and read the release notes before bumping. Don’t just camp on :latest and pray.

Shared links are basic. You can share albums, but if you need granular sharing with expiration dates and download restrictions, PhotoPrism does it better.

Resource-hungry on first setup. The ML pipeline (face detection, embedding generation) will hammer your CPU. Expect 8-16 cores and patience if you’re indexing thousands of photos.

Immich Docker Compose Setup

docker-compose.yml
version: '3.8'
services:
immich-server:
image: ghcr.io/immich-app/immich-server:latest
container_name: immich-server
ports:
- "2283:3001"
environment:
DB_HOSTNAME: immich-db
DB_USERNAME: postgres
DB_PASSWORD: ${DB_PASSWORD}
DB_NAME: immich
REDIS_HOSTNAME: immich-redis
IMMICH_LOG_LEVEL: log
volumes:
- ${LIBRARY_PATH}:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
depends_on:
- immich-db
- immich-redis
restart: unless-stopped
immich-microservices:
image: ghcr.io/immich-app/immich-server:latest
container_name: immich-microservices
command: start.sh microservices
environment:
DB_HOSTNAME: immich-db
DB_USERNAME: postgres
DB_PASSWORD: ${DB_PASSWORD}
DB_NAME: immich
REDIS_HOSTNAME: immich-redis
IMMICH_LOG_LEVEL: log
volumes:
- ${LIBRARY_PATH}:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
depends_on:
- immich-db
- immich-redis
restart: unless-stopped
immich-db:
image: postgres:15-alpine
container_name: immich-db
environment:
POSTGRES_DB: immich
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- immich-db:/var/lib/postgresql/data
restart: unless-stopped
immich-redis:
image: redis:7-alpine
container_name: immich-redis
restart: unless-stopped
volumes:
immich-db:

Create a .env file with your paths and passwords:

.env
DB_PASSWORD=your_secure_password_here
LIBRARY_PATH=/mnt/photos

Spin it up with docker compose up -d, then point your browser to http://localhost:2283. Create an admin account on first login. Install the mobile app from the App Store or Play Store, point it at your server’s IP (or a reverse-proxy URL), and enable auto-upload. Done.

The first indexing pass is where Immich earns its keep. If you’re importing 50,000 photos from Google Takeout, expect the microservices container to hit 90%+ CPU for a few hours while CLIP generates embeddings and the face recognition model clusters your faces. Monitor with docker compose logs immich-microservices. It’s working—it’s just slow.

PhotoPrism: The Control Freak’s Choice

PhotoPrism has been around longer (started ~2018) and feels more like a pro tool. It’s mature, stable, and gives you options.

Why PhotoPrism Appeals to Certain People

More sharing control. PhotoPrism lets you create password-protected links with expiration dates, disable downloads, and set per-album permissions. If you’re sharing photos with family or running a small photo service, this matters.

Better API. PhotoPrism has a documented REST API. You can integrate it with backup tools, build custom frontends, or automate workflows.

Lighter on resources initially. PhotoPrism’s indexing is less aggressive than Immich’s ML pipeline. On a Pi or low-end server, it’ll feel snappier.

More config knobs. PhotoPrism is built by photographers who like options. Cache settings, indexing strategies, conversion pipelines—all configurable.

Rock-solid stability. PhotoPrism’s architecture is mature. You’re not riding a wave of feature releases; you’re using something that’s been battle-tested.

PhotoPrism: The Trade-offs

Mobile app is weak. It exists. It works. But it’s not going to replace Google Photos on your phone. Most people end up just using the web interface.

UI is more cluttered. PhotoPrism has more features, which means more settings, which means it’s less intuitive if you just want “Google Photos but self-hosted.”

Face recognition is okay, not great. PhotoPrism uses TensorFlow, and it works, but Immich’s CLIP integration feels more accurate.

Library organization is manual-first. PhotoPrism assumes you’ll organize photos with folder structures and labels. Immich assumes you want smart albums and search.

PhotoPrism Docker Compose Setup

docker-compose.yml
version: '3.8'
services:
photoprism:
image: photoprism/photoprism:latest
container_name: photoprism
ports:
- "2342:2342"
environment:
PHOTOPRISM_ADMIN_PASSWORD: ${ADMIN_PASSWORD}
PHOTOPRISM_SITE_URL: "http://localhost:2342/"
PHOTOPRISM_ORIGINALS_LIMIT: 5000
PHOTOPRISM_HTTP_COMPRESSION: "gzip"
PHOTOPRISM_LOG_LEVEL: "info"
PHOTOPRISM_WORKERS: 4
PHOTOPRISM_READONLY: "false"
volumes:
- ${LIBRARY_PATH}:/photoprism/originals
- photoprism-storage:/photoprism/storage
- /etc/localtime:/etc/localtime:ro
depends_on:
- photoprism-db
restart: unless-stopped
photoprism-db:
image: mariadb:10.11
container_name: photoprism-db
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: photoprism
MYSQL_USER: photoprism
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- photoprism-db:/var/lib/mysql
restart: unless-stopped
volumes:
photoprism-storage:
photoprism-db:

Setup looks similar to Immich, but notice PhotoPrism is a single service (plus DB). Create your .env and start with docker compose up -d. First startup indexes your library automatically. Go to http://localhost:2342 and log in with the admin password you set. Unlike Immich, there’s no separate microservices container hammering your CPU—PhotoPrism does all the indexing in the main service, which means it’s slower but more predictable.

After initial indexing, navigate to Settings > Library to tweak behavior: how aggressively to thumbnail, how many worker threads to use, whether to index hidden files, etc. PhotoPrism gives you these knobs because it assumes you want to tune them.

Feature Comparison: The Details Matter

FeatureImmichPhotoPrism
Mobile AppExcellent native apps (iOS + Android)Web app only, no auto-backup
Face RecognitionCLIP-based, very accurate clusteringTensorFlow, solid, good for people you see often
UI IntuitionFeels like Google Photos (timeline, search, albums)Library view, folder-based, more control-oriented
Sharing ControlsBasic link sharingPassword-protected links, expiration dates, granular permissions
REST APIPartial (improving)Full, well-documented, easier integrations
Initial Resource LoadHigh (ML indexing maxes CPU)Lower (threaded, configurable workers)
Setup ComplexityModerate (server + microservices + DB + Redis)Simple (single service + MariaDB)
DatabasePostgreSQL with pgvectorMariaDB (lighter)
Community SizeGrowing fast, very active GitHubEstablished, slower development but stable
Video SupportYes, good codec supportYes, handles more edge cases
Backup/ExportFull library export with metadataFull library export with metadata
Reverse Proxy ReadyYes, handles external URLsYes, handles external URLs
Multi-User SupportYes, with shared albumsYes, with library roles and permissions

The table doesn’t capture the nuance: Immich feels like you’re using Google Photos. PhotoPrism feels like you’re operating a photo management system. Both philosophies are valid—it depends on your headspace.

Getting Your Photos In: The Google Takeout Reality

Both support importing from Google Takeout. Here’s the honest truth: it takes time and planning.

  1. Go to takeout.google.com, select only Google Photos, and wait 3-7 days for your export.
  2. Download and extract (Takeout is huge—50K photos might be 50GB spread across multiple archives).
  3. Point Immich or PhotoPrism at the directory with LIBRARY_PATH=/path/to/extracted/Takeout.
  4. Let it import. Expect 4-12 hours if you have 50K+ photos.

Immich’s advantage here: It has a dedicated Google Takeout importer that reads JSON metadata sidecars and preserves timestamps, locations, and descriptions. You’ll see your photos with their original metadata intact.

PhotoPrism’s approach: You point it at the directory and it reads Exif. Works, but it’s less automated. Some of Google’s custom metadata (face labels, descriptions) gets lost. However, PhotoPrism’s UI includes a library scan tool where you can manually organize imported folders, which some people actually prefer.

Real talk: if you have 10+ years of Google Photos history, expect to spend a weekend. Get the import running Friday night and check it Sunday morning. Both tools will work, but patience is the real requirement here.

The Real Cost: Hardware Requirements

Both systems require decent hardware. Here’s what that means in practice:

Sweet Spot Setup (handles 50K+ photos comfortably):

Minimum Setup (will work, but patience required):

Why so much RAM and disk? Immich and PhotoPrism generate thumbnails for every resolution and orientation. A 10MB original becomes 50-100MB of cached derivatives. Add metadata databases, ML model caches, and Redis (Immich), and you’re looking at significant overhead.

Specific hardware that works:

GPU acceleration (optional, but transforms indexing speed):

If you don’t have a GPU, don’t sweat it. Both work fine on CPU; indexing just happens at night instead of in real-time.

The Decision Tree

Choose Immich if:

Choose PhotoPrism if:

The Uncomfortable Truth

Both will require maintenance. Database updates, image reprocessing, occasional bugs in new features. Self-hosting is a commitment. If you’re expecting “set it and forget it,” you’re better off paying Google.

But if privacy matters, if you own your data, and if you’re willing to spend a weekend getting it right, both Immich and PhotoPrism beat the alternatives. Immich is the faster, more polished newcomer. PhotoPrism is the steady hand that’s been doing this longer.

Pick one, give it two weeks, and see which one doesn’t drive you insane. That’s the real test.


Share this post on:

Send a Webmention

Written about this post on your own site? Send a webmention and it'll show up above once verified.


Previous Post
Your Server Doesn't Know What Random Means (And That's a Problem)
Next Post
Auditd & Audit Logging: Know Exactly Who Touched What on Your Server

Discussion

Powered by Garrul . Sign in with GitHub or Google, or post anonymously.

Related Posts