A lightweight, native Windows system tray application that watches folders for new photos and videos and automatically uploads them to your Immich server.
Install it, point it at your server, forget it exists.
Immich has 84K+ GitHub stars and a thriving community, but no official desktop sync client. The existing options are CLI scripts, janky Python wrappers, or closed-source tools. ImmichSync fills the gap: a native Windows app that sits in your system tray and Just Works.
- Zero friction — watches your Pictures folder by default
- Handles everything — local folders, network shares, USB drives, SD cards
- Smart uploads — deduplication, retry with backoff, bandwidth throttling
- Tiny footprint — pure Rust, ~5MB binary, no runtime dependencies
- Set and forget — starts with Windows, syncs in the background
- Folder watching — recursive filesystem monitoring via
ReadDirectoryChangesW - Network share support — automatic fallback to polling when native watching fails
- Removable device detection — auto-detect USB drives and SD cards with DCIM folders
- Upload queue — persistent, crash-resistant, with configurable concurrency
- SHA-1 deduplication — matches Immich's internal checksum, saves bandwidth
- Album auto-creation — organize by folder name, date, or custom album
- EXIF-aware — extracts photo dates for accurate timestamps
- Encrypted API key storage — secured via Windows DPAPI
- System tray — status icons, pause/resume, upload progress
- Settings UI — clean configuration window built with egui
- Auto-start — optional Windows startup via registry
Grab the latest release from GitHub Releases.
Run the installer or extract the portable ZIP. That's it.
Prerequisites:
- Rust (stable, 1.75+)
- Windows 10 or 11
git clone https://github.com/gumbees/immichsync.git
cd immichsync
cargo build --releaseThe binary lands in target/release/immichsync.exe.
- Launch ImmichSync — it appears in your system tray
- Right-click the tray icon → Settings
- Enter your Immich server URL and API key
- Click Test Connection to verify
- Your Pictures folder is watched by default — add more folders if needed
- Close settings — ImmichSync is now syncing
- Open your Immich web interface
- Go to User Settings → API Keys
- Click New API Key, give it a name, copy the key
Settings are stored in %APPDATA%\bees-roadhouse\immichsync\config.toml. You can edit this directly or use the Settings UI.
[server]
url = "https://immich.example.com"
api_key = "encrypted:base64..."
[upload]
concurrency = 2
bandwidth_limit_kbps = 0 # 0 = unlimited
order = "newest_first"
max_retries = 5
[devices]
auto_watch = true
look_for_dcim = true
on_insert = "auto" # "auto" | "ask" | "ignore"
[ui]
start_with_windows = true
minimize_to_tray = true
show_notifications = trueImages: jpg, jpeg, png, gif, webp, heic, heif, avif, tiff, bmp, raw, cr2, cr3, nef, arw, dng, orf, rw2, pef, srw, raf
Videos: mp4, mov, avi, mkv, webm, m4v, 3gp, mts, m2ts
Custom include/exclude patterns are configurable per watch folder.
See ARCHITECTURE.md for the full technical design.
Key components:
- Watch Engine —
notifycrate withReadDirectoryChangesW, poll fallback for network shares - Device Monitor — Win32
WM_DEVICECHANGEfor USB/SD card detection - Upload Pipeline — async Tokio workers with persistent queue
- State Database — SQLite via
rusqlite(bundled) - UI —
tray-icon+eguifor system tray and settings window
Contributions are welcome. See PLAN.md for the implementation roadmap and open tasks.
- Fork the repo
- Create a feature branch (
git checkout -b feature/my-feature) - Commit your changes
- Push and open a PR
Please keep PRs focused — one feature or fix per PR.
ImmichSync is free and open source. If it saves you time, consider supporting development:
GPL-3.0-only — see LICENSE for details.
- Immich — the excellent self-hosted photo platform this syncs to
- The Rust ecosystem —
notify,tokio,reqwest,egui,rusqlite, and all the crates that make this possible