The Google Photos Betrayal
Before we get into the technical weeds, let’s acknowledge why you’re reading this. Google Photos:
- Was free forever. Then it wasn’t.
- Reads your photos. Facial recognition, object detection, location tagging—all server-side. Google knows where you were, who you were with, what you were doing.
- Locks you in. Exporting 50,000 photos via Google Takeout is technically possible. Rebuilding your organization in something else is a weekend.
- Has no API for power users. Want to sync with your backup system? Manually manage albums? Good luck.
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
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:
DB_PASSWORD=your_secure_password_hereLIBRARY_PATH=/mnt/photosSpin 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
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
| Feature | Immich | PhotoPrism |
|---|---|---|
| Mobile App | Excellent native apps (iOS + Android) | Web app only, no auto-backup |
| Face Recognition | CLIP-based, very accurate clustering | TensorFlow, solid, good for people you see often |
| UI Intuition | Feels like Google Photos (timeline, search, albums) | Library view, folder-based, more control-oriented |
| Sharing Controls | Basic link sharing | Password-protected links, expiration dates, granular permissions |
| REST API | Partial (improving) | Full, well-documented, easier integrations |
| Initial Resource Load | High (ML indexing maxes CPU) | Lower (threaded, configurable workers) |
| Setup Complexity | Moderate (server + microservices + DB + Redis) | Simple (single service + MariaDB) |
| Database | PostgreSQL with pgvector | MariaDB (lighter) |
| Community Size | Growing fast, very active GitHub | Established, slower development but stable |
| Video Support | Yes, good codec support | Yes, handles more edge cases |
| Backup/Export | Full library export with metadata | Full library export with metadata |
| Reverse Proxy Ready | Yes, handles external URLs | Yes, handles external URLs |
| Multi-User Support | Yes, with shared albums | Yes, 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.
- Go to takeout.google.com, select only Google Photos, and wait 3-7 days for your export.
- Download and extract (Takeout is huge—50K photos might be 50GB spread across multiple archives).
- Point Immich or PhotoPrism at the directory with
LIBRARY_PATH=/path/to/extracted/Takeout. - 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):
- CPU: 8 cores (Intel i5/i7 or AMD Ryzen 5+), or 4-core Xeon
- RAM: 16 GB
- Storage: 2-3x your photo library size (originals + thumbnails + DB + cache)
- Disk Type: SSD for the database, any drive for photo storage
Minimum Setup (will work, but patience required):
- CPU: 4 cores (a used Intel NUC or mini PC)
- RAM: 8 GB
- Storage: Again, 2-3x library size
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:
- Synology NAS: Both run in containers on recent models (DS920+ or newer). Not blazing fast, but totally functional. You already own the storage and power envelope.
- Proxmox LXC: Give Immich 8 vCPU, 8GB RAM, 500GB disk and it’ll be happy. PhotoPrism can do it on 4 vCPU + 6GB.
- Old mini PC + external SSD: Grab a used Intel NUC 7-9, throw 16GB RAM in it, connect an external SSD for photos. ~$200 total, will outperform most NAS boxes.
- Raspberry Pi 4 (8GB): Technically works for <5K photos. Everything takes forever. Not recommended unless you’re stubborn.
GPU acceleration (optional, but transforms indexing speed):
- Immich with NVIDIA GPU (RTX 3060 or better): Face recognition cuts from 4 hours to 30 minutes for 10K photos.
- PhotoPrism: Can use GPU for video encoding and some TensorFlow ops, but less dramatic speedup than Immich.
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:
- You want Google Photos feel and aren’t interested in learning app settings.
- You have a decent home server or cloud VM to run it on.
- You use your phone to browse and upload photos regularly.
- You don’t need granular sharing controls.
Choose PhotoPrism if:
- You like having knobs to turn and want to understand what’s happening.
- You’re on a tight resource budget and want to minimize initial load.
- You need fine-grained sharing, expiration dates, or API access.
- You’re comfortable with a browser-first workflow.
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.