What changed in 2.7.0
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.
- If you only read one thing
- Give a session a note of your own
- Drag the dividers in a zoomed cell
- Dropping a file now works everywhere
- Background workers are out of your chat history
- Turn off the closing-summary instruction
- Two MulmoTerminals no longer erase each other’s sessions
- The wheel works after a reload
/clearreally clears the roster row- When a session will not start, you are told why
- Everything else
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.
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
- Find the pencil next to the text in a cell’s header.
- Click it, type one line, press Enter. Esc cancels; clicking away also saves.
That is the whole feature. Nothing to configure.

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
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.

Nothing to configure.
Reference: Basics
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
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
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:
{
"appendSystemPrompt": false
}
Restart the server. A directory can override the global answer in its own .mulmoterminal.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
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:
exactOptionalPropertyTypesis 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.