UNLATCH(1)
pre-release GitHub
Nameunlatch(1)

unlatch - your cloud VM's files in macOS Finder, as snappy as a local folder

Your VM,
in Finder.

Your agent writes files on a VM in the cloud. Unlatch puts that folder in your Finder sidebar, so you can open, preview and drag what it made as soon as it lands. Built for people who run Claude Code and Codex on remote VMs.

Run in a terminalVM or Mac
$ npx unlatchfs

On the VM it shares the folder and prints the line for your Mac. On the Mac it lists the hosts in your ~/.ssh/config.

Or paste into Claude Code or Codex on the VMSKILL.md
> Set up Unlatch so I can browse this machine in Finder: https://unlatchfs.dev/SKILL.md

The agent runs the VM side and hands you one line for your Mac.

pre-release on npm · unlatchfs MIT OR Apache-2.0 macOS 13+ · Linux VM · your ssh
fig. 1a  your Mac, Finder › Locations › dev-boxillustration · not a recording

Favorites

Recents
Desktop
Downloads

Locations

dev-box
Network
api Up to date
dev-box › api › reports › latency.png

Click a row. ↑ ↓ move, Space opens Quick Look. The cloud marks a file whose contents are still on dev-box.

fig. 1b  the same minute on dev-box. The agent writes. The daemon sees each inotify event and pushes it over ssh. Finder lists the file from the Mac's replica. illustration · not a recording
ssh dev-box · ~/api · claude
you@dev-box:~/api$ claude
> add an /invoices export endpoint and a
test, then plot p95 latency to reports/
● Write(src/api/invoices.py)
└ wrote 84 lines
● Write(tests/test_invoices_export.py)
└ wrote 41 lines
● Bash(pytest -q tests/)
└ 3 passed in 0.82s
● Bash(python scripts/plot_latency.py)
└ wrote reports/latency.png
● Done. Endpoint, test and chart are in.
daemon on dev-box · inotify on ~/api→ 1 ssh connection
  1. 14:01:58watching~/api1,214 entries
  2. 14:02:09IN_MOVED_TOsrc/api/invoices.py2,917 Batomic save: rename over invoices.py.tmp
  3. 14:02:19IN_CLOSE_WRITEtests/test_invoices_export.py1,388 B
  4. 14:02:24IN_CLOSE_WRITE.pytest_cache/v/cache/nodeids214 Bdotfile: synced, hidden in Finder
  5. 14:03:02IN_CLOSE_WRITEreports/latency.png151,552 B
  6. 14:03:02prefetchreports/latency.png≤ 256 KiBread requested by the Mac: the folder is open in Finder, so small files come along
inotify here. On NFS, or past the watch limit, the daemon polls instead.
Installtwo lines, two machines

One line on the VM. One line on your Mac.

The VM side looks at the folder and tells you what to type on the Mac. Nothing to configure on the VM.

  1. VMstep 1

    In the folder you want to see, run:

    $ cd ~/api && npx unlatchfs share

    It checks inotify limits and free disk, then prints the line for your Mac. On a cloud VM behind NAT it looks up the public address. If it cannot tell how your Mac reaches the VM, it says so and leaves a spot for the host you ssh to.

  2. Macstep 2

    Paste the line it printed. It looks like this:

    $ npx unlatchfs connect 'you@dev-box:~/api'

    The first run installs the Unlatch app and may ask you to allow it in System Settings › Login Items. Then dev-box shows up in Finder under Locations.

  3. Linuxdesktop

    No Finder? Add --mount for a FUSE mount instead.

    $ npx unlatchfs connect 'you@dev-box:~/api' --mount ~/dev-box
MacmacOS 13 or later
VMLinux, reachable by ssh, with inotify
BothNode, only to run npx
Descriptionhow it works

The VM pushes. Your Mac already has the tree.

Network drives feel slow because every listing waits for a round trip. Unlatch keeps the whole folder tree on your Mac and lets the VM tell it what changed.

The daemon watches

A small Rust daemon on the VM indexes the folder and watches it with inotify. On a network filesystem, or for folders beyond the VM's inotify watch limit, it falls back to polling every 1–30 s, and npx unlatchfs doctor tells you when.

One ssh connection

Every change is pushed over a single ssh connection, using your ~/.ssh/config, agent, ProxyJump and Tailscale. No ports are opened.

Listing never waits

Your Mac keeps a local replica of the whole folder tree. Opening a folder in Finder is a local lookup. Heavy folders such as node_modules and .git are listed the first time you open them.

Contents on demand

A file downloads the first time you open it. Small files are fetched ahead when you look at their folder. Saves go straight back.

Benchmarksvs sshfs

Measured next to sshfs, on the same shaped link.

bench/results/SCORECARD.md · profile rtt40-bw50 · 1 Oct 2026 preliminary
First ls -la of a 1,000-file folder
unlatch
23.2 ms
sshfs
329 ms
14.2×vs sshfs

The first listing after mounting. Unlatch's folder tree is already synced by then, which is the design; sshfs starts with an empty cache.

