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.
$ 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.
> 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.
Favorites
Locations
| Name | Date Modified | Size | Kind |
|---|---|---|---|
| ▼reports | Today at 14:0314:03 | -- | Folder |
| latency.png | Today at 14:0314:03 | 152 KB | PNG image |
| trace-0930.parquet | 30 Sep 2026 at 22:4130 Sep | 41.2 MB | Document |
| ▼src | Today at 14:0214:02 | -- | Folder |
| ▼api | Today at 14:0214:02 | -- | Folder |
| invoices.py | Today at 14:0214:02 | 3 KB | Python Script |
| ▼tests | Today at 14:0214:02 | -- | Folder |
| test_invoices_export.py | Today at 14:0214:02 | 1 KB | Python Script |
| pyproject.toml | Yesterday at 18:22Yesterday | 1 KB | TOML |
| README.md | 12 Sep 2026 at 09:1412 Sep | 4 KB | Markdown |
Click a row. ↑ ↓ move, Space opens Quick Look. The cloud marks a file whose contents are still on dev-box.
- 14:01:58watching~/
api 1,214 entries - 14:02:09IN_MOVED_TOsrc/
api/ 2,917 Batomic save: rename over invoices.py.tmpinvoices.py - 14:02:19IN_CLOSE_WRITEtests/
test_invoices_export.py 1,388 B - 14:02:24IN_CLOSE_WRITE.pytest_cache/
v/ 214 Bdotfile: synced, hidden in Findercache/ nodeids - 14:03:02IN_CLOSE_WRITEreports/
latency.png 151,552 B - 14:03:02prefetchreports/
latency.png ≤ 256 KiBread requested by the Mac: the folder is open in Finder, so small files come along
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.
- VMstep 1
In the folder you want to see, run:
$ cd ~/api && npx unlatchfs shareIt 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.
- 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.
- Linuxdesktop
No Finder? Add
--mountfor a FUSE mount instead.$ npx unlatchfs connect 'you@dev-box:~/api' --mount ~/dev-box
- VMagent
Paste this into Claude Code or Codex running on the VM:
> Set up Unlatch so I can browse this machine in Finder: https://unlatchfs.dev/SKILL.md
The agent reads SKILL.md, runs
npx -y unlatchfs share --jsonand replies with one line. It never asks for a password or a key, and it never opens a port. - Macyou
Run the line the agent gave you in Terminal on your Mac. That is the whole install.
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.
Measured next to sshfs, on the same shaped link.
ls -la of a 1,000-file folderThe first listing after mounting. Unlatch's folder tree is already synced by then, which is the design; sshfs starts with an empty cache.
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.
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.
A file never opened before. One round trip is 40 ms, so this is close to the floor.
While a large download and upload share the link. Unlatch: the worse of a ping and a folder listing; sshfs: an uncached lstat.
ls -la, 1,000 files: sshfs is fasterOnce its cache is warm, sshfs lists faster. Local disk on the same box: 10.6 ms.
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.pngand press Space.Drag a log into a thread.
Pull
logs/run-0412.txtout 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.
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.
What you might use today.
Scroll the table sideways →
| Unlatch | sshfs | Mountain Duck | VS Code / Cursor Remote-SSH | |
|---|---|---|---|---|
| Where the files show up | Finder sidebar, under Locations | A mount point (on macOS via macFUSE3) | Finder1 | Inside the editor2 |
| How VM changes reach you | Pushed as they happen (inotify over ssh) | Folder listings cached, 20 s by default4 | Re-checks open folders about once a minute1 | A server runs on the VM2 |
| Quick Look, Preview, drag to Slack | Yes | Yes, as a mounted folder | not checked | Not from Finder. Files stay in the editor2 |
First ls -la, 1,000 files, 40 ms RTT | 23.2 ms | 329 ms | not measured | not measured |
| License | MIT OR Apache-2.0 | see project | see vendor | see vendor |
- Mountain Duck interface docs: docs.cyberduck.io/mountainduck/interface/
- VS Code Remote-SSH docs: code.visualstudio.com/docs/remote/ssh
- macFUSE: macfuse.github.io
- 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.
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.
$ npx unlatchfs> Set up Unlatch so I can browse this machine in Finder: https://unlatchfs.dev/SKILL.md