58 lines
3.3 KiB
Markdown
58 lines
3.3 KiB
Markdown
# Rsync Studio 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 `--delete` run
|
|
- Automatically prefers `/opt/homebrew/bin/rsync`, then `/usr/local/bin/rsync`, then `/usr/bin/rsync`
|
|
|
|
## Open and run
|
|
|
|
Open `Rsync Studio.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 Studio 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.
|
|
|
|
|
|
## Professional reliability features
|
|
|
|
The production build includes job preflight health checks, destination-volume identity protection, minimum-free-space checks, network-aware remote queues, automatic retries for scheduled/watch runs, native failure/success notifications, coalesced FSEvents watching, system-sleep prevention while rsync is active, cancellable Sync All batches, versioned job configuration import/export, filtered/exportable history, diagnostics export, and a signed-manifest update checker. SSH key paths are not exported in job backups.
|
|
|
|
## Commercial direct-distribution build
|
|
|
|
On the release Mac, `Scripts/release.sh` creates the Developer ID signed, notarized and stapled DMG plus its SHA-256 checksum. The script never publishes automatically. See `Docs/COMMERCIAL_RELEASE_STAGE2.md`.
|