Immich — Self-Hosted Photo & Video Management at 106K Stars

Immich is the world's most popular self-hosted photo and video backup solution, with 106K+ GitHub stars. Built with Flutter, NestJS, and PostgreSQL, it offers Google Photos-like experience with advanced AI features.

  • Updated 2026-07-07

Editorial Disclosure: The data in this article (repo name, stars, descriptions) was auto-collected by Dibi8 Tribe Intel from GitHub API. Analysis and editorial content is written by the Dibi8 editorial team.

TL;DR #

Immich is a high-performance self-hosted photo and video backup solution that has become the de facto Google Photos alternative for privacy-conscious users. With 106,557 GitHub stars, it is one of the most popular self-hosted applications on the entire platform.

Key strengths:

  • Full-featured mobile app (Flutter) with automatic background backup
  • Web interface with album management, timeline view, and map view
  • AI-powered face recognition, object detection, and scene analysis
  • Multi-user support with granular permissions
  • Active development with 300+ contributors and weekly releases

What Is Immich? #

Immich is an open-source, self-hosted backup solution for your photos and videos. It provides a Google Photos-like experience while keeping all your data on your own hardware. The project was initiated by Alex Tran in 2021 and has grown into one of the largest self-hosted projects on GitHub.

The architecture consists of:

  • Mobile apps (iOS/Android) built with Flutter for seamless backup
  • Web app built with Angular for desktop management
  • Backend API built with NestJS and TypeScript
  • Database using PostgreSQL for metadata and MinIO/S3 for file storage
  • Machine learning pipeline for face recognition and object detection
# Quick start with Docker Compose
docker compose up -d

# Verify installation
curl -s http://localhost:2283/api/server-info | jq

Why It Matters #

Privacy-First Design #

In an era where tech giants monetize your personal photos, Immich offers a compelling alternative. All your media stays on your infrastructure — no cloud uploads, no data mining, no algorithmic manipulation of your feed.

Massive Community Adoption #

With 106K+ stars and 6K+ forks, Immich has one of the most active communities in the self-hosted space. The project receives regular updates, has extensive documentation, and integrates seamlessly with popular self-hosted ecosystems like Nextcloud and Synology NAS.

AI-Powered Features #

Unlike basic photo managers, Immich includes sophisticated AI features:

  • Face Recognition: Automatically detects and groups faces across your entire library
  • Object Detection: Identifies objects, scenes, and activities in your photos
  • Semantic Search: Search your photos using natural language (“cat on the beach”)
  • Timeline View: Organize photos by date, location, and people

Architecture Deep Dive #

Backend Stack #

Immich uses a modern, modular architecture:

// Core API structure
class MediaRepository {
  async upload(userId: string, file: Buffer): Promise<MediaEntity>
  async findByOwner(ownerId: string, page: number): Promise<MediaEntity[]>
  async deleteOrphanedAssets(): Promise<number>
}

class AssetService {
  async processAsset(asset: MediaEntity): Promise<void> {
    await this.faceRecognition.process(asset);
    await this.objectDetection.process(asset);
    await this.thumbnailGeneration.process(asset);
  }
}

The NestJS backend provides:

  • RESTful API with OpenAPI documentation
  • WebSocket support for real-time updates
  • Background job processing with BullMQ
  • File upload handling with multer

Frontend Architecture #

The Flutter mobile app provides native performance on both iOS and Android:

  • Automatic background backup with configurable WiFi/cellular settings
  • Offline-first design with local SQLite cache
  • Smooth scrolling and image loading with progressive JPEG support
  • Widget support for home screen quick access

Storage Strategy #

Immich supports multiple storage backends:

  • Local storage: Direct filesystem access for simple deployments
  • MinIO/S3: Object storage for scalable, distributed setups
  • External drives: Mount-based storage for NAS deployments
# docker-compose.yml storage configuration
services:
  immich-server:
    volumes:
      - /path/to/photos:/mnt/photos
      - /path/thumbs:/tmp/thumbs
  immich-machine-learning:
    volumes:
      - /path/models:/cache

Hands-On Experience #

Installation #

The recommended installation method is Docker Compose:

# Clone the repository
git clone https://github.com/immich-app/immich-docker.git
cd immich-docker

# Create directories
mkdir -p {upload,library,postgres}

# Start services
docker compose up -d

# Access the web interface
open http://localhost:2283

Mobile App Setup #

  1. Install Immich from App Store or Google Play
  2. Point to your server URL
  3. Enable automatic backup with your preferred settings
  4. Choose which albums to sync to the device

AI Feature Configuration #

