kei copies cloud-hosted photos and videos into folders you control. Today that includes iCloud Photos. The goal is a fast, parallel local backup you can run once, keep as a mirror, or leave unattended in Docker.
It handles the parts that make photo backups annoying: big libraries, shared libraries, albums, Live Photos, RAW files, edited versions, retries, interrupted downloads, and existing archives you don't want to download twice.
Warning
kei is pre-release software. Minor versions may contain breaking changes.
Read CHANGELOG.md before updating.
brew install rhoopr/kei/keidocker pull ghcr.io/rhoopr/kei:latestPre-built binaries for macOS, Linux, and Windows are on the Releases page. For Docker Compose, source builds, FreeBSD, and NAS setup, see Install.
Important
v0.20 moved durable sync settings into TOML.
Keep CLI flags for one run, env vars for secrets and service glue, and saved settings in config.toml.
If an old command fails with a removed flag such as --download-dir, move that value into the config file:
[download]
directory = "/photos"Use the v0.20 migration guide and example.config.toml for the full map.
kei config setup
kei syncThe setup wizard creates ~/.config/kei/config.toml, asks where photos should land, and can save your password in the OS keyring. You'll still approve 2FA on a trusted Apple device the first time.
A tiny config looks like this:
[auth]
username = "you@example.com"
[download]
directory = "~/Photos/iCloud"After the first run:
kei status
kei sync --recent 30d
kei list albums- Fast, parallel downloads for large cloud photo libraries.
- A local copy of your media, with no Apple Photos library required.
- Folder layouts for dates, albums, smart folders, shared libraries, and unfiled photos.
- Original photos and videos, plus Live Photos, RAW siblings, and edited versions when you ask for them.
- Resumable downloads and checksum checks before files are marked complete.
- One-shot sync, watch mode, Docker, systemd, launchd, and Windows service support.
- Maintenance commands for status checks, verification, reconcile, reset, and existing-file import.
Today kei syncs iCloud Photos. Immich, Google Takeout, Nextcloud, and Ente support are on the roadmap.
Important
kei needs iCloud Photos web access. If Advanced Data Protection is on, turn it off and enable "Access iCloud Data on the Web" in your Apple ID settings. See Authentication.
kei is built around reliable local backup: safe file writes, explainable state, service-friendly operation, and no destructive behavior unless you explicitly ask for it.
Read the product charter and roadmap for current priorities.
[auth]
username = "you@example.com"
[download]
directory = "/photos"
[watch]
interval = 86400Run it with kei service run, Docker Compose, or kei install.
[filters]
albums = ["Family", "Trips"]
unfiled = false
media = ["photos", "videos", "live-photos"]You can also sync recent media for one run:
kei sync --recent 100
kei sync --recent 30dkei import-existing
kei syncComing from icloudpd? Read Migrating from icloudpd.
- Install
- Configuration
- Docker
- Service mode
- Commands
- Credentials
- Troubleshooting
- Product charter
- Roadmap
Open an issue for bugs or sharp edges: Issues
MIT - see LICENSE
kei's iCloud support builds on reverse-engineering from icloud-photos-downloader. kei was originally published as icloudpd-rs before broadening beyond iCloud Photos.