Skip to content

Native macOS app that syncs your iCloud Photos library to a self-hosted Immich server. Ledger-backed one-time upload guarantee.

License

Notifications You must be signed in to change notification settings

bytePatrol/Immich-iCloud

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

11 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Immich-iCloud

Immich-iCloud

The ultimate bridge between iCloud Photos and your self-hosted Immich server.
One-time uploads. Zero duplicates. Complete control.

Release macOS 14+ Swift 5.10 License

Features β€’ Installation β€’ Quick Start β€’ Screenshots β€’ Build


Why Immich-iCloud?

If you self-host Immich but your primary photo library lives in iCloud Photos, you need a reliable bridge. Immich-iCloud is that bridge β€” a native macOS app that reads your Photos library via PhotoKit and uploads every photo and video to your Immich server.

The One-Time Upload Guarantee

At its core, Immich-iCloud maintains a local SQLite ledger that tracks every upload by both asset ID and SHA-256 content fingerprint. Once an asset is recorded as uploaded, it will never be uploaded again β€” even if you:

  • Delete it from Immich
  • Reinstall the app
  • Move to a new Mac (with ledger backup)
  • Have duplicate files with different names

This isn't just a feature β€” it's the foundational promise of the entire application.


Screenshots

Dashboard
Dashboard β€” At-a-glance view of your sync status, server connection, and library statistics

View All Screenshots

Sync
Sync β€” Start, monitor, and control sync operations with real-time progress

History
History β€” View all-time statistics and detailed sync session history

Preview
Preview β€” Browse and explore your Photos library before syncing

Logs
Logs β€” Detailed event logging for troubleshooting and monitoring

Settings
Settings β€” Configure server, sync options, filters, and data management


Features

Sync Engine

Feature Description
One-Time Upload Every asset uploads exactly once, tracked by local ID and SHA-256 fingerprint
Dry Run Mode Simulate syncs without uploading β€” see exactly what would happen first
Checkpoint & Resume Interrupted syncs save progress automatically; resume from where you left off
Concurrent Uploads Upload 1-5 assets simultaneously for faster syncs
Exponential Backoff Failed uploads retry with intelligent delays (1s β†’ 2s β†’ 4s... up to 30s)

Smart Filtering

Feature Description
Start Date Filter Only sync assets created after a specific date
Media Type Filter Sync photos only, videos only, or both
Favorites Only Restrict sync to your favorite assets
Album Filtering Include specific albums, exclude albums, or sync from a single album
Shared Albums Support for iCloud Shared Albums

Selective Sync

Choose exactly which assets to sync with the Selective Sync feature:

  • Browse your library with thumbnail previews
  • Select individual assets or entire groups
  • Persist selections across app restarts
  • Perfect for curated uploads

Album Sync to Immich

Create and manage albums on your Immich server:

  • Map local albums to Immich albums
  • Auto-create albums on Immich when syncing
  • Support for Smart Albums and Shared Albums
  • Sync album membership along with assets

Two-Way Reconciliation

Keep your ledger and Immich server in sync:

  • Orphaned Assets β€” Find assets on Immich not in your ledger
  • Missing Assets β€” Detect ledger entries deleted from Immich
  • Checksum Mismatches β€” Identify content differences between local and server
  • Batch delete orphaned assets directly from the app

Conflict Resolution

Handle sync conflicts intelligently:

  • Automatic conflict detection during reconciliation
  • Review conflicts with detailed comparison views
  • Multiple resolution strategies (keep local, keep server, skip)
  • Track resolved vs. unresolved conflicts

Automatic Sync

Feature Description
Scheduled Sync Auto-sync at configurable intervals (15 min to 24 hours)
Wake Sync Automatically syncs when your Mac wakes from sleep
Launch Sync Syncs on app launch with network reconnection delay
Pause/Resume Temporarily pause scheduling without disabling it

Database Management (v2.1.0)

Feature Description
Custom Location Store your database in Dropbox, iCloud Drive, or any folder
Multi-Mac Support Share ledger across Macs via cloud-synced folders
Automatic Snapshots Hourly backups with smart retention (2 hourly + 1 daily)
Snapshot Restore Roll back to any snapshot with one click
WAL Checkpoint Database integrity ensured on app quit for cloud sync safety

Native macOS Experience

  • SwiftUI Interface β€” Modern, native look with full dark mode support
  • Menu Bar Icon β€” Quick-glance sync status (idle, syncing, error)
  • Dock Badge β€” Live upload count during sync
  • Notifications β€” Alerts on sync complete or failure
  • Keyboard Shortcuts β€” Full keyboard navigation (Cmd+1-6, Cmd+Shift+S, Cmd+?)
  • Help Guide β€” Comprehensive 14-section guide with search and troubleshooting

Security & Privacy

