---
title: What changed in 2.7.0
layout: default
parent: English
nav_order: 1022
---

# What changed in 2.7.0
{: .no_toc }

Written on **2026-07-29**, as a snapshot of that day. Behaviour moves; this page does not. For the
reference that is kept current, follow the links out of each section.

- TOC
{:toc}

---

## If you only read one thing

**Upgrade. Everything new here is on by default, and there is one setting you may want to turn off.**

```bash
npx mulmoterminal@latest
```

| What you get | Where |
|---|---|
| A note you write yourself on any session, always visible | Cell header, sidebar, and your phone |
| Drag the divider when a cell is zoomed | Grid view |
| Dropping a file works in Chrome, and when you are away from the machine | Any terminal |
| Background workers stop filling your chat history | Chat history |
| The mouse wheel works again after a reload | Claude / Codex cells |

| What was broken, and is fixed | Where |
|---|---|
| A second MulmoTerminal deleted the sessions of the one already running | Starting a second instance |
| `/clear` left the previous conversation's summary on screen | Cockpit roster |
| "codex is probably not installed" when that was not the problem | Starting a session |

---

## Give a session a note of your own

Sessions are named for you — by an AI title, or your last prompt, or failing that an id. That
answers *what was said*, which is not the same as **what this one is for**.

Now you can write that yourself.

### How to use it

1. Find the pencil next to the text in a cell's header.
2. Click it, type one line, press **Enter**. **Esc** cancels; clicking away also saves.

That is the whole feature. Nothing to configure.

![Two cell headers side by side: the left one reads ~/work/api-gateway then the note "do not interrupt - release build" with the pencil in the accent colour; the right one reads ~/work/billing then a session id, its pencil dim. Both headers are the same height](../images/v2.7.0-session-memo.png)

### What it changes

- The note **replaces** the header's existing line rather than adding one, so **the header never
  gets taller**. The title it displaced moves into the tooltip.
- The note is stored **per session, on the host** — not in your browser. Close the cell, restart the
  server, come back tomorrow: resume that session and the note is still there.
- It is also the name that session goes by in the **sidebar**, the **resume picker**, and the
  **roster on your phone**.

Useful when several cells sit in the same repository and only you know which is which — "the one
that must not be interrupted", "waiting on CI", "throwaway".

> Reference: [Features](features.html)

---

## Drag the dividers in a zoomed cell

Zoom a cell in grid view and it is split — the terminal, plus a column beside it. Those dividers
were a fixed width: no dragging, and no memory of a change you could not make anyway.

Now: **drag them**, or focus one and use the **arrow keys**. The width you choose is kept, so it is
still there after a reload.

![A zoomed cell in grid view: the roster of three sessions on the left, the terminal on the right, and the divider between them lit in the accent colour mid-drag](../images/v2.7.0-zoom-splitter.png)

Nothing to configure.

> Reference: [Basics](basics.html)

---

## Dropping a file now works everywhere

Dropping a file onto a terminal inserts its path. That only ever worked when the browser was willing
to hand over a real path — which **Chrome does not do**, and which is never true when you are
**connected from another machine**. Before, those cases showed a hint and stopped.

Now, when the path is not available, the file's **bytes are sent to the host**, saved, and **that**
path is inserted.

- When a real path **is** available, nothing changed — it is used directly, with no upload.
- The fallback only runs when there is no other way to answer.

So dropping a screenshot into a session works from the sofa, on the phone, in Chrome.

> Reference: [Basics](basics.html)

---

## Background workers are out of your chat history

Scheduled collection syncs and similar work start sessions you never asked for, and they were listed
alongside your own conversations.

They now sit behind a **Background** chip. The default **All** shows only the chats a person started.

They are **filtered, not hidden**: a MulmoTerminal session is a live terminal, not a transcript, so
removing it entirely would take away your only way to look at it — or stop it.

> Reference: [Basics](basics.html)

