MesaFS can be run as either a POSIX mount or app mount. If you aren’t sure which to use, see Filesystem for an overview and
comparison.
Installation
Install themesa CLI on macOS or Linux:
On macOS, Mesa also requires macFUSE. See
Platform requirements below for setup instructions.
General flow
- Install Mesa — install the
mesaCLI and any platform-specific FUSE dependencies. - Configure and mount — set
MESA_API_KEYandMESA_ORG, then runmesa mountormesa mount --daemonizefor background operation. - Work with your repos —
cdinto the mount path (default:~/.local/share/mesa/mnt/<org>/<repo>) and use any tool — editors, shell commands, agents. File changes are automatically persisted back to Mesa.
Platform requirements
macOS
Mesa requires macFUSE. Follow the official macFUSE guide to install it, including:Linux
Mesa uses FUSE3 vialibfuse3. Most full Linux distributions include this by
default and mesa’s installer installs it for you otherwise.
allow_other and user_allow_other
Mesa mounts with the FUSE allow_other option so that other processes — like
your agent, editors, and language servers — can access the mounted filesystem.
Without this, only the process that ran mesa mount would be able to read the
files.
On Linux, this requires user_allow_other to be enabled in /etc/fuse.conf.
Uncomment or add the following line:
mesa mount will fail with a permission error.
If your environment runs as root (common in some CI and container setups),
allow_other works without this setting. But if you’re running as a non-root
user — which is the default in most sandbox providers like Daytona — you’ll
need to ensure this is configured.Docker
Slim and minimal base images strip out system libraries that Mesa needs at runtime. Install them explicitly:- Debian / Ubuntu
- Alpine
For Debian-based images like
node:22-slim or debian:bookworm-slim:ca-certificates— TLS certificate store, required for connections to Mesa’s API.fuse3— Userspace FUSE library.openssl(andlibssl3on Debian) — OpenSSL shared library, used for TLS.
Usage
Browsing your repos
Mesa exposes standard filesystem semantics. You can use regular shell commands —ls, cat, cp, grep, and more — directly against your mounted repos.
Editing files in repos
Writes edit the you have checked out — by default, the change the mounted points at — in place, advancing any bookmark pointing at it. See Writing to a Mount for the model and how to work in isolation instead. Every write you perform in mesa that affects your source code will create a new automatically in the background. Mesa respects your.gitignore and will not create commits for
files which you have configured as ignored.
Extended attributes
Mesa supports POSIX extended attributes (xattrs) on files and directories inside a mounted repo. Use them to attach lightweight metadata (provenance markers, build labels, agent annotations) without rewriting commits or maintaining a sidecar database. Mesa scopes the writable xattr surface to theuser.mesa.* namespace.
Names outside that prefix — including the broader user.* (e.g.
user.origin) and the kernel-managed security.* / system.* /
trusted.* namespaces — are short-circuited at the FUSE layer: writes
return EPERM and reads return ENODATA without crossing into mesa’s
gRPC backend. This keeps file-heavy workloads (npm install, cp -a,
tar --xattrs) from paying a round-trip on every kernel-issued xattr
query they trigger.
Symlinks cannot carry user.* xattrs — Linux’s kernel restricts that
namespace to regular files and directories at the VFS layer, so attempts to
lsetxattr a user.* attribute on a symlink return EPERM.
Standard POSIX tooling works against the mount:
xattr CLI (xattr -w user.mesa.origin notion:foo docs/notes.md,
xattr -p user.mesa.origin docs/notes.md, etc.). Library callers go through the
standard setxattr / getxattr / listxattr / removexattr syscalls and the
l*xattr variants for symlinks.
Xattrs are sticky: once set, they stay on the path across content edits, and
they travel with the path when Mesa records a move_path op. Deleting the path
through the mount removes its xattrs. Renames detected only via Git’s content
similarity heuristic (no move_path op recorded) drop their xattrs — re-tag the
new path if needed.
Limits
| Constraint | Limit |
|---|---|
| Per-attribute value | 64 KiB (strict, kernel XATTR_SIZE_MAX) |
| Per-path total xattr size | ~64-72 KiB raw (storage-bounded) |
| Attribute-name length | 255 bytes |
| Allowed namespace | user.mesa.* only |
E2BIG (value exceeds 64 KiB
— the kernel intercepts oversized syscalls itself; or storage cap reached
when adding more attributes to a path), EPERM (name outside the
user.mesa.* namespace, or any user.* name on a symlink),
ENAMETOOLONG (name length), ENODATA (removing a missing attribute,
or any read for a name outside user.mesa.*).
Synthetic xattrs
Mesa exposes a few read-only synthetic attributes on every mounted path:| Name | Value |
|---|---|
user.mesa.org | The org owning the mounted repo |
user.mesa.repo | The repo name |
user.mesa.daemon-pid | The mesa daemon’s PID |
mesa CLI uses user.mesa.org to infer --org from the current
working directory, so it’s the load-bearing case.
Reading xattrs through REST or the SDK
The Content API and the TypeScript SDK return xattrs read-only on file and symlink responses — directory listings are unchanged. There is no REST or SDK write surface in v1; all writes go through the mount. Reads at a historicalchange_id return today’s xattrs for
the resolved path, not the values as of that change (xattrs are stored
separately from Git history).
Commands
mesa new
Create a new detached from a or ID:
-m creates the change with no description. Pass -m or --message to set one:
New changes are always detached — writes still snapshot the change but do not advance
any bookmark. To work on a bookmark where writes advance it, use
mesa edit instead.mesa edit
Switch to a different bookmark:
mesa bookmark create
Creates a new pointing at the current :
-r:
mesa edit:
mesa bookmark list
List all bookmarks for a repository:
mesa log
To look at the log of all your , you can run mesa log. Mesa will
display a list of changes, as well as a helpful diagram.
Workflow examples
Making changes on a feature bookmark
Create a feature bookmark and write some files.mesa edit, the bookmark also advances automatically. There is no manual save step,
changes are persisted to Mesa as you write.