# Enable face recognition
curl -X PUT http://localhost:2283/api/config/features/face-recognition \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{"enabled": true}'

# Trigger re-indexing
curl -X POST http://localhost:2283/api/admin/tasks/reindex

Comparison with Alternatives #

Feature Immich Nextcloud Photos PhotoPrism Google Photos
Self-hosted
Face Recognition
Object Detection
Mobile App ✅ (Flutter)
API Access ✅ REST ✅ REST ✅ REST ✅ REST
Multi-user
Price Free Free Free $1.99/mo

Docker & Deployment Guide #

Basic Docker Compose #

version: "3.8"
services:
  immich-server:
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION}
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    environment:
      - DB_HOSTNAME=database
      - DB_PASSWORD=${POSTGRES_PASSWORD}
    depends_on:
      - redis
      - database
  
  immich-machine-learning:
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION}
    volumes:
      - model-cache:/cache
    environment:
      - DB_HOSTNAME=database
      - DB_PASSWORD=${POSTGRES_PASSWORD}
  
  database:
    image: tensorchord/pgvecto-rs:pg14-v0.2.0
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
  
  redis:
    image: redis:6

Production Deployment Checklist #

  1. Reverse proxy: Configure Nginx/Caddy with HTTPS
  2. Backup strategy: Regular database and media backups
  3. Monitoring: Health checks and alerting
  4. Scaling: Redis cluster for high-traffic deployments
  5. Storage: RAID configuration for media redundancy

FAQ #

Advanced Configuration #

Custom ML Models #

Immich supports custom machine learning models for face recognition and object detection:

# Upload a custom face recognition model
curl -X POST http://localhost:2283/api/machine-learning/models/upload   -H "Authorization: Bearer YOUR_TOKEN"   -F "model=@custom-face-model.onnx"

# Set as default
curl -X PUT http://localhost:2283/api/config/machine-learning/model   -H "Authorization: Bearer YOUR_TOKEN"   -d '{"model": "custom-face-model"}'

Backup Strategies #

Configure intelligent backup policies to optimize storage and bandwidth:

# Backup configuration
backup:
  # Only backup on WiFi
  network_policy: wifi_only
  
  # Original quality vs compressed
  quality: original
  
  # Backup specific albums only
  selective_backup:
    enabled: true
    albums: ["Family", "Travel", "Pets"]
    
  # Schedule backups
  schedule:
    daily: "02:00"
    weekly_full: "sunday 03:00"

Reverse Proxy Setup #

For production deployments, configure a reverse proxy:

