commit fb05cf71ed7fd67fe996d9bec5493edbbade2b76 Author: Mark Gregory Date: Tue Sep 8 20:06:42 2026 +0100 Initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..c6741ac --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +# 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`.