---
title: What's new in 2.4.0
layout: default
parent: English
nav_order: 1028
---

# What changed in 2.4.0
{: .no_toc }

**As of 2026-07-28.** This page is a snapshot taken at release. For anything that changes
later, follow the links to the living guide.

- TOC
{:toc}

---

## If reloading the page gave you "Not Found", that is fixed

**Read this one first if you run MulmoTerminal with `npx`.** Every `npx` user was hitting it.

Starting up worked, but the router rewrites the URL to `/terminals` — and reloading *that* tab
answered **404 Not Found**. The only way back was editing the URL by hand. Worse, the move that
triggers it is the one you make when something seems wrong: restart the server, then reload the
open tab to reconnect.

**How to tell you have the fix.** Open MulmoTerminal, wait for the URL to become
`…/terminals`, and reload. You should get the grid, not "Not Found".

Nothing to configure. It never affected `yarn dev`, or a global install whose path had no dot
directory in it — which is why it survived so long undetected. Thanks to
[@ystknsh](https://github.com/ystknsh) for the report and the diagnosis.

The same defect was found in one more place while fixing it: a **custom attention sound** kept
under a dot directory (`~/.mulmoterminal/chime.mp3` being the obvious spot) never played. That
works now too.

## Reaching the app from another machine

If you bind MulmoTerminal to a non-loopback address, the page now attaches its terminals
instead of loading and then failing.

**Naming the address does both jobs at once:**

```bash
MULMOTERMINAL_HOST=192.168.11.6 npx mulmoterminal@latest
```

Then open `http://192.168.11.6:34567` from the other machine.

**A wildcard bind cannot infer what you will type**, so say it separately:

```bash
MULMOTERMINAL_HOST=0.0.0.0 MULMOTERMINAL_ALLOWED_ORIGINS=nuc.local npx mulmoterminal@latest
```

`MULMOTERMINAL_ALLOWED_ORIGINS` takes a comma-separated list. `localhost` and `127.0.0.1` are
always allowed and never need listing.

{: .warning }
> This opens the app to whoever can reach that address — every terminal, with your agent's
> permissions. Bind to a LAN address on a network you trust, or keep the default loopback and
> use SSH port forwarding. The server prints a security line at startup saying what it did.

## A clicked file path opens beside the terminal

While a grid cell is **enlarged**, clicking a file path an agent printed now opens it in the
file pane on the right — next to the terminal that printed it, instead of taking over the
screen or opening a browser tab.

**Try it.** Enlarge a cell (**⤢**), then click any path in the output that has a `/` in it.
The pane opens itself if it was closed.

It covers everything the pane can render — source, `.txt`, Markdown (with the preview toggle),
JSON, CSV. Images, PDFs and video still open in a browser tab, which shows them better than an
editor would. A path outside that cell's own directory also keeps its old route, since the pane
cannot look above its root.

Un-enlarged, nothing changed.

![A path clicked in the terminal, opened in the file pane beside it](../images/v240-path-to-pane.png)

{: .note }
> A path needs a `/` to become a link at all — `README.md` on its own is not clickable, but
> `docs/README.md` is. That has always been true and is not new here.

## The pane remembers your file across a reload

Reload the page and the file pane comes back with **the file you had open and the directories
you had expanded**, instead of an empty tree. Whether the pane is open and how wide it is were
already remembered; now the contents are too.

Two terminals in the same repository stay independent — the remembered state is handed out once,
to the first cell that asks for that directory, and after that each cell keeps its own.

## Directory colours on the new-terminal chips

The directory chips on the new-terminal screen now carry a 3px stripe in that directory's
configured colour, so you can pick the right project by colour rather than by reading paths.

Nothing to set up beyond the colours you may already have in `.mulmoterminal.json` — a
directory with no colour looks exactly as before. See
[Directory settings](config.html) for how to set one.

![Directory chips carrying each directory's configured colour](../images/v240-chips.png)

## Seeing what a `.mulmoterminal.json` actually does

Settings now has a **Directory settings** section. Open a row and it shows, for that directory:

- the values in effect, colours with a swatch
- which file each value came from
- **keys that were thrown away in validation** — a colour that is not `#rrggbb`, a size out of range
- **keys this app never reads at all** — `badgeColour` and other near-misses, or global-only settings

Read-only: it explains, it does not edit. Writing is still the `mulmoterminal-config` skill.

This is the place to look when a setting "isn't working" — the answer is usually one of the last
two lists.

![The Directory settings section, with one directory expanded](../images/v240-dir-settings.png)

## Fixes

- **`NODE_ENV=production` no longer leaks into your terminals.** The launcher was exporting it
  to every session, and yarn v1 reads it — so `yarn install` skipped devDependencies and
  reported success. If you have hit mysteriously missing dev tooling under `npx`, this was why.
  A `NODE_ENV` you export yourself still passes through untouched.

---

The living reference is the [guide](index.html); this page is only what changed on
2026-07-28. For **what** changed and **why**, see the
[changelog](https://github.com/receptron/mulmoterminal/blob/main/docs/ChangeLog.md).
