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.
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.
# 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 AllThe 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.
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