4.11.0 — Stopping it, and the ports it takes

A snapshot as of 4.11.0 (released 2026-08-28). It will go stale as the app moves on — that is expected, and the living reference is the guide each section links to.

npx mulmoterminal@latest

Two things in this release need something from you: the new ways to stop the server, which are worth knowing before you need them, and the port behaviour, which may refuse a launch that worked yesterday. Everything else applies on its own.

Stopping a running server

Until now the only way to stop MulmoTerminal was to find the terminal you started it in and press Ctrl+C. npx mulmoterminal@latest opens a browser, so that terminal is often the one window you are not looking at — and closing the tab leaves the server running.

There are now three ways, and you do not have to choose in advance.

From the browser

Settings → Quit MulmoTerminal, at the foot of the sessions group. This is the one to reach for when the browser is where you are, which after an npx launch it usually is.

It shuts the server down the same way Ctrl+C does — sessions are ended cleanly, not killed.

From any terminal

npx mulmoterminal@latest stop

or, if you installed it globally, mulmoterminal stop. It works from any terminal on the machine, not only the one that started the server: the server registers its own process id under ~/.mulmoterminal/instances/, and stop reads that, confirms the process is really MulmoTerminal, and signals it.

To stop it without being asked anything:

mulmoterminal stop --force

Run mulmoterminal stop --help for the rest.

By finding the process

The process now names itself, which it did not before — every launch used to appear as plain node:

$ ps aux | grep mulmoterminal
… mulmoterminal :34567

So pkill -f mulmoterminal works as a last resort, and the port is in the name because there may be more than one.

The update badge

If you run with npx mulmoterminal@latest, the header badge that tells you a newer version exists could not previously appear. The check ran once, at boot, and at that moment the running version is the registry’s latest — so the only comparison that ever happened could only say “you are current”.

Nothing to configure: the check now repeats every three hours, so a server left running for days will notice a release when it happens. To turn it off entirely, as before:

MULMOTERMINAL_NO_UPDATE_CHECK=1 npx mulmoterminal@latest

PORT now works — and that may be a change for you

PORT used to be ignored. PORT=34601 npx mulmoterminal started on 34567 anyway, while the port-in-use message told you to set exactly that variable. Both halves are fixed.

PORT=34601 npx mulmoterminal@latest     # now actually starts on 34601
npx mulmoterminal@latest --port 34601   # --port still wins over PORT

If you export PORT in your shell profile for something else, read this. MulmoTerminal will now take that port. The launcher says so when it happens:

[mulmoterminal] Port 3000 comes from the PORT environment variable — that is the port MulmoTerminal is asking for.
  Terminals inside cells inherit that PORT too, as in any shell you exported it from.

Pass --port to override it for one launch, or unset PORT before starting.

A PORT you did not set no longer appears inside cells. The launcher used to export its own port to every terminal in every cell, so a dev server started in a cell would read PORT=34567 and try to take MulmoTerminal’s own port. That no longer happens — a cell sees PORT only if your own shell had it.

Upgrading with tmux persistence on? A tmux server that survives the upgrade keeps the old value in its global environment and hands it to new panes. One line clears it:

tmux -L mulmoterminal set-environment -gu PORT

Panes opened after that are clean; existing ones keep it until they are closed. Restarting the machine has the same effect.

The launcher may now refuse a port it used to accept

This is the change most likely to surprise you, so it is worth knowing why.

Before, starting a second MulmoTerminal on a port the first one was holding would print ✓ MulmoTerminal is ready — pointing at the server that was already running — and only then fail. The check that was supposed to catch it asked about the wrong address, so on a default install it never fired at all.

Now the launcher checks every address the launch actually needs, before starting anything:

[mulmoterminal] Port 34567 is already in use.
  If that is MulmoTerminal, it is already running at http://localhost:34567
  To start a second one anyway: --port <number>

If you set MULMOTERMINAL_HOST, one more thing is checked. Whatever address you bind, MulmoTerminal’s own sessions reach it over 127.0.0.1 — the GUI MCP writes that address literally, so hooks and the GUI tools go there regardless of what the browser uses. If something else is holding 127.0.0.1:<port>, the launch stops rather than starting a server whose own cells cannot talk to it.

Free that port, or pick another with --port.

And if you use MULMOTERMINAL_HOST

Two fixes land here, both about the server being reachable by its own sessions.

  • A specific address no longer cuts the server off from itself. Setting MULMOTERMINAL_HOST to a LAN address used to make hooks fail on every tool call and leave the GUI MCP stuck on “still connecting”. The server now also listens on loopback when the address you named does not serve it.
  • The URL the launcher prints is the address it checked. It no longer says localhost, which resolves to both ::1 and 127.0.0.1 and can send your browser to a different process than the one that just started. For a default install you will now see http://127.0.0.1:34567 where it used to say http://localhost:34567 — the same server, named precisely.

The security warning about binding a non-loopback address is unchanged, and still worth reading: this server has no authentication of its own.

Everything else

No setup needed for any of it.

  • An LLM rewriting a MulmoScript now updates the canvas you already have open. Previously you had to close and reopen it. Every beat type is editable, and a single beat can be replaced without resending the whole script.
  • TeX formulas render in a document preview. $…$ and $$…$$ are drawn as MathJax SVG, the same as the Marp deck side of that document already did. US$5 and $5-$10 stay as text.
  • The shared-app templates ship a real stylesheet each. Pages generated from them arrive styled rather than as grey boxes, with each template on a hue of its own.
  • A project board no longer lets a registration be mistaken for a claim. Pressing 「これをやります」 before registering used to leave people believing they had taken the work; the board now carries you back to that row once you register and says plainly what did not happen.
  • todo-board has been removed — use project-board, which does everything it did.
  • Groundwork for Campaign Mode landed, unwired: a task state machine, a durable record, and a claim registry for path exclusivity. Nothing changes in the app yet.

The living reference for all of this is the guide — this page is a snapshot of 2026-08-28 and will not be updated as the app moves on.


This site uses Just the Docs, a documentation theme for Jekyll.