POSIX Mount
The POSIX mount uses FUSE to mount repositories as real directories on the host. Every process on the machine — editors, language servers, build systems, agents — sees standard files and directories at a mount path like~/.local/share/mesa/mnt/my-org/my-repo.
Use a POSIX mount when:
- You’re working inside a sandboxed environment (isolated Docker container, Daytona micro-VM, etc.)
- You need multiple concurrent processes to access files through native filesystem APIs (ex. multi-processes architures, build systems, compilers, language servers)
- Your agent needs to install external dependencies (
npm install,pip install, etc.) or run arbitrary code
App Mount
The app mount runs entirely in-process via the Python and TypeScript SDKs. Your application gets a Mesa filesystem handle, and can either call filesystem methods (readFile, writeFile, readdir, etc.) directly or use the Mesa-provided emulated bash tool to execute shell commands (ls, cat, grep, cp, etc.) against Mesa repositories — no FUSE, no sandbox required.
Use an app mount when:
- You have a TS/Python agent running in your own backend and don’t want to manage a sandbox
- Your agent only needs to read/write files and run shell commands (no dependency installs or arbitrary binaries)
- You want the simplest possible setup — just
npm install @mesadev/sdkand go - You’re building with frameworks like Vercel AI SDK, Mastra, or Langchain and want to add a bash tool
Choosing between the two
| POSIX mount (FUSE) | App mount | |
|---|---|---|
| Setup | Requires FUSE + sandbox | Only requires the Mesa SDK |
| Install dependencies | Yes | No |
| Run arbitrary binaries | Yes | No (bash builtins + optional Python/JS) |
| Multi-process access | Yes | Single process |
| Environment | Any (Docker, VMs, local) | Node.js/Python backend |
| Best for | Full dev environments, CI, sandbox agents | Lightweight agents, multi-tenant backends |
Writing to a mount
Whatever revision you mount, typically a bookmark likemain, or a specific change, that is the change your writes edit, in place.
qzvqqupx. What you mounted is what you modified.
Any two writers looking at the same change will see one another’s modifications in real time.
For example, if two different machines run mesa mount on the same main bookmark, these two machines will have identical views of the files.
To isolate edits, you can give each its own change with mesa new.
The one exception is an empty repository: there is no change to edit yet, so the first write creates the repo’s initial change and the default bookmark picks it up.
Approvals and branching
You may want a flow where a human or agent “drafts” some modifications without touching your canonical state. A typical case might be an agent producing work that a human later approves. In this case, to avoid prematurely modifying your canonical documents, you should explicitly “branch” by creating a new change before writing. When using thefs.change.new method, providing a bookmark argument tells Mesa which base change to branch from; it does not move the bookmark to the new change.
After calling fs.change.new, Mesa will switch onto the new change, meaning writes land there.
Bookmarks stay put until you move them with mesa.bookmarks.move.
EROFS before they can touch any change.
Switching changes
Switch the mounted repo onto a different existing change at any time. The common case is switching to a change with some draft work. After callingfs.change.edit, writes now modify the change you switched onto.
To specify the change that you want to switch onto, you can call fs.change.edit with either a bookmark or a changeId (in case the change doesn’t have an attached bookmark).

