mulmoterminal@4.12.0
Highlights
Released the same day as 4.11.0. A fix for an upgrade that came up with an empty grid, one launch form that opens beside whatever you are looking at, a storyboard edit that was silently doing nothing, and OpenRouter prices that had drifted from the catalog.
Setup guide: The launch panel, and getting your grid back (日本語)
The browser opens at localhost again, so your grid comes back (#1889, #1891)
4.11.0 started opening http://127.0.0.1:<port> instead of http://localhost:<port>. Nothing errored, and the app came up empty: the grid layout, the theme, the font size and eleven other preferences live in localStorage, which browsers partition by origin, so a different hostname is a different drawer. Sessions were all still running in tmux and nothing on screen connected the two.
If you upgraded to 4.11.0 and your grid was blank, this restores it — the layout was never deleted, only filed under the other hostname, and that is the hostname the launcher opens again.
One thing to know if you rebuilt your grid during 4.11.0: that newer arrangement is on http://127.0.0.1:<port> and stays there. Open that address directly to get it back. The app cannot fetch it for you — measured on Chrome, a page cannot read another origin's localStorage even through an embedded frame, and requestStorageAccess() does not change that.
The port fixes from 4.11.0 are untouched. The second-instance guard still probes the address the server will bind, and the readiness check still polls the address the server reports binding — what changed back is only the URL handed to the browser, which is a name your saved state is filed under rather than a claim about which socket answered.
localhost is now used only when the launcher has checked that nothing else can answer to it. localhost resolves to [::1] as well as 127.0.0.1, and the startup probe never asked about the first of those — so before opening anything, the launcher tries to take [::1]:<port> too. If something else already holds it, the browser goes to the address that was actually checked, and the banner says so and tells you where your layout is filed. Closing the remaining window is tracked as #1893.
If you set MULMOTERMINAL_HOST to reach the app from another machine, the banner now names that address on its own line.
One launch form, opening beside what you are looking at (#1867, #1890)
The launch form used to be a cell: pressing + appended an empty square at the end of the grid, so the thing you were starting appeared as far from your attention as it could get, and in the zoomed views it had nowhere to appear at all.
It now opens as an overlay at the right edge of the stage, the same way in every view mode — tiled grid, cockpit roster, filmstrip.
- The toolbar
+opens it on the workspace directory. - Every terminal's header gets a
+that opens it on that terminal's directory — starting a second agent where you already are, without retyping a path. terminal-newin the keymap now opens the panel; a newterminal-new-hereaction is the header+.terminal-new-adjacentis unchanged — still a shell in this directory, immediately, with no form.
While the panel is open it owns the keyboard, so Escape closes it and typing goes to the form rather than to the terminal underneath. Closing it returns focus to whatever opened it.
presentMulmoScript replaced a beat and reported success without writing anything (#1880, #1886)
Calling presentMulmoScript with filePath + beatIndex + beat — the documented way to replace a single beat — returned a normal 200 with the usual script payload and left the file unchanged. Nothing in the response told the caller apart from a plain re-display, so an agent editing a storyboard would report the edit as done.
Two causes, both in the tool's argument handling: the allowlist dropped beatIndex and beat before the package ever saw them, so the request arrived looking like a re-display; and even once written, script-changed was not published, so a canvas already showing that file kept the old content. New files looked fine because the response opens the file fresh — only in-place edits were affected.
OpenRouter prices in the model picker match the catalog again (#1849, #1887)
pricePerMTok is documented as the provider's published price, and 16 of the 27 OpenRouter presets had drifted from openrouter.ai/api/v1/models, some by more than 2x in either direction — gpt-5.6-luna read 1.0/6.0 against an actual 0.2/1.2, deepseek-v4-pro read half its real price. One contextLength was double the real window (nemotron-3-ultra, 524288 → 262144).
All 27 now agree with the catalog exactly, read on 2026-08-28 and checked programmatically. The frontier presets are ordered cheapest-first again, which the price refresh had scrambled.
📦 npm: mulmoterminal@4.12.0
What's Changed
- fix: refresh OpenRouter prices in modelPresets from the catalog (#1849) by @isamu in #1887
- fix: presentMulmoScript のビート差し替えが黙って無視される (#1880) by @isamu in #1886
- feat: open the launch form as a right-side panel, in every view mode (#1867) by @isamu in #1890
- fix(cli): ブラウザに渡す URL を localhost に戻す —— 4.11.0 で grid 配置が旧 origin に置き去りになっていた (#1889) by @isamu in #1891
Full Changelog: 4.11.0...4.12.0