Feature Description
Keychain Storage API keys stored securely in macOS Keychain
HTTPS Only All communication via encrypted connections
Zero Telemetry No data sent anywhere except your Immich server
Local Ledger All sync state stored locally β€” you own your data

Installation

Download

  1. Go to Releases
  2. Download Immich-iCloud-2.1.0.dmg
  3. Open the DMG and drag Immich-iCloud to Applications
  4. Launch from Applications (or Spotlight)

macOS Gatekeeper Notice

This app is not signed with an Apple Developer certificate. When you first open it, macOS Gatekeeper will display an error saying the app is "damaged" or "can't be opened." This is normal and expected.

To fix this (one-time setup):

  1. Open System Settings β†’ Privacy & Security
  2. Scroll down to the Security section
  3. You'll see a message about "Immich-iCloud" being blocked
  4. Click Open Anyway
  5. Confirm by clicking Open in the dialog

The app will open normally after this one-time step.

Requirements


Quick Start

  1. Launch the app β€” The onboarding wizard guides you through setup
  2. Connect to Immich β€” Enter your server URL and API key
  3. Grant Photos access β€” Allow access to your Photos library when prompted
  4. Dry Run first β€” Enabled by default; preview what would sync
  5. Sync for real β€” Disable Dry Run and start uploading

Tip: Use Cmd+? anytime to open the comprehensive Help Guide.


Ledger Guarantees

The ledger is the heart of Immich-iCloud's safety model:

Guarantee Description
Upload Once Once marked uploaded, an asset is permanently recorded
Fingerprint Dedup SHA-256 hashing catches duplicate content across different files
Authoritative Ledger The ledger β€” not Immich β€” determines upload status
Failure Safe Failed uploads never overwrite successful records
Lookup Failure = Skip If ledger lookup fails, the asset is skipped (never risk duplicates)

Keyboard Shortcuts

Shortcut Action
Cmd+1 – Cmd+6 Navigate between main tabs
Cmd+Shift+S Start Sync
Cmd+. Cancel Sync
Cmd+R Refresh current view
Cmd+? Open Help Guide
Esc Close sheets/dialogs

Migration & Backup

Moving to a New Mac

  1. Old Mac: Settings β†’ Data Management β†’ Export Ledger + Settings
  2. Transfer the .immich-icloud-backup file to your new Mac
  3. New Mac: Settings β†’ Data Management β†’ Import Ledger + Settings
  4. Re-enter your API key (keys stay in Keychain, never exported)

Multi-Mac Setup (v2.1.0)

  1. Settings β†’ Database Location β†’ Set Custom Location
  2. Choose a cloud-synced folder (Dropbox, iCloud Drive, OneDrive)
  3. Restart the app
  4. On other Macs, point to the same folder

Important: Don't run the app on multiple Macs simultaneously with a shared database.


Building from Source

Prerequisites

  • Xcode 16.0+
  • XcodeGen β€” brew install xcodegen

Build

# Clone the repository
git clone https://github.com/bytePatrol/Immich-iCloud.git
cd Immich-iCloud

# Generate Xcode project
xcodegen generate

# Build
xcodebuild -project Immich-iCloud.xcodeproj -scheme Immich-iCloud -configuration Release build

# Run tests (52 tests)
xcodebuild -project Immich-iCloud.xcodeproj -scheme Immich-iCloud test

Create DMG

./Scripts/build_dmg.sh

Architecture

Layer Technology
UI SwiftUI + NavigationSplitView, @Observable (macOS 14+)
State AppState singleton via .environment()
Database GRDB + SQLite (WAL mode)
Photos PhotoKit (PHAsset, PHAssetResource)
Networking URLSession with multipart uploads
Security macOS Keychain via Security framework
Concurrency Swift async/await + TaskGroup
Updates GitHub Releases API

Project Structure

Immich-iCloud/
β”œβ”€β”€ App/                    # Entry point, AppDelegate, MenuBar, Commands
β”œβ”€β”€ Core/                   # AppConfig, FilterConfig, Models
β”œβ”€β”€ Database/               # GRDB ledger, migrations, snapshots
β”œβ”€β”€ Services/               # ImmichClient, PhotoKit, Keychain
β”œβ”€β”€ Sync/                   # SyncEngine, Scheduler, Retry, Checkpoint
β”œβ”€β”€ UI/                     # All SwiftUI views
β”‚   β”œβ”€β”€ Components/         # Reusable UI components
β”‚   └── Onboarding/         # Setup wizard
└── Utilities/              # Logger, Errors

Immich-iCloudTests/         # 52 unit tests
Scripts/                    # Build and release scripts

Contributing

Contributions are welcome! Please feel free to submit issues and pull requests.


License

MIT License. See LICENSE for details.


Made with care for the Immich community.

Download β€’ Report Bug β€’ Request Feature

About

Native macOS app that syncs your iCloud Photos library to a self-hosted Immich server. Ledger-backed one-time upload guarantee.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •