Back up your iCloud Photos
to your storage

Keep using Photos.app like you always do. Attic quietly backs up your originals and edits to cloud storage you control — on any provider, in any region. One-way, append-only. A safety net, not a second photo manager.

View on GitHub See how it works ↓
brew install tijs/tap/attic

What Attic does

Attic is a command-line tool that backs up your iCloud Photos library to object storage you own. It works with any provider that speaks the S3 protocol — which most do, from small European hosts to the big clouds. It exports original and edited files via PhotoKit and uploads them with full metadata. Incremental by default — it only uploads what's new.

i.

Originals & edits

Exports both the original and the edited version of your photos and videos. No recompression, no quality loss. What you shot — and what you made of it — gets stored.

ii.

Full metadata

Each asset is uploaded alongside a JSON file with EXIF data, dates, location, album membership, dimensions, and file hashes.

iii.

Incremental

A manifest stored in your bucket tracks what's been backed up. Subsequent runs skip known assets and only upload what's changed or new.

iv.

Verifiable

A built-in verify command checks remote objects against the manifest, re-verifying SHA-256 hashes on every file.

attic backup

18 seconds of a real backup run

How it works

Attic is a standalone macOS binary that runs a four-step pipeline. It reads your Photos library directly via PhotoKit, exports originals and edits to a staging area, then uploads everything to the storage bucket you configured.

1

Scan

Reads Photos.sqlite to discover all assets, their types, sizes, and iCloud status.

2

Diff

Compares the database against the manifest to find assets that haven't been backed up yet.

3

Export

Exports original and edited files via PhotoKit to a staging directory.

4

Upload

Uploads each original + metadata JSON to your storage bucket, then updates the manifest.

Credentials

Storage access keys are stored in the macOS Keychain. Never in config files, never in environment variables. The config file only holds the endpoint, region, and bucket name.

iCloud-only assets

If a photo or video isn't downloaded locally, Attic requests it from iCloud via PhotoKit. This means it can back up your entire library, not just what's on disk.

What you need

A Mac

Attic uses Photos.sqlite and the macOS Keychain. It runs on any Mac with a Photos library — your daily driver or a dedicated machine.

Homebrew

Install with brew install tijs/tap/attic. A single binary, no other dependencies needed.

A storage bucket

Any provider that supports the S3 protocol — that's most of them, not just Amazon. Create a bucket, generate API keys, and run attic init to configure.

Your storage, your region

Attic works with any provider that speaks the S3 protocol — an industry standard supported far beyond Amazon. Want your photo backups in the EU? These providers keep your data on European soil.

Honest expectations

It does

  • Back up original and edited photos and videos to your storage
  • Preserve full metadata (EXIF, location, albums, dates)
  • Run incrementally — only upload what's new
  • Verify backups with checksum validation
  • Store credentials in macOS Keychain
  • Fetch iCloud-only assets via PhotoKit
  • Run unattended on a spare Mac

It doesn't

  • × Replace iCloud Photos — it's a backup, not a sync
  • × Have a GUI — it's a command-line tool
  • × Run on Windows or Linux
  • × Require any runtime dependencies
  • × Restore photos into your library
  • × Browse or view your backed-up photos
  • × Manage your storage bucket for you

Commands

Everything runs through the attic command. Set up once, then it's just attic backup and occasionally attic verify.

init Interactive setup. Configures your storage connection and stores credentials in Keychain.
scan Read the Photos library and print stats: asset counts, sizes, types, local vs iCloud-only.
status Compare library against manifest. Shows how many assets are backed up vs pending.
backup Export pending assets and upload originals + metadata to your bucket. Supports --dry-run, --limit, and --type filters.
verify Check remote objects against the manifest and re-verify SHA-256 checksums.

Put that Mac mini to work

Got a Mac mini sitting around after your OpenClaw experiments? Sign into iCloud Photos on it and let Attic run daily backups via launchd. See the unattended backups guide for the full setup.

# crontab -e
# Run backup daily at 3am
0 3 * * * attic backup

# Verify weekly on Sundays
0 4 * * 0 attic verify