Google Photos changed everything when it launched with free unlimited storage. Then they killed it. Now every photo you take counts against your 15GB free tier, and upgrading to Google One means paying $3-10/month while Google trains AI on your family photos.
Immich is the answer. It’s a free, open-source, self-hosted photo and video management platform that looks and feels like Google Photos — but runs on your hardware, with your data staying yours.
Why Immich?
- Mobile app that rivals Google Photos (iOS + Android)
- Automatic backup from your phone
- Facial recognition and smart search
- Machine learning powered by your own hardware
- Shared albums and partner sharing
- Map view with GPS data
- Memories (“On this day” flashbacks)
- External library scanning (existing photo collections)
- Active development — new features weekly
It’s the most complete Google Photos alternative available, and it’s not even close.
Requirements
- A server with Docker (VPS or home server)
- Minimum: 2GB RAM, 2 vCPU
- Recommended: 4GB+ RAM for machine learning features
- Storage: Depends on your photo library (plan for 1-2TB if you’re a heavy photographer)
For server recommendations, check our VPS comparison or mini PC guide.
Installation with Docker Compose
Immich provides an official Docker Compose setup. Here’s how to get running in 5 minutes.
Step 1: Create the directory
mkdir -p ~/immich && cd ~/immich
Step 2: Download the official compose file
curl -Lo docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
curl -Lo .env https://github.com/immich-app/immich/releases/latest/download/example.env
Step 3: Configure the environment
Edit the .env file:
nano .env
Key settings to change:
# Where your photos will be stored
UPLOAD_LOCATION=/path/to/your/photos
# Database password — change this!
DB_PASSWORD=your-secure-password-here
# Immich version — use 'release' for latest stable
IMMICH_VERSION=release
Important: Set UPLOAD_LOCATION to a directory with plenty of storage. This is where all your photos and videos will live.
Step 4: Start Immich
docker compose up -d
Step 5: Access the web UI
Open http://your-server-ip:2283 in your browser. Create an admin account on first visit.
Mobile App Setup
- Install Immich from the App Store or Google Play
- Enter your server URL:
http://your-server-ip:2283(or your domain with HTTPS) - Log in with your admin credentials
- Enable automatic backup in the app settings
Pro tip: Set backup to only run on WiFi to save mobile data.
Setting Up HTTPS (Recommended)
You’ll want HTTPS before using Immich over the internet. Use a reverse proxy:
With Caddy (simplest):
With Traefik or Nginx Proxy Manager: Check our reverse proxy comparison for setup guides.
Once HTTPS is configured, update the server URL in the mobile app to https://immich.yourdomain.com.
Enabling Machine Learning
Immich includes ML features out of the box:
- Facial recognition — automatically groups photos by person
- Smart search — search photos by content (“dog on beach”, “sunset”)
- CLIP embeddings — visual similarity search
These run via the immich-machine-learning container. On first startup, it downloads ML models (~1.5GB). After that, it processes your library in the background.
Hardware requirements for ML:
| Feature | Minimum | Recommended |
|---|---|---|
| Facial recognition | 2GB RAM | 4GB RAM |
| Smart search (CLIP) | 4GB RAM | 6GB+ RAM |
| With GPU acceleration | NVIDIA GPU + nvidia-container-toolkit |
Disable ML if resources are tight:
Remove or comment out the immich-machine-learning service in docker-compose.yml. Immich works fine without it — you just lose smart search and face detection.
Importing Existing Photos
From a folder on your server
Use Immich’s External Library feature:
- Go to Administration → External Libraries
- Click Create Library
- Set the import path (e.g.,
/mnt/photos) - Add the path as a volume in
docker-compose.yml:
services:
immich-server:
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /mnt/photos:/mnt/photos:ro # Read-only import
- Restart and scan:
docker compose restart
From Google Photos (Google Takeout)
- Go to Google Takeout
- Select only Google Photos
- Download the archive
- Extract and use the Immich CLI to upload:
npm i -g @immich/cli
immich login http://your-server:2283/api your-api-key
immich upload --recursive /path/to/google-takeout/Google\ Photos/
Get your API key from Account Settings → API Keys in the Immich web UI.
Storage Planning
Photos and videos add up fast:
| Content | Average Size | 1,000 items |
|---|---|---|
| Phone photos (12MP) | 3-5 MB | 3-5 GB |
| Phone photos (48MP+) | 8-15 MB | 8-15 GB |
| 4K video (1 min) | 300-500 MB | 300-500 GB |
| RAW photos | 25-50 MB | 25-50 GB |
Recommendations:
- Casual photographer: 500GB should last years
- Heavy photographer: Start with 1-2TB
- Video-heavy: 4TB+ and consider a NAS
For storage hardware, see our NAS buying guide.
Backup Strategy
Your photos are irreplaceable. Back them up:
# Simple rsync backup to external drive
rsync -avz /path/to/immich/upload/ /mnt/backup/immich/
# Or use restic for encrypted, deduplicated backups
restic -r /mnt/backup/immich-restic backup /path/to/immich/upload/
Also back up the database:
docker exec immich_postgres pg_dumpall -U postgres > immich-db-backup.sql
For a complete backup strategy, check our Docker backup guide.
Performance Tuning
For low-power hardware (Raspberry Pi, 2GB RAM):
# In .env
IMMICH_WORKERS_INCLUDE=api # Disable ML workers
And remove the immich-machine-learning service from your compose file.
For powerful hardware (8GB+ RAM, GPU):
Enable hardware-accelerated transcoding in Administration → Video Transcoding:
- NVIDIA: Install nvidia-container-toolkit, add GPU to compose
- Intel Quick Sync: Add
/dev/dridevice pass-through - AMD: Add
/dev/dridevice pass-through
services:
immich-server:
devices:
- /dev/dri:/dev/dri # Intel/AMD hardware transcoding
Immich vs Alternatives
| Feature | Immich | PhotoPrism | Nextcloud Photos | Google Photos |
|---|---|---|---|---|
| Mobile app | ✅ Excellent | ⚠️ PWA only | ⚠️ Basic | ✅ Excellent |
| Auto backup | ✅ | ❌ | ⚠️ Via NC app | ✅ |
| Face detection | ✅ | ✅ | ✅ | ✅ |
| Smart search | ✅ | ✅ | ❌ | ✅ |
| Shared albums | ✅ | ✅ | ✅ | ✅ |
| Map view | ✅ | ✅ | ❌ | ✅ |
| Video support | ✅ | ✅ | ⚠️ Basic | ✅ |
| Self-hosted | ✅ | ✅ | ✅ | ❌ |
| Free | ✅ | ⚠️ Essentials free | ✅ | ⚠️ 15GB free |
| RAM needed | 2-6GB | 2-4GB | 512MB+ | N/A |
Immich wins on mobile experience and feature completeness. PhotoPrism is solid if you don’t need a native mobile app. Nextcloud Photos is basic but works if you already run Nextcloud.
Common Issues
“Out of memory” during ML processing: Reduce the ML model size or disable ML. The default CLIP model needs ~2GB RAM.
Slow thumbnail generation: Enable hardware transcoding. Without it, everything is CPU-based and slow on large libraries.
Mobile app won’t connect:
Make sure your server URL includes the port (:2283) and that the port is accessible. For remote access, set up HTTPS with a reverse proxy.
Google Takeout metadata missing:
Use the --album flag with the Immich CLI, or use immich-go which handles Takeout metadata better.
Conclusion
Immich is what Google Photos should have been — fast, beautiful, and respectful of your privacy. The mobile app makes the transition painless, and automatic backup means you can delete Google Photos without looking back.
The setup takes 10 minutes. Your photos stay yours forever.
Next steps: