Rsync Manager for macOS
Native SwiftUI rsync job manager for macOS 14+.
Features
- Persistent saved sync jobs using SwiftData
- Create, edit, duplicate and delete jobs
- Local/mounted-volume destinations
- SSH remote destinations with custom port and SSH key
- Archive, compression, delete, permissions and extended-attribute options
- One-exclusion-per-line rules
- Additional custom rsync arguments
- Dry-run mode
- Run on demand
- Live rsync output
- Cancel active job
- Permanent run history with full command/stdout/stderr/exit code
- Warning before a live
--deleterun - Automatically prefers
/opt/homebrew/bin/rsync, then/usr/local/bin/rsync, then/usr/bin/rsync
Open and run
Open RsyncManager.xcodeproj in Xcode and press Run.
The app deliberately has App Sandbox disabled because a general rsync utility needs to execute rsync/ssh and access arbitrary source/destination paths. Hardened Runtime remains enabled.
For a current rsync on Apple Silicon:
brew install rsync
SSH authentication works with your normal OpenSSH configuration and keys. If no SSH key is specified on a job, ssh uses its normal configuration in ~/.ssh/config.
macOS requirement
macOS 14 or later (SwiftData).
Automation
Rsync Manager supports per-job scheduling (once, hourly, daily, weekly, monthly and custom minute intervals), a month calendar/agenda, and FSEvents-based file watching. Scheduled and watch-triggered runs are silent and always written to History with their trigger source.
Background automation remains active while the application is running, including when its window is minimised, hidden or closed. The Automation settings include a native macOS Launch at Login option so the scheduler and watchers are available after sign-in. Quitting the application stops its in-process scheduler/watchers until it is launched again.
Production security hardening
This project targets Developer ID signed/notarised direct distribution, not the Mac App Store. Current hardening includes Hardened Runtime, validated rsync executables, protected advanced rsync arguments, non-interactive SSH with timeouts/keepalives, normal SSH host-key verification, private-key/agent authentication only, unattended --delete authorisation, local source/destination overlap protection, sanitised/capped run logs, configurable history retention, a privacy manifest, and persistent-store recovery mode.
See Docs/RELEASE.md and run Scripts/security-check.sh before producing a release archive.