Release notes
Each entry says what a release changes and what it leaves as it was. Known limits stay in
Known issues. Run mend version to see what you have.
Not released yet. Previews (0.36.0-next.<n>) carry what is below; see
Try a preview.
Upgrading a server from 0.35.1: read Upgrade to 0.36 first. Two things
need doing before the upgrade: copy out any old upgrade backup you want kept, since the upgrade now
prunes them, and rotate any token that was in an adopted repository URL. The bundled Sealant is
0.39. The VS Code extension is published with this release, as Mend by Sealant
(sealant-sh.mend) 0.36.1 on the Visual Studio Marketplace and Open VSX; any 0.36.x extension works
with a 0.36 server. The desktop app and the native phone app are not published.
Server setup and operation
Section titled “Server setup and operation”- Guided setup.
mend server setupon a terminal with no flags asks its questions one at a time and says what it observed. Each flag now changes only what it names.--declareadds to the saved exposure statements,--undeclaretakes one back, and--origin noneclears the extra origins. - Edge and posture.
--edge <host>runs a Caddy TLS edge in front of Mend;--exposureand--tenancydeclare the posture.mend server statusreports the edge and both gates. - Mirrors. An npm mirror and a Docker Hub mirror run beside Mend, on by default, in two more containers. See npm mirror and Docker mirror.
- Workspace SSH.
--ssh-bind <ip>publishes workspace SSH on its own address, aworkspace-sshitem of the public exposure gate. In a per-person workspace Remote-SSH runs as the launcher, not root.mend ssh keyslists your workspace SSH keys and removes one. - T3 Code gateway, opt-in with
--t3-gateway. T3 Code works as a Mend client for its core workflow: threads, messages and images, the queue, approvals, diffs, files, the terminal, and settle and snooze. More of T3 Code is coming in 0.36 patch releases, before 0.37. See t3code. Two worktree reads it uses are in the API for every client:GET /api/worktrees/:id/contents(a file, or a search) andGET /api/worktrees/:id/diff?from=&to=(a slice between checkpoints). - Upgrade backups are pruned to the newest two (
--keep-backups). - Ubuntu 23.10 and later. When the host refuses user namespaces, guided setup asks to allow them
before its first question, and
--allow-usernsallows them from a script. Setup writes/etc/sysctl.d/60-mend-rootless-docker.confwith a marker, somend uninstall --allremoves it and puts the kernel’s setting back.mend doctorreports it on aworkspacesline, and a launch on such a host fails at once with the command, before any image is built. See Every session fails to launch on Ubuntu. - Two Docker engines on one machine. Setup checks that Mend’s web and SSH ports are free before
it pulls anything and names what holds one.
--contextand--docker-socketchoose the engine, and setup waits for health from the server it started, by its instance id. - Private means private. Under “my private network or Tailscale” setup offers only private, ULA
and carrier-grade NAT addresses. A fresh install refuses
--bindon a public address, and--edge, until the first account exists. - Previews from before the next channel.
mend server upgrade --from-previewmoves a server on a0.36.0-preview.Kbuild to a next build of the same version, once, after checking the migrations both databases applied. - Uninstall.
mend uninstallstops live sessions and removes their workspaces, volumes and networks before the server, writes what Docker refused touninstall-left.jsonso a second run finishes, and removes only the~/.ssh/configblocks of the servers it removes.--allalso offers the images Mend pulled and Docker’s build cache. - Helm. The chart runs the npm and Docker mirrors as optional components (
mirrors.npm.enabled,mirrors.docker.enabled). - Docker restarts. A workspace stops within 60 s when Docker stops, inside systemd’s 90 s, so
restarting or upgrading Docker with a live session no longer leaves Docker down for up to an hour.
mend doctor’sdockerline names any session that would outlast it.
Sessions
Section titled “Sessions”- pi and opencode run as sessions beside Claude Code and Codex (
mend pi,mend opencode), on your ChatGPT subscription through the Codex login.mend connect pisends your pi setup. See Your pi setup. - One model picker. The server owns each harness’s model list (
GET /api/harnesses/models,mend models), and every session records the model and effort it started with. opencode lists the Codex models as it names them, with none preselected. - Two people in one worktree. A second person joins a live session’s worktree as the owner does.
Before, the join waited about 30 minutes and failed with
worktree leased. - Only the owner types in a terminal. Attaching to a session someone else owns streams its
terminal without sending your keys, shared control or not.
mend shellandmend service runin someone else’s session are refused. - Pull requests in the conversation. A pull request the agent opens is recorded when its turn
ends, and automatic landing updates it rather than opening a second. Rows on the web’s Now page,
the project’s worktree tree and the phone end with
#412 · open. - Claude workflows on the phone. A workflow started in a conversation session shows its phases and agents on the phone while it runs, and the turn Claude starts to report it is recorded. A session whose workflow still runs is not idle-stopped.
- Agent memory for Claude Code and Codex is kept per person per project and carried into each
session you start.
mend memory importbrings what your machine has. See Agent memory. - Secret files: files such as
~/.aws/credentialskept encrypted in Mend and written into every session you own (mend secrets). See Secret files. - Automatic install: a switch per project that runs the install command the lockfile names.
- Several repositories in one session with
mend repo add. See Several repositories in one session. - Claude Code plugins your settings and the repository’s enable are installed before Claude starts, with no prompt. See Claude Code plugins.
- Faster. On the team’s box a new session takes about 27 s (was about 90 s) and a Stop 15 to 19 s. A Stop on Garage no longer waits 10 minutes for its upload links to expire. Picking a session up on the phone, or taking it back in a terminal, stays in the workspace it runs in. A pnpm install Mend runs gives up on a stalled download after 15 s, and goes through the server’s npm mirror when the project sets no registry of its own.
- Launch and stop words. While a workspace gets ready the session line says where it stands
(
queued · waiting for a worker,building the workspace image · step 3/12,booting). A failed image build ends the sessionfailedwith its reason. A workspace the host’s Docker stopped readsended · the host's Docker stopped it, nevercompleted. Discard unsaved and stop… works, and is offered once a save has stalled. - Review during a Stop. Opening a review or marking a checkpoint while a session stops uses the
Stop’s final save and says so (
from the Stop's final save · capture 12 · 10:16). A landing then waits for the Stop, up to 45 s. - Approvals kept. A conversation started with approvals on (
ask) keeps them on resume, on a follow-up after a stop, and on a Slack reply that relaunches it. - Images. Workspaces carry
bunandunzip(each project’s image rebuilds once, about +80 MB) and pin their harness versions. Claude Code no longer updates itself in a workspace.PAGERiscat, since the images carry noless. - Native Arch on arm64. On Apple silicon and ARM servers, Arch workspaces build for
aarch64instead of runningx86_64under emulation. Reinstall native dependencies in existing worktrees (node_modules,.venv,target/); the first Arch build on a host downloads the Arch Linux ARM rootfs (829 MB) fromos.archlinuxarm.org, outside the mirrors, once per host. - Shallow repositories are refused at adoption and at a session’s start.
CLI, dashboard and phone
Section titled “CLI, dashboard and phone”mend runworks in scripts: it prints the command’s output and exits with its code.mend logsandmend waitare new.mend service run --waitwaits through a slow start.mend run -- bashwith no script is refused before anything is created;mend run -- bash -c '…'runs bash itself.mend pullfast-forwards a second pull.mend worktrees rmremoves a worktree,--forceone whose change was never landed.mend resume <id>,mend stop <id>andmend rejoin <id>act on the session they are given.mend projects --jsonandmend service list --jsonprint JSON.mend ssh <session>prints thesshcommand for that session’s workspace.- A foreground
mend claudeormend codexstops its session when its terminal closes. mend loginover SSH, or with no display, prints the link and code and opens no browser (--open,--no-open). Sign-in no longer fails when the server’s clock disagrees with yours;mend doctorsays when it is more than two minutes off, and on a Mac when it sleeps on its own.- The CLI needs Node.js 22.13 or newer. The dashboard still needs Node 26.
- The dashboard’s panes are numbered (
[1],[2],[3],[0]), and?lists every key. A session you start from it attaches once it runs if you are still waiting on it (MEND_AUTO_ATTACH=offleaves it toa). The snake counts down before it moves and takes the keyboard; Esc hands it back. - The phone shows the change’s pull request, asks before it stops a session, and picks models from the server’s list.
Credentials
Section titled “Credentials”- Secret files, the pi profile, memory, skills and pasted images reach a workspace through a single-use pickup ticket, not through Sealant’s exec arguments. The bundled Sealant stores no process arguments and purges the ones it stored. If you ran a 0.36 prerelease, see what to rotate.
- No saved harness state keeps a login or token another person’s session could pick up. The list is in How Mend handles your logins.
- Cloud metadata. Workspaces on Docker cannot reach
169.254.169.254orfd00:ec2::254, so a session on a cloud VM cannot read the instance’s credentials. Workspaces already running at the upgrade keep the address until they stop. See Upgrade to 0.36 and Known issues.
Per-person workspaces, on by default
Section titled “Per-person workspaces, on by default”Each person who runs anything in a workspace gets their own Linux user and home, and everything they
run runs as them. MEND_HARNESS_LAYOUT is person unless set; an operator sets
MEND_HARNESS_LAYOUT=shared to keep new worktrees on one shared home (on the Docker install,
through a Compose override; mend server setup has no flag for it). A worktree that has run per
person always runs per person, whatever the setting. A loopback server on the capture store (the
default mend server setup) runs per person too. Where a workspace cannot run per person (a nix
image, no sudo, a Kubernetes workspace runtime, a Docker host with no-new-privileges), a new
worktree runs with one shared home and the session says why. Hot sessions keep standbys in the
layout new worktrees run in: a per-person standby starts as its owner, with their logins in their
own home, and serves their next session in a new worktree. See
Per-person workspaces.
Everyone in a per-person workspace has passwordless sudo, which runs as root: anyone working there, and their agents, can read and change each other’s files, logins included.
- Identity and layout. A login name, uid and home per account, the same in every workspace. The
layout is decided before a workspace is created, from the worktree’s record, what the platform
reports for the image, and the setting. A worktree that has run per person refuses an image that
cannot, with the reason. Codex no longer starts a new conversation when a resume cannot find its
thread, in either layout: the turn fails with
Codex could not find this conversation's thread. Nothing was sent. - Git and Mend identity. Each person’s
git pushsigns as them, with their Mend key or their own bridge. Git over HTTPS to GitHub reads their own GitHub login through Mend’s credential helper; noGITHUB_TOKENis in the environment. Their Git author goes into their own home. - Logins. Each person’s provider logins are written into their own home and kept fresh there,
joins included. A start whose provider is not connected is refused
(
Connect Claude to start a session here.). Nobody’s login is used for anyone else. - Deliveries. Dotfiles (scripts included), the default shell profile, skills, the pi profile,
memory and secret files go into each person’s home, as that person. A joiner’s
install.shruns beside their agent unless Start my agents after install.sh is on. - Pasted images. An image is written by the process of the person who pasted it, as them, into
/workspace/harness-home/people/<account id>/paste/(0700; the image 0600). Root writes nothing of theirs. A first paste makes only that person’s user and home: it writes none of their logins and delivers nothing. Each paste fetches its image with a Mend token of its own that does nothing else, is revoked when the paste ends however it ends, and lapses after 15 minutes in any case. In every layout the writer follows no link, creates the image only where nothing is, and never changes the mode of a directory. Apastedirectory that is a link is refused; before, it led a root write, and a 0755chmod, outside the harness home. Slack images go the same way, as the person who asked; on the capture store a request that starts a session attaches none (see Known issues). - Readers. Conversations and memory are read back per person, for the person each process ran as.
- Shared steering. Under shared control each turn runs on its sender’s login, in one shared conversation, with no one’s personal memory or instructions. A new sender waits for the previous sender’s background work, and everyone sees what it waits for. opencode sessions cannot be shared.
- Workspaces started before 0.36. They keep their shared home until replaced: on their own when
nothing would stop, or with Replace this workspace now (
mend workspace replace) by the change’s owner, always after a saved final capture. Their memory is credited server-side to the person who held it, or listed on the worktree asmemory from before 0.36, not credited. - What the product says. Every client shows who else is live in a workspace, the Shared control confirmation, the waiting line and the replacement line, in the same words. The API’s session list and session view list the people live in each workspace.
Its performance limits, and how they are measured, are in Performance.
No credentials in repository URLs
Section titled “No credentials in repository URLs”Mend refuses a repository URL with a login or token in it (https://oauth2:TOKEN@…) at adoption and
for reference repositories, as it already was for dotfiles, on every client and the API, and points
to mend keys and the bridge instead. Before 0.36 such a URL was stored as typed and returned to
everyone who could see the project. On upgrade, Mend removes the credential from every stored
repository URL. A project whose Git store still holds one is refused until an operator removes it
(the server log names the command); the store and its worktrees are kept. Mend also strips URL
credentials from every repository URL it returns, from the Git errors it reports, and from its logs.
See Known issues.