server {
    listen 443 ssl http2;
    server_name photos.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/photos.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/photos.yourdomain.com/privkey.pem;

    location / {
        proxy_pass http://localhost:2283;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # WebSocket support for live sync
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Performance Tuning #

For large libraries (100K+ photos), optimize performance:

# Increase database connection pool
export DB_POOL_SIZE=20

# Enable Redis caching
export REDIS_URL=redis://localhost:6379

# Adjust thumbnail generation
export THUMB_SIZE_SMALL=256
export THUMB_SIZE_MEDIUM=1024
export THUMB_SIZE_LARGE=2048

Shared Albums and Collaboration #

Immich supports collaborative album management:

# Create a shared album
curl -X POST http://localhost:2283/api/albums   -H "Authorization: Bearer YOUR_TOKEN"   -d '{"title": "Summer Vacation", "sharedWith": ["user1@example.com"]}'

# Add photos to shared album
curl -X POST http://localhost:2283/api/albums/abc123/assets   -H "Authorization: Bearer YOUR_TOKEN"   -d '{"assetIds": ["asset1", "asset2", "asset3"]}'

Q: Can Immich replace Google Photos completely? #

A: Yes, for most users. Immich offers automatic backup, face recognition, search, and sharing — all the core Google Photos features, but self-hosted.

Q: How much storage do I need? #

A: Immich stores originals plus thumbnails. For a 10,000 photo library with 4K images, expect ~50-100GB of storage. Thumbnails and AI models add ~5-10GB.

Q: Is it suitable for families? #

A: Absolutely. Immich supports multiple users with shared albums and granular permissions. Each family member gets their own private library plus shared spaces.

Q: Can I migrate from Google Photos? #

A: Yes. Use Google Takeout to download your photos, then import them into Immich. The CLI tool supports bulk imports with metadata preservation.

Q: What ML models does Immich use? #

A: Immich uses YOLO for object detection and custom face recognition models. The machine learning service is containerized and configurable.

How We Collect This Data #

This article’s data was auto-collected by Dibi8 Tribe Intel from GitHub API and trending pages. Star counts, fork counts, and basic metadata are verified via GitHub API. Editorial analysis is conducted by the Dibi8 team.

Join the Community #

Immich is actively developed by a team of 300+ contributors. Join the Discord server for support, feature requests, and community discussions.

Join Our Telegram Group #

Stay updated on the latest AI tools and open-source projects. Join our Telegram Group for daily AI tool recommendations, community discussions, and exclusive content.

More from Dibi8 #


Sources #

  1. GitHub Repository — Official source code and documentation
  2. GitHub API — Star counts, fork counts, and metadata
  3. Official Documentation — User guide and API reference

Disclosure: This article contains no affiliate links. Dibi8 maintains editorial independence from all projects we cover.

Q: Can I use Immich with a Synology NAS? A: Yes! Immich can be deployed on Synology NAS using Docker. The community provides Synology-specific installation guides and Docker Compose configurations optimized for Synology hardware.

Q: How does Immich handle RAW photos? A: Immich supports RAW photo formats (CR2, NEF, ARW, DNG) and stores originals while generating JPEG previews for fast browsing. RAW files can be downloaded in full resolution from the web interface or mobile app.

Storage and Backup Strategies #

Backup Configuration #

Protect your photo library with automated backups:

# Configure automated backup schedule
curl -X PUT http://localhost:2283/api/config/backup   -H "Authorization: Bearer YOUR_TOKEN"   -d '{
    "enabled": true,
    "schedule": "0 3 * * *",
    "destination": "/backup/immich",
    "retention_days": 30
  }'

# Verify backup status
curl -s http://localhost:2283/api/backup/status | jq

Migration Tools #

Moving from Google Photos or other services:

from immich_cli import GooglePhotosImporter

importer = GooglePhotosImporter(
    google_takeout_path="/data/google-takeout/",
    immich_url="http://localhost:2283",
    api_token="YOUR_TOKEN"
)

# Import with metadata preservation
result = importer.import_photos(
    albums=True,
    locations=True,
    faces=True,
    dates=True
)

print(f"Imported {result.photos} photos, {result.albums} albums")

Community and Ecosystem #

Third-Party Integrations #

Immich integrates with many popular tools:

Integration Purpose Setup Difficulty
Home Assistant Smart home photo display Easy
Radarr/Prowlarr Movie library management Medium
Watchtower Auto-update containers Easy
Nginx Proxy Manager Reverse proxy Easy
Prometheus Monitoring Medium

Docker Compose Monitoring #

# Monitoring stack for Immich
services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
  
  grafana:
    image: grafana/grafana:latest
    ports:
      - "3001:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin

Troubleshooting Guide #

Common Issues and Solutions #

# Fix missing thumbnails
curl -X POST http://localhost:2283/api/admin/tasks/regenerate-thumbnails

# Fix face recognition errors
curl -X POST http://localhost:2283/api/admin/tasks/rebuild-face-index

# Check database health
curl -s http://localhost:2283/api/server-info | jq '.database'
Issue Symptom Solution
Backup fails Error in logs Check storage permissions
Slow loading High CPU usage Enable Redis caching
Face errors Missing faces Rebuild face index
Upload fails Disk full Clean temp files
Sync issues Duplicate photos Run deduplication task

Security Best Practices #

# Enable two-factor authentication
curl -X POST http://localhost:2283/api/auth/2fa/setup   -H "Authorization: Bearer YOUR_TOKEN"

# Rotate API tokens regularly
curl -X POST http://localhost:2283/api/admin/tokens/rotate

# Configure IP whitelist
curl -X PUT http://localhost:2283/api/config/security   -d '{"allowed_ips": ["192.168.1.0/24", "10.0.0.0/8"]}'

Security Checklist #

Item Status Action
HTTPS enabled Required Use reverse proxy
2FA enabled Recommended Setup TOTP
API tokens rotated Monthly Auto-rotate
Docker updated Weekly Watchtower
Backups verified Monthly Test restore
Access logs reviewed Weekly Log monitoring

Conclusion #

Immich represents the gold standard in self-hosted photo management. Its combination of powerful features, active development, and strong community support makes it the clear choice for anyone looking to take control of their personal media. Whether you are a privacy advocate, a photographer, or simply tired of subscription fees, Immich delivers a compelling alternative to commercial photo services.

The 106K+ GitHub stars reflect not just popularity but genuine community commitment. With regular updates, extensive documentation, and a growing ecosystem of integrations, Immich is positioned to remain the leading self-hosted photo solution for years to come.

💬 Discussion