How to Self-Host Immich: Google Photos Alternative with Mobile Backup 2026
TL;DR
Immich (AGPL 3.0, ~55K GitHub stars, TypeScript + Go) is the fastest-growing self-hosted Google Photos replacement — purpose-built for automatic mobile backup with a near-identical UX. The iOS and Android apps run in the background and upload photos/videos as you take them. AI features (face recognition, scene detection, CLIP semantic search) run locally. Google Photos charges $2.99/month for 100GB; Immich is free and stores on your hardware. Compare Immich vs PhotoPrism: Immich has better mobile backup and faster UI; PhotoPrism has more mature AI classification and batch operations.
Key Takeaways
- Immich: AGPL 3.0, ~55K stars — Google Photos-equivalent UX, best mobile backup
- Automatic backup: iOS/Android apps silently backup in background (like Google Photos)
- Machine learning: Face clustering, CLIP semantic search ("sunset over mountains")
- Shared albums: Create albums and invite family/friends with a link
- Memory lane: Shows "On this day" photos from past years
- Active development: Releases weekly — fastest-moving self-hosted photo project
Immich vs PhotoPrism vs Google Photos
| Feature | Immich | PhotoPrism | Google Photos |
|---|---|---|---|
| License | AGPL 3.0 | AGPL 3.0 | Proprietary |
| Cost | Free | Free | $2.99/mo (100GB) |
| Mobile backup app | Yes (iOS + Android) | No (3rd party) | Yes |
| Background sync | Yes (automatic) | Manual/3rd party | Yes |
| Face recognition | Yes | Yes | Yes |
| CLIP semantic search | Yes | No | Yes |
| Scene classification | Basic | 1000+ labels | Yes |
| Shared albums | Yes | Yes | Yes |
| Memory lane | Yes | No | Yes |
| Duplicate detection | Yes | Yes | Yes |
| Video transcoding | Yes | Yes | Yes |
| GitHub Stars | ~55K | ~34K | — |
Part 1: Docker Setup
# docker-compose.yml
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
restart: always
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
ports:
- "2283:2283"
depends_on:
- redis
- database
healthcheck:
disable: false
immich-machine-learning:
container_name: immich_machine_learning
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
restart: always
volumes:
- model-cache:/cache
env_file:
- .env
healthcheck:
disable: false
redis:
container_name: immich_redis
image: docker.io/redis:6.2-alpine@sha256:148bb5ac8be21ac54f6bb42d3c4af0c8cfbae44e6ec8f5bfa33a80dd79a14f9d
restart: always
healthcheck:
test: redis-cli ping || exit 1
database:
container_name: immich_postgres
image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
restart: always
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: "--data-checksums"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: >-
pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' || exit 1;
Chksum="$$(psql --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' --tuples-only --no-align
--command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')";
echo "checksum failure count - $Chksum";
[ "$Chksum" = '0' ] || exit 1
interval: 5m
start_interval: 30s
start_period: 5m
volumes:
model-cache:
postgres_data:
# .env
UPLOAD_LOCATION=/path/to/your/photos # Where photos are stored on host
IMMICH_VERSION=release
DB_PASSWORD=your-secure-db-password
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
REDIS_HOSTNAME=redis
docker compose up -d
Visit http://your-server:2283 → create admin account.
Part 2: HTTPS with Caddy
photos.yourdomain.com {
reverse_proxy localhost:2283
}
Part 3: Install Mobile App and Enable Backup
iOS
- Install Immich from App Store
- Open app → Server URL:
https://photos.yourdomain.com - Log in
- Backup tab → Enable Auto Backup
- Grant photo library access
- Immich backs up photos and videos silently in the background
Android
- Install Immich from Play Store or F-Droid
- Same setup as iOS
- Enable Background backup → Immich uploads automatically when on WiFi
Backup Settings
In the mobile app → Backup settings:
- WiFi only: Recommended (prevents mobile data usage)
- Background backup: Keep enabled
- Video backup: Optional (large files)
- Exclude albums: Exclude screenshots, WhatsApp images, etc.
Part 4: AI Features
Face Recognition
Immich clusters faces automatically — runs on the machine learning container:
- Explore → People — view auto-detected face clusters
- Click a cluster → Set name → "Alice"
- All photos of Alice are now searchable
Semantic Search (CLIP)
Immich uses CLIP (Contrastive Language-Image Pretraining) for natural language photo search:
# Search examples in the search bar:
"birthday cake with candles"
"sunset over mountains"
"dog playing in snow"
"wedding ceremony outdoors"
No tags needed — the model understands photo content semantically.
Smart Albums
- Albums → + Create Album
- Or use Explore → People → [Person] to auto-populate a person's photos
Part 5: Sharing
Shared Albums
- Albums → [Album] → Share
- Add users (internal accounts) or generate a Public share link
- Public link: recipients can view/download without an account
Partner Sharing
Share your entire library with a partner:
- Settings → Sharing → Partner → Add partner
- They see all your photos in their app
Part 6: External Library (Without Re-uploading)
Point Immich at an existing photo directory without moving files:
# In docker-compose.yml, add to immich-server:
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /path/to/existing/photos:/mnt/media/existing:ro # Read-only external library
Then in Immich:
- Administration → External Libraries → Create External Library
- Path:
/mnt/media/existing - Click Scan Library — Immich indexes without copying
Part 7: Hardware Acceleration for ML
NVIDIA GPU
immich-machine-learning:
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-cuda
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
ARM / Apple Silicon
Use the ARM build — ML runs on CPU efficiently on M-series Macs or ARM servers:
immich-machine-learning:
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-armv8
Part 8: Memory Lane
Immich automatically creates "On this day" memories:
- Opens the app → notifications for photos taken 1, 2, 3+ years ago today
- Memories tab → swipe through past years like a story
Enable in: Settings → Notifications → Memories
Part 9: Duplicate Detection
Immich detects duplicate photos in your library:
- Administration → Utilities → Duplicate Detection
- Review detected duplicates side-by-side
- Trash duplicates with one click
Maintenance
# Update Immich (always use release tag, check changelogs):
docker compose pull
docker compose up -d
# WARNING: Breaking changes are common — read release notes before updating
# Check job queue status:
# Administration → Jobs → view active/completed jobs
# Backup database:
docker exec immich_postgres pg_dump -U postgres immich \
| gzip > immich-db-$(date +%Y%m%d).sql.gz
# Backup uploads (photos):
# Just backup your ${UPLOAD_LOCATION} directory — original files live there
# Logs:
docker compose logs -f immich-server
docker compose logs -f immich-machine-learning
# Trigger full library scan:
# Administration → Jobs → Library → Run all
See all open source photo management tools at OSSAlt.com/categories/photos.