sftp-autosync init
Park ~/Sites, write global config, optionally install a launchd daemon that starts at login.
$ sftp-autosync start
[watch] add project ~/Sites/my-app
[watch] add project ~/Sites/docs
[ok] my-app/index.html 42ms
[ok] my-app/styles.css 18ms
[ok] docs/readme.md 11ms
[skip] my-app/index.html unchanged
[ok] my-app/api/route.ts 27ms
▌
SPLIT FOLDER ROUTING
Longest matching local prefix wins. Everything else maps under remotePath. Same host, user, and key share one ControlMaster socket.
Park a parent folder. Every child with a sync config is watched and uploaded over OpenSSH ControlMaster.
Park ~/Sites, write global config, optionally install a launchd daemon that starts at login.
Point a project at host, key, and remote path. Seed hashes if it is already in sync.
The watcher debounce-coalesces saves and uploads only files whose SHA-256 changed.
One SSH socket per host/user/key. Projects and split routes share it.
SHA-256 after every successful upload. Same-content IDE rewrites never hit the remote.
Install the daemon from init. Logs land in ~/Library/Logs/sftp-autosync.
Longest local prefix wins. Shared assets can live outside the project remote.
Always on failure. Optional slow-op and success alerts.
.git, node_modules, .DS_Store, .sftp-autosync, tmp and swap files.
1
daemon, many projects
0
extra SSH tunnels
0
package dependencies
SHA-256
skip unchanged bytes
login
start with launchd
GET IT RUNNING
bun install -g sftp-autosync
npm install -g sftp-autosync
brew tap ahp-sooyaa/sftp-autosync && brew install --HEAD sftp-autosync