---

## Turn off the closing-summary instruction

Every session MulmoTerminal starts has carried an extra instruction telling the agent to end its
replies with a short summary. That is what makes the grid readable at a glance — but nothing in the
app parses it, so if you do not want it, it is only noise.

**This is the one setting in this release, and it has no UI.** Edit the file by hand.

`~/.mulmoterminal/config.json`:

```json
{
  "appendSystemPrompt": false
}
```

Restart the server. A directory can override the global answer in its own `.mulmoterminal.json`:

```json
{
  "appendSystemPrompt": true
}
```

- **Default is on.** An existing config with no such key behaves exactly as before.
- Independent of the clone-name line (`prWorkdirFooter`). With both off, no flag is passed at all.
- **How to tell it worked:** start a session and ask it something small. With it off, the reply ends
  where the answer ends — no summary block.

> Reference: [Configuration](config.html)

---

## Two MulmoTerminals no longer erase each other's sessions

**If you have ever started a second MulmoTerminal, read this one.**

A newly started instance cleaned up "orphaned" session settings — files belonging to a server that
had died. The rule was right for a *previous* lifetime and wrong for a *concurrent* one: the second
instance could not see the first one's live sessions, so it treated all of them as abandoned and
deleted them. On the machine where this was found, **eight live sessions lost their settings.**

Fixed. Alongside it, starting another instance now **says so** — whatever port you gave it:

```
MulmoTerminal is already running (http://localhost:8080).
  Running more than one is NOT a supported setup: they share ~/.mulmoterminal,
  so they can overwrite each other's session state.
Start another one anyway? [y/N]
```

Previously the question only appeared when the **port** clashed, so `--port <free>` started a second
one in silence. The port was never the problem; the shared `~/.mulmoterminal` is.

---

## The wheel works after a reload

In a Claude or Codex cell, scrolling back with the wheel — and clicking things the agent draws —
stopped working after **any** reattach: a page reload, switching sessions in the sidebar, another
tab, a dropped WebSocket.

The cause was one control sequence that is sent exactly once when the session starts, and is
therefore never in the replay a reattaching browser receives. MulmoTerminal now **asks tmux what the
state is** and restores it before replaying.

**How to tell you have the fix:** reload the page on a Claude cell and scroll up with the wheel. It
scrolls.

---

## `/clear` really clears the roster row

After `/clear`, the cockpit roster kept showing the **summary and reply from before the clear**. It
looked right for a moment, then came back as soon as the next turn finished.

`/clear` moves the agent to a new conversation log, but MulmoTerminal was still reading the old one,
frozen at the moment of the clear. Fixed.

---

## When a session will not start, you are told why

"codex is probably not installed" used to be a **guess** — the real error was caught and thrown away.
Measured, that message was only ever right on Windows; on a Mac a missing binary produced a green
`[session ended]` instead. The symptom and the explanation had been swapped.

Now the binary is checked **before** spawning, in the environment the terminal will actually get, and
what is found is what gets reported. The server log also records whether tmux **attached to an
existing session or created one** — a resume that attaches never launches the agent at all, which is
what made the original problem so hard to pin down.

---

## Everything else

- **Types**: `exactOptionalPropertyTypes` is on across the project. `{ work: undefined }` no longer
  type-checks — the exact shape that emptied the phone's session list in 2.6.0.
- **Remote host**: the reconnect ring and the liveness probe moved into `@mulmoclaude/core` (298
  lines deleted here). They had drifted out of step with core's own retry window, which meant a host
  with a dead credential could relaunch forever without ever asking you to sign in again.
- **Feeds**: a scheduled collection refresh that fails is now recorded instead of vanishing.
- **CI**: the Windows daily build is green again — two portability bugs in the tests, not in the
  product.

For the full list, see the [changelog](https://github.com/receptron/mulmoterminal/blob/main/docs/ChangeLog.md).
