A snapshot as of 4.20.0 (released 2026-09-11). 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
One thing here needs your hands: existing .shape files. Everything else is either new and
optional, or a fix that just works once you are on this version.
.shape models, read this firstShapeScript now reads a script the way the upstream ShapeScript app
does. That is the point — a model written from the upstream docs renders correctly here now, and a
model written here opens in the upstream app. But a .shape file you saved before this release
still parses and renders wrong: half the size, rotated differently, paths collapsed.
Open a model you saved earlier. If a sphere that used to fill the frame is now half as wide, or the whole thing is turned the wrong way, it needs converting. A model you make after upgrading needs nothing.
| What you wrote | What it means now | What to do |
|---|---|---|
size on sphere, cylinder, cone, circle, polygon, torus |
diameter, not radius | double it — the first component for a cylinder or cone, all of them for a sphere |
rotation X Y Z in radians |
orientation roll yaw pitch in half-turns |
negate each axis and divide by pi; the old X becomes the new third component, the old Z the first |
rotate in full turns |
half-turns, clockwise positive | negate and double |
path point / curve as relative steps |
absolute coordinates in the path’s frame | rewrite as absolute points; the old four-argument curve x y cx cy becomes a curve cx cy control point sitting between two points |
tau |
not an upstream name | 2 * pi, if the file must also open in the upstream app |
Three real models were converted and checked mesh-for-mesh while this landed, so the rules are the ones that were actually used, not a guess.
seed N reseeds rnd for its block, so a random arrangement can be reproduced.path may carry its own position / orientation / size — how a loft section is placed.max(0 (j - 1))..first … .last ordinal members.MulmoClaude shares the same artifacts/shapes/ files, so both apps moved together. If you run
both, upgrade both — one on the old reading and one on the new would draw the same file two
different sizes.
Reference: Canvas and the GUI panel.
A ShapeScript model can now leave MulmoTerminal as a USDZ — Apple’s AR format. AR Quick Look places it in the room on an iPhone or iPad; Quick Look previews it on a Mac.
Two ways, no setup for either:
exportShapeScriptUsdz tool takes the same source as
presentShapeScript — inline script, or a .shape you point it at — writes the file beside the
model under the workspace’s artifacts/shapes/, and answers with the full path. It runs without
asking for approval: it serialises geometry into one local file and reaches nothing outside the
workspace.It sits in the Canvas (render MCPs) tool group with the other two ShapeScript tools, so if you have that group switched on for a directory, you already have this.
Reference: How each agent reaches the GUI tools.
If you keep a MulmoScript deck anywhere other than the workspace’s own artifacts/stories/ — in a
project repository, say — opening it in the Canvas worked, and then every beat image and every
save answered File not found. The Edit tab kept the text you typed, so it looked saved.
There is nothing to turn on. Open the deck again on this version and the beats render and the saves land. If you had given up on a deck because of this, it was never your file that was wrong.
One detail worth knowing if you reach your workspace through a symlink: the card is now filed under the resolved path, so opening the same deck through either spelling gives you one card rather than two.
Reference: The Mulmo menu and the Canvas.
On a grid of about twenty cells, pressing a cell’s conversation button opened a menu 1750 pixels tall in an 800-pixel window, with nothing on the page that would scroll — so the ROUND TABLE settings and its Start button simply could not be reached. The workaround was zooming the browser out to 50%.
The menu now measures the room it has, opens upward when that is roomier, and caps its height. The long lists scroll on their own, while Start, room, turns, stop and watch stay outside those scrollers so they do not scroll away from you.
How to tell you have it: open the conversation menu on a crowded grid. The menu ends inside the window, and Start is visible without scrolling.
Reference: Starting a round table.
The same speech bubble meant four different things, and two of them sat side by side in the cell header — so you could not tell which was which before pressing one. The prompts button (a list of what you sent, nothing to do with a conversation) is now an outbox tray. The talk-to-another-terminal button keeps its bubble and its tooltip now says what it offers: bring in the last turn, exchange a turn, start a round table.
How to tell you have it: look at a cell header. The two buttons are different shapes.
The “Update” pill in the toolbar was painted with the browser’s default button colour — a light grey no theme ever chose — so on nord and midnight the text on it was nearly invisible until you hovered it. Measured at 1.74:1 in nord, where 4.5:1 is the readable bar.
It now takes the theme’s own surface: 5.03:1 in nord, 4.91:1 in midnight, 5.17:1 in daylight. The same fix covers every button in the app that never named a background — the Copy button inside that badge’s own dropdown was doing it too.
Before, in nord — the pill painted with the browser’s button face:

After, the same pill on the theme’s own toolbar surface:

How to tell you have it: switch to nord or midnight with an update available. The pill reads without hovering.
Reference: Make your own colour scheme.