macOS · BUN · OPENSSH

Park a folder.
Every save is already remote.

Valet-style SFTP auto-sync. Watch ~/Sites, reuse one SSH tunnel, and upload only the bytes that actually changed.

sftp-autosync start

$ 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

One tunnel. Every path.

Longest matching local prefix wins. Everything else maps under remotePath. Same host, user, and key share one ControlMaster socket.

Local
~/Sites/my-app
Remote
/var/www/my-app
Local
~/Sites/my-app/shared-assets
Remote
/var/www/shared-assets

ControlMaster socket reused · ~/Library/Caches/sftp-autosync/cm

HOW IT WORKS

Three commands. Then forget it exists.

Park a parent folder. Every child with a sync config is watched and uploaded over OpenSSH ControlMaster.

01

sftp-autosync init

Park ~/Sites, write global config, optionally install a launchd daemon that starts at login.

02

sftp-autosync setup

Point a project at host, key, and remote path. Seed hashes if it is already in sync.

03

sftp-autosync start

The watcher debounce-coalesces saves and uploads only files whose SHA-256 changed.

1

ControlMaster reuse

One SSH socket per host/user/key. Projects and split routes share it.

2

Content fingerprints

SHA-256 after every successful upload. Same-content IDE rewrites never hit the remote.

3

launchd at login

Install the daemon from init. Logs land in ~/Library/Logs/sftp-autosync.

4

Split folder routing

Longest local prefix wins. Shared assets can live outside the project remote.

5

macOS notifications

Always on failure. Optional slow-op and success alerts.

6

Sensible ignores

.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

Install once. Park forever.

$ bun install -g sftp-autosync
$ npm install -g sftp-autosync
$ brew tap ahp-sooyaa/sftp-autosync && brew install --HEAD sftp-autosync
Get started on GitHub View docs