> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mesa.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Mesa CLI Changelog

> Release history for the Mesa CLI.

All notable changes to this project will be documented in this file.

The format is based on [Common Changelog](https://common-changelog.org/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## \[0.47.1] - 2026-08-16

### Fixed

* Fix active writes returning `ESTALE` when a background WAL flush refreshes repository paths
* Ensure that all CLI commands derive the organization from `MESA_ACCESS_TOKEN` so that `MESA_ORG` is no longer required
* Fix slow `mount()` initialization for layouts that specify a checked-out revision with `at`

## \[0.47.0] - 2026-08-14

### Fixed

* Fix reads, writes, truncation, mode changes, and mtime updates through file descriptors after unlink or rename replacement without recreating the removed path or changing its replacement, while checkout-stale mutations remain rejected with `ESTALE`

## \[0.46.0] - 2026-08-13

### Changed

* **Breaking:** `layout.json` files no longer accept repos with a top-level `bookmark` / `changeId` field. To specify a checkout revision, use `at`.
* Allow CLI mounts to run with only `MESA_ACCESS_TOKEN`

### Added

* Add `branchedFrom` to layout entries to fork a new change the first time a repo is opened

### Removed

* **Breaking:** Remove `--vcs-url`, `MESA_VCS_URL`, and `debug.__service-vcs-url` configuration options.

## \[0.45.0] - 2026-08-11

### Added

* Add `mesa open --repo <org/repo> --mode --path` with `--at` or `--from`/`--as`/`--describe` to open a repository checkout (create change → optional `--as` bookmark → publish checkout; omit `--as` for an anonymous tip; `--repo` is auto-detected from CWD when omitted; custom `--path` FUSE presentation lands with mount layouts)

## \[0.44.1] - 2026-08-09

### Changed

* Split filesystem write batches to the server-advertised VCS operation and message-size limits

## \[0.44.0] - 2026-08-07

### Added

* Add support for custom filesystem layouts with `mesa mount --layout <file>`: the layout defines the complete namespace, mounting the selected repositories at the paths it declares with per-repository `ro`/`rw` modes. Repository names resolve within the organization `MESA_ORG` selects, or the sole configured organization when `MESA_ORG` is unset. Without a layout, `mesa mount` exposes the organization browse tree as before
* Add `mesa checkpoint [-m <message>]` to flush pending writes (serializing concurrent writes and tree mutations in the same repo), optionally describe the current change, create a new descendant change, and advance bookmarks onto that descendant (requires the checkout to already be on a bookmark). Concurrent bookmark-tip races raise a retryable conflict (distinct from not-on-a-bookmark and from a half-applied checkout failure). Omit `-m` to preserve the existing description; pass `-m ''` to clear it; any other `-m` value overwrites. Prints the now-active change id on the first line (same as `mesa new` / `mesa edit`) and `saved <id>` for the described change on the second line

### Changed

* `mesa root` and repository-aware commands now work from custom and nested layout paths
* Change `mesa bookmark create` so recreating an existing bookmark at the same commit succeeds (exit 0); creating the same name at a different commit still fails with `already exists`. Success output is now `Bookmark '<name>' is at the requested revision.` for both create and same-target recreate

### Fixed

* Fix writes through unlinked file descriptors recreating deleted files or overwriting replacements
* Fix fresh pathname reads and metadata remaining stale while a descriptor from before a checkout or realtime update stays open

## \[0.43.0] - 2026-08-02

### Changed

* **Breaking:** Expand `mesa bookmark move` to select multiple bookmarks by name, glob, or repeated `--from`; make `-t/--to` canonical with `-r/--revision` aliases; and require `-B/--allow-backwards` for backward or sideways moves

## \[0.42.0] - 2026-07-16

### Changed

* Stop checking for newer CLI releases automatically when commands run; use `mesa version --check` to check explicitly so intentionally pinned installations are not prompted to upgrade

### Fixed

* Fix realtime mount updates after a local write so subsequent remote creates, deletes, and renames appear without remounting

## \[0.40.0] - 2026-07-12

### Changed

* mesa on macOS no longer requires macFUSE — installing or upgrading via Homebrew now sets up everything automatically, with no kernel extension, security approval, or reboot. If you previously installed macFUSE for mesa, you can uninstall it

## \[0.39.0] - 2026-07-08

### Added

* Add the `mesa diff` command.
* Add `MESA_CACHE_BLOCK_SIZE` / `cache.block-size` to tune the MesaFS disk-cache block size and reduce file-descriptor pressure for large disk caches.

### Changed

* `mesa log` now shows your whole change tree instead of just the current checkout's ancestry, so a change you started but never pointed a bookmark at no longer disappears from the log. Pass `-r <revision>` to scope the log to a single revision's history as before.
* Distribute mesa on macOS as a Homebrew cask instead of a formula; `install.sh` migrates existing formula installs

### Fixed

* Cap auto-sized MesaFS disk caches by the process open-file limit so large free disks do not exhaust file descriptors during mount startup.

## \[0.38.0] - 2026-06-22

### Changed

* Pass the short change ID shown in `mesa log` — or any unique prefix — to any command that takes a revision (`mesa edit`, `mesa new`, `mesa show`, `mesa log`, `mesa describe`, `mesa bookmark`). `mesa log` now prints each change at its shortest unambiguous length, so the ID you see is always one you can type.
* `mesa show` now leads with the change ID — the handle you act on — and moves the commit hash to a secondary line.

### Removed

* No longer expose the synthetic `user.mesa.daemon-pid` xattr

### Fixed

* Fix newly created files transiently disappearing from the mount during bursts of writes

## \[0.37.0] - 2026-06-17

### Added

* Install a specific CLI version on Linux with `curl -fsSL https://mesa.dev/install.sh | sh -s -- --version <X.Y.Z>`. The version is pinned through your package manager (apt/apk/dnf) using the existing repository.
* Add environment variables for every remaining config file option: `MESA_DAEMON_LOG_FILE`, `MESA_DAEMON_LOG_COLOR`, `MESA_PREFETCH_ENABLED`, `MESA_PREFETCH_MAX_DEPTH`, `MESA_PREFETCH_MAX_CONCURRENCY`, `MESA_PREFETCH_CACHE_PRESSURE_LIMIT`, and `MESA_MESAIGNORE_PATH` (explicit global `.mesaignore` location)
* Add `MESA_REPO_REVS` to pin per-repo revisions from the environment, e.g. `MESA_REPO_REVS="acme/web=bookmark:main,acme/api=change-id:abc123"`
* Add `MESA_NO_CONFIG_FILE` to skip reading any (deprecated) config file, for sandboxes and other hermetic environments

### Changed

* When you mount a repo, writes now alter the revision you mounted at. Previously, the first write on a mount would create a new change *on top* of your specified revision. To emulate the old behavior, use `mesa new` after mounting.
* Mount every repo the API key can access, always; `mount = "explicit"` in a config file is now ignored with a deprecation warning, and access is restricted by scoping the API key. Per-repo overrides (rev pins, read-only) still apply
* Deprecate `mesa repo open` and `mesa repo close`; both are now hidden no-ops that warn and exit 0, since there is no explicit mount list to edit
* Change `mesa repo list` to list repos from the API instead of the local mount configuration; `--all` is a hidden deprecated no-op
* Deprecate TOML config files (`config.toml` and `credentials.toml`): existing files are still read with environment variables taking precedence, but `mesa` now logs a warning naming the environment variable replacement for every setting the file contains. A future release will stop reading config files entirely — that removal will be the breaking change
* Deprecate `-y`/`--non-interactive`; the flag still parses but has no effect now that config files are never created
* Deprecate `mesa doctor` and `mesa dump-config-template`; both still work but only exist to support deprecated config files
* Change the daemon to exit at startup with a clear error when no organizations are configured, instead of mounting an empty filesystem

### Removed

* Remove the interactive onboarding wizard; `mesa` no longer creates config files on first run — configure it with `MESA_ORG` and `MESA_API_KEY` instead

### Fixed

* Make `MESA_API_KEY` take precedence over `credentials.toml`. Previously a per-org `[organizations.<org>].api-key` entry in `credentials.toml` outranked `MESA_API_KEY`, so a stale file key silently shadowed the environment key and produced confusing `401` errors. Credentials now resolve as `MESA_ORGS` → `MESA_API_KEY` → per-org `credentials.toml` → top-level `credentials.toml`

## \[0.36.0] - 2026-06-09

### Added

* Support installing Mesa on RPM-based Linux distributions with `dnf`, including Amazon Linux 2023 environments such as Vercel Sandbox.
* Add the `MESA_ORG` (organization to configure) and `MESA_API_KEY` (credential for this process) environment variables. `MESA_API_KEY` accepts an API key or an access token, so a short-lived token minted outside a sandbox can be injected without the raw API key ever entering it.

### Changed

* The mesa daemon now runs mounts on a self-expiring access token signed locally from your API key, instead of mounting with the raw key. The mount lasts up to 24 hours and then expires.

### Removed

* Remove the MesaFS secret store, the `mesa auth` commands, and legacy secret backend configuration. Mesa CLI now reads API keys only from `MESA_API_KEY` or a plaintext `credentials.toml` next to `config.toml`.

## \[0.34.0] - 2026-06-01

### Added

* Enable realtime updates by default for MesaFS mounts. Edits from other clients checked out on the same change now appear automatically. If simulatenous edits conflict, both edits will show up in the file, delimited by conflict markers.

### Changed

* MesaFS FUSE `flush(2)` no longer blocks waiting for confirmation that writes were received by the Mesa backend
* Update global `.mesaignore` handling: the CLI now loads `.mesaignore` from the same directory as the active `config.toml`; if no file exists, Mesa uses its built-in default ignore rules. A custom `.mesaignore` fully replaces those defaults, so an empty file disables global ignore rules for that mount. SDK and other non-CLI mounts no longer inherit ignore rules from the CLI config directory.

### Removed

* Remove the experimental CRDT-backed multiplayer mode and related real-time filesystem event handling. Realtime is now enabled by default in MesaFS.

## \[0.33.0] - 2026-05-26

### Added

* Add per-repo `read-only` to `[organizations.<org>.repos.<repo>]` in `config.toml`. Set `read-only = true` and the daemon rejects writes to that repo with `EROFS`, while other repos in the same mount stay writable.
* Mount and resolve conflicted changes in the filesystem. Checking out a conflicted change (e.g. after a conflicted merge) now succeeds: conflicted files read back with JJ-style conflict markers (`<<<<<<<` … `>>>>>>>`), `stat()` reports the materialized marker size, and writing marker-free content back resolves the conflict and persists across remounts. Previously `mesa edit` on a conflicted bookmark failed with "commit has no tree OID" because the server stored the structural tree separately from the commit row; the server now records it on the commit directly so the daemon mounts the conflicted commit through the normal tree-fetch path.

## \[0.32.0] - 2026-05-22

### Added

* Real-time kernel filesystem events in multiplayer mode. When peers modify files in a shared session, the FUSE layer now delivers inotify/FSEvents notifications so editors and build tools pick up changes without polling.

## \[0.30.0] - 2026-05-19

### Added

* Add `mesa new -m, --message <MESSAGE>` for setting the description of a newly created change. Omitting the option creates the change with no description.

## \[0.29.2] - 2026-05-17

No user-facing changes.

## \[0.29.0] - 2026-05-15

### Added

* Support POSIX extended attributes on any path in a mounted Mesa repo. `setxattr` / `getxattr` / `listxattr` / `removexattr` (and their `l*xattr` symlink variants) round-trip values under the **`user.mesa.*`** namespace; use `setfattr` / `getfattr` on Linux or `xattr` on macOS. Names outside `user.mesa.*` (including the broader `user.*`, plus `security.*`, `system.*`, `trusted.*`) are short-circuited at the FUSE layer — set rejects with `EPERM`, get/remove answer `ENODATA` instantly with no VCS round-trip, so kernel-issued queries (e.g. `getxattr(security.capability)` on every `exec(2)`) don't penalize file-heavy workloads like `npm install`. Per-attribute values capped at 64 KiB and names at 255 bytes; per-path total is storage-bounded (\~64-72 KiB raw, base64-inflated under the hood). Synthetic xattrs (`user.mesa.org`, `user.mesa.repo`, `user.mesa.daemon-pid`) win over user-set values with the same name on read

### Fixed

* Empty repos are now usable without workarounds — `mesa edit`, bookmark create, write,
  and remount all work on freshly created repos where `main` points at ZERO\_OID
  ([MES-1387](https://linear.app/mesa-dev/issue/MES-1387))

### Changed

* The `Rev` RPC type gains an `EmptyRoot` unit variant for empty-repo bootstrap.
  **Restart the mesa daemon after upgrading** — a new CLI connecting to an old
  daemon will fail to deserialize the new variant.

## \[0.28.1] - 2026-05-06

### Added

* Add `mesa show` subcommand for inspecting a revision's commit metadata and patch. Supports `--name-only`, `--summary`, `--stat`, and `--no-patch` flags with colorized output.

### Changed

* `mesa log` now shows change history instead of commit history, matching the mental model of changes as the primary unit of work.
* Coordinate cache budgets across `mesa` instances in the same process;
  unset `cache.max_size` and `cache.max_memory_size` in `config.toml` now auto-size against system resources instead of being unbounded

### Fixed

* Fix `rg` and other tools that resolve `/..` in just-bash mode by clamping `resolve_path` at the filesystem root.

## \[0.28.0] - 2026-05-03

### Added

* Added support for `.mesaignore` files which exactly follow `.gitignore` semantics.
* Added support for a global `.mesaignore` file as a sibling to the `config.toml` file. `mesa`
  creates this file for you during first launch. Existing users can use
  `mesa dump-default-mesaignore`.
* Added `mesa dump-default-mesaignore` to print out the default `.mesaignore` installed during
  onboarding.
* Added support for conflicts in `mesa`'s filesystem. Conflicting files render `jj`-style conflict
  semantics.

### Fixed

* Fixed race condition in cache deallocation theoretically causing crashes.

## \[0.27.0] - 2026-04-30

No user-facing changes.

## \[0.26.0] - 2026-04-29

No user-facing changes.
