Mirror your Mac's Photos library to storage you control — a self-hosted server, a local folder, or a mounted drive. No local database on the client — your server is the single source of truth.
This is a one-way sync, not an archival backup. The server mirrors what's currently in your Photos library — if you delete a photo on your Mac, its copy on the server is removed too (iCloud is untouched either way). If you want a copy that survives you deleting the original, keep that in mind before relying on this as your only backup.
Menu bar popover — live sync progress, counts, pause/resume · Settings — self-hosted FilesNest server · Settings — or sync to a local folder
- Continuous one-way sync of your Mac Photos library, running quietly from the menu bar
- Resumable uploads (TUS protocol) — large files and flaky connections survive interruption
- Streams assets directly, no temp files, no whole-file buffering
- Pause, resume, and trigger manual syncs anytime
- Sync counts, progress, and a clear view of failed items
- Credentials stored in the macOS Keychain, never on disk in plain text
- Point it at any server you host — nothing leaves your infrastructure
- Or skip the server entirely: sync straight to a local folder or mounted drive (external disk, NAS share)
Homebrew (recommended)
brew tap moontechs/files-nest https://github.com/moontechs/files-nest
brew trust moontechs/files-nest
brew install --cask filesnestHomebrew 6 refuses to load casks from non-official taps until you explicitly
trust them, failing with Refusing to load cask ... from untrusted tap. The
brew trust line above clears that for this tap; use
brew trust --cask moontechs/files-nest/filesnest to trust only this one cask
instead. Your choice is recorded in ~/.homebrew/trust.json.
On Homebrew 5.x and older the command doesn't exist (Unknown command: trust)
and nothing enforces trust — skip that line and tap/install directly.
Direct download
Grab the latest signed and notarized .dmg from Releases.
Requires macOS 14+.
A single static Go binary. Easiest path: Docker Compose.
-
Download
docker-compose.ymlandCaddyfileinto a folder on your server. -
Set your domain and credentials, then start it:
DOMAIN=backup.example.com \ BACKUP_USER=admin \ BACKUP_PASS=changeme \ docker compose up -d
This runs the server plus Caddy with automatic HTTPS (Let's Encrypt). Point the macOS app's Settings at https://backup.example.com with the same credentials.
Running on a NAS/home-server platform that already terminates TLS for you
(Umbrel, ZimaOS, TrueNAS, Unraid)? Use
docker-compose.prebuilt.yml instead —
just the FilesNest server pulled from GHCR, no Caddy, no host port 80/443,
listening on 8080 for the platform's own reverse proxy.
No public domain, bare-metal install, and full config reference: server/README.md.
The macOS app streams photos and videos straight from your Photos library to your server over resumable HTTP uploads. It keeps no local database — every sync decision is made by asking the server what it already has. Full architecture: docs/architecture.md.


