Fast file synchronization. Same mental model as rsync, built in Rust.
cargo install sy# Basic sync
sy /source /destination
# Preview changes
sy /source /destination --dry-run
# Mirror (delete extra files)
sy /source /destination --delete
# Remote sync via SSH
sy /local user@host:/remote
sy user@host:/remote /local- Parallel — uses all cores by default,
-j 1to limit - Delta sync — only transfers changed blocks for large files
- COW support — reflink copies on APFS/Btrfs/XFS
- rsync-compatible flags —
--delete,--exclude,--compress,--progress, etc. - SSH sync — streaming protocol over SSH stdin/stdout
- Integrity — BLAKE3 checksums, xxHash3 verification
sy [OPTIONS] <SOURCE> <DESTINATION>
| Flag | Description |
|---|---|
-n, --dry-run |
Preview changes without applying |
-d, --delete |
Delete files not in source |
-v, --verbose |
Increase verbosity (repeatable) |
-q, --quiet |
Suppress output |
--progress |
Show progress for large files |
--stats |
Show transfer statistics |
--exclude <PATTERN> |
Exclude files matching pattern |
--exclude-from <FILE> |
Read exclude patterns from file |
--include <PATTERN> |
Include files matching pattern (use after --exclude) |
--compress |
Compress transfers (auto-detected) |
-j, --max-concurrent <N> |
Parallel transfers (default: all cores) |
# Mirror mode
sy /source /dest --delete
# Directories only (no recursion)
sy /source /dest --dirs# Push to remote
sy /local user@host:/remote
# Pull from remote
sy user@host:/remote /local
# With SSH timeout
sy /local user@host:/remote --timeout 30# Exclude patterns
sy /source /dest --exclude "*.log" --exclude ".git"
# Exclude from file
sy /source /dest --exclude-from .syignore
# Include specific patterns (after exclude)
sy /source /dest --exclude "*" --include "*.rs"# Backup before overwrite
sy /source /dest --backup
# Custom backup directory
sy /source /dest --backup --backup-dir /backups
# Custom suffix
sy /source /dest --backup --suffix .bak
# Force delete when threshold exceeded
sy /source /dest --delete --force-delete# Verify writes by reading back
sy /source /dest --verify
# Show itemized changes
sy /source /dest --itemize-changes| Feature | Status | Notes |
|---|---|---|
| Local sync (push) | Stable | Fully tested |
| Local sync (pull) | Stable | Fully tested |
| SSH push | Stable | Tested with key-based auth |
| SSH pull | Stable | Tested with key-based auth |
| Delta sync | Stable | xxHash3 block-level diffs |
| Filters (--exclude/--include) | Stable | rsync-style patterns |
| Delete mode (--delete) | Stable | With --max-delete safety threshold |
| Compression | Stable | Auto-detected, zstd |
| Hard links | Stable | Preserved on local sync |
| Symlinks | Stable | Preserved |
| Backup mode (--backup) | Stable | |
| Atomic writes | Stable | Temp file + rename, all paths |
| --bwlimit | Stable | Bandwidth limit in bytes/sec |
| --checksum | Stable | Compares checksums instead of mtime+size |
| --update / --existing | Stable | Comparison modes for selective sync |
| --ignore-times / --ignore-existing | Stable | Force transfer / skip existing |
| --verify | Stable | xxHash3 verify-after-write |
| --partial | Not implemented | |
| --stream | Not implemented | |
| --retry | Not implemented | SSH has internal retry only |
| Bisync | Experimental | Works for simple cases; complex conflict resolution is limited |
| S3/GCS endpoints | Experimental | Code complete, not tested against real infrastructure |
Benchmarks on macOS M3 Max with NVMe storage. Results vary by hardware, file sizes, and workload.
| Scenario | sy | rsync | Speedup |
|---|---|---|---|
| 1000 × 1KB files | 189ms | 237ms | 1.25× |
| 10 × 10MB files | 29ms | 330ms | 11.5× |
| 1 × 100MB file | 38ms | 324ms | 8.6× |
| Incremental (no changes) | 33ms | 63ms | 1.9× |
Run benchmarks yourself:
cargo benchsy reads ~/.config/sy/config.toml for defaults:
max_concurrent = 8
compress = "auto"
exclude = [".git", "node_modules", "*.pyc"]| Feature | sy | rsync |
|---|---|---|
| Local sync speed | Fast (parallel) | Sequential |
| Delta sync | Yes (xxHash3) | Yes (MD4) |
| COW reflinks | Yes | No |
| SSH sync | Yes | Yes |
| Wire protocol | Custom | rsync protocol |
| Incremental | Yes | Yes |
| Compression | zstd | zlib |
sy is not a drop-in rsync replacement. Same mental model, different protocol. For rsync-to-rsync compatibility, use rsync.
See CONTRIBUTING.md for development setup and workflow.
cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --checkSee CHANGELOG.md for release history.
MIT