A change on the VM becomes visible (p50)
unlatch
22.8 ms
sshfs
41.0 ms
1.8×vs sshfs

From the write on the VM until the client-side engine (on Linux here) has the file. sshfs here polls stat on the exact path. Its folder listings sit behind a 20 s directory cache, which quick mode does not measure.

Initial sync of a 100k-file tree
unlatch
1.18 s
sshfs
~338 s
~287.4×not like-for-like

Until the tree is known on the client. Unlatch's figure covers the 101,006 entries outside heavy folders; the 30,007 inside node_modules, .git and the like are listed when first opened. The sshfs figure is a walk of all 131,013 entries, extrapolated from 8 s, so the ratio overstates the gap.

Cold open of a 4 KiB file
unlatch
42.3 ms
sshfs
124 ms
2.9×vs sshfs

A file never opened before. One round trip is 40 ms, so this is close to the floor.

p99 metadata request during a big transfer
unlatch
89.1 ms
sshfs
1,597 ms
17.9×vs sshfs

While a large download and upload share the link. Unlatch: the worse of a ping and a folder listing; sshfs: an uncached lstat.

Warm ls -la, 1,000 files: sshfs is faster
unlatch
10.4 ms
sshfs
6.93 ms
0.7×sshfs wins

Once its cache is warm, sshfs lists faster. Local disk on the same box: 10.6 ms.

Exampleswhat you can do

It is a real Finder location. Every Mac app can use it.

Apple's File Provider puts the VM folder in your Finder sidebar. Anything that works with a folder works with it. Your editor stays where it is.

  • Quick Look what the agent made.

    Select reports/latency.png and press Space.

  • Drag a log into a thread.

    Pull logs/run-0412.txt out of Finder. It is a normal file.

  • Open it in Preview.

    A PDF in Preview, a CSV in Numbers, an SVG in your browser.

  • Copy to and from your Desktop.

    Paste into dev-box and the save goes straight back to the VM.

Securitywhat it touches

It rides the ssh you already trust.

no open ports
Unlatch opens no listening port on either machine. Everything goes through one session started by your system ssh.
no stored secrets
Unlatch never stores passwords, passphrases or keys. With key-based ssh nothing is asked. If your ssh needs a password, a 2FA code or trust in a new host key, the Mac app shows ssh's own prompt when you connect. Background reconnects never prompt.
VM = untrusted input
Symlinks cannot reach outside the shared folder. Executable bits are hidden by default.
conflict copies
If you and the agent change the same file, you get a conflict copy next to it. Nothing is overwritten silently.
sha256-verified
The daemon binary is checked against its SHA-256 before it runs on the VM.
See alsoother ways in

What you might use today.

Scroll the table sideways →

UnlatchsshfsMountain DuckVS Code / Cursor Remote-SSH
Where the files show upFinder sidebar, under LocationsA mount point (on macOS via macFUSE3)Finder1Inside the editor2
How VM changes reach youPushed as they happen (inotify over ssh)Folder listings cached, 20 s by default4Re-checks open folders about once a minute1A server runs on the VM2
Quick Look, Preview, drag to SlackYesYes, as a mounted foldernot checkedNot from Finder. Files stay in the editor2
First ls -la, 1,000 files, 40 ms RTT23.2 ms329 msnot measurednot measured
LicenseMIT OR Apache-2.0see projectsee vendorsee vendor
  1. Mountain Duck interface docs: docs.cyberduck.io/mountainduck/interface/
  2. VS Code Remote-SSH docs: code.visualstudio.com/docs/remote/ssh
  3. macFUSE: macfuse.github.io
  4. sshfs manual, dcache_timeout: github.com/libfuse/sshfs

If you live in one editor all day, Remote-SSH is a good fit. Unlatch is for everything outside it.

Questionsyou might have

Questions you might have.

Can I use it today?

Yes — it is an early pre-release, open source at github.com/sudhanshuheda/unlatch (open source). The VM daemon and Linux client install from npm as unlatchfs; the macOS app builds from source for now, with a signed release to come.

Does it download my whole repo?

No. Names, sizes and dates sync up front; heavy folders such as node_modules and .git are listed when you first open them. A file's contents download when you open it. Small files are fetched ahead when you look at their folder.

Does it work with Tailscale or a bastion host?

If ssh dev-box works from your Mac, Unlatch can use it. It reads your ~/.ssh/config, agent and ProxyJump.

What if my agent and I edit the same file?

You get a conflict copy next to the file. Neither version is lost.

My folder is on NFS. Does it work?

Yes, with polling. inotify does not see changes that other machines make on a network filesystem, so the daemon polls there.

Who makes it?

It is a personal open-source project, MIT OR Apache-2.0. It is not affiliated with any company.

Your VM, in Finder.

Run in a terminalVM or Mac
$ npx unlatchfs
Or paste into Claude Code or Codex on the VMSKILL.md
> Set up Unlatch so I can browse this machine in Finder: https://unlatchfs.dev/SKILL.md
pre-release GitHub (open source) SKILL.md · llms.txt