Skip to main content
All notable changes to this project will be documented in this file. The format is based on Common Changelog, and this project adheres to Semantic Versioning.

[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_ORGSMESA_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)

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.