·5 min read

Immich: Self-Hosted Google Photos That Actually Works

Running Immich on a home server to replace Google Photos — with on-device ML for face recognition and object search, full EXIF metadata, and mobile sync.

Self-hostedDockerStoragePrivacy

Google Photos is convenient until you think about what you're handing over: a complete visual history of your life, location metadata, face prints of your family, indexed and searchable by a company whose primary business is advertising. Immich is a self-hosted alternative that matches roughly 90% of Google Photos' day-to-day features and has been closing that gap fast.

What it actually includes

  • Mobile apps (iOS + Android) with automatic background backup
  • Face recognition and clustering using local ML models
  • Object/scene search ('beach', 'dog', 'birthday cake')
  • EXIF-based map view of where photos were taken
  • Albums, shared albums, and a partner sharing feature
  • RAW file support and video transcoding
  • Duplicate detection

Architecture overview

Immich runs as several containers: the main server API, a separate machine-learning service for face/object recognition, PostgreSQL (with the pgvecto-rs extension for vector search), and Redis for job queuing. The ML container is the heavy one — it loads CLIP and facial recognition models. On first run it downloads ~2GB of models.

bash
# Minimum viable resource requirements
# Server:         ~500MB RAM idle
# ML container:   ~2GB RAM (loads CLIP + facial recognition models)
# Storage:        Depends on your photo library (plan for originals + thumbnails)

# Check job queue status
docker logs immich_server 2>&1 | grep -i "job"

# Force re-run facial recognition on existing library
# Admin → Jobs → Face Detection → Run All

The migration path from Google Photos

Google Takeout exports your entire library as ZIP files. Immich's CLI tool can ingest these directly, preserving EXIF metadata including the original taken-at timestamp. Albums don't import automatically (Takeout exports them as folders), but the Immich Takeout importer handles this with a config file.

Warning:Immich is still pre-1.0. The developers have an explicit warning about not using it as your only backup. Keep originals on a separate backup target — I use Nextcloud as a secondary store.

6 months in — what I'd tell myself

  • Enable hardware transcoding early — software transcoding is slow for video
  • Give the ML container enough RAM or it will OOM-kill mid-recognition job
  • The mobile app battery impact is comparable to Google Photos
  • Face clustering takes hours on a large library but runs once
  • External library support lets you point Immich at existing NAS folders without copying