Repository navigation
Releases: lzyling/meshcue
Release list
MeshCue 1.5.0
A minor release with one deliberate behaviour change: every format is now drawn +Z up.
Viewing
- All formats display +Z up, -Y front, +X right by default. GLB/glTF exported Y-up (the glTF convention) must now be published with
up: "y". This is the one approved break in 1.5; everything else below is additive. - Orthographic views, CAD-style navigation, a view cube and a Pan tool; reworked Home and fit-to-selection, mouse and touch.
- Five display styles, source edges and transparency; some view preferences persist.
- Section view clips picking and mark overlays, with part colours and constant screen-space hatching (open surfaces are not promised a closed cap).
- Smart measurement picks and pairs objects by default; explicit measurement types stay under Advanced. Readings are review data, not edit targets.
- Reorganised toolbar menus, tabs, marks/parts sidebar and settings; fixes for narrow screens, menu overlap and consecutive picks.
- Feature-edge marks and whole-part/group marks, with per-mark colour/letter display, leaders and surface anchors.
- Interactive assembly explode with cached, two-level collision-free targets; marks keep their own geometry frame.
- Optional performance overlay, first-use hints and update notices; consistent short labels across six languages.
Import and parts
- Offline decoding of Draco, Meshopt and quantized GLB; a glTF with local resources in its folder is packed into one immutable GLB.
- Triangle strips and fans are accepted; skipped lines and points are reported to the Agent. The texture budget counts decoded GPU bytes, not compressed file size.
- STEP assembly hierarchy is preserved, with part visibility and transparency, and optional Agent-supplied part groups shown alongside the file's own tree.
Agent interface
- OpenClaw, MCP and CLI share one contract source. Action and field references in AGENT-INTERFACE.md are generated from it, gaps such as
retainon OpenClaw are filled, and discovery schemas are about two thirds smaller while the runtime still validates strictly. Unknown fields are now refused on every entry. openprechecks the mesh and refuses an over-limit file before starting or changing anything, with a structuredremediation(decimate, smaller file, fewer textures, re-export geometry). Limits are unchanged.status.viewerreports whether a client has loaded the current version since this open (for STEP, by the converted mesh's SHA). This proves loading, not that a person has looked or agreed.read.gatesstates whether a batch was sealed by the system, refers to an older version, has notes, and whether confirmation is required before any change.- The rule everywhere is now the same: echo what you understood and wait for the user's confirmation before changing the model; once confirmed, publish the next version normally. The batch push no longer says "do not replace the model".
status.statedistinguishes running, stopped and idle-stopped, with what to do next; idle-stop records are bound to the service launch that wrote them.- On Windows, an npm-installed
openclaw.cmdis run through Node and its verified JS entry point, never through cmd, so arguments containing& | ^ % ",< >or newlines arrive unchanged. An unrecognised shim fails closed. - New CLI/MCP reviews bind to loopback unless a host is given.
Coordinates and rotated review copies
- Every position in
readis labelled with itscoordinateSpace. Pins and painted patches, which are mesh-local, also returnfilePosition,fileNormalandfileVertices, so nested GLB nodes no longer need converting by hand. Existing fields and values, includingspace: "model", are unchanged. open.sourceTransformregisters a rigid rotation (and optional translation) from a source model to the review copy.readthen returnssource*fields for editing the original. Scale, shear and mirroring are refused. The same bytes with a different registration are a separate version.- AGENT-INTERFACE.md now says how to decide which way is up from what the model is, not from export axes, and how to publish a rotated review copy.
Agent guide and help
- The Skill is now a rule card (R1-R10) plus publish / receive / revise / recovery flows, about 10k characters instead of 18k. MCP
initializesends only the card and document paths (about 2.4k); set MESHCUE_FULL_INSTRUCTIONS=1 to get the full text. - Reviewer help in all six languages matches the contract: the Agent explains and waits for confirmation before changing the model; tabs list the versions currently visible (old ones can be hidden, never deleted); STEP originals are delivered by the Agent in conversation; limits are 80 MiB and 600,000 triangles.
open.reviewLifetimedescribes the idle policy actually in force.
Unchanged
- Claude Code, Codex and the CLI still cannot be woken by a submission: the page offers a sentence to paste into the conversation. OpenClaw delivers it automatically.
Tested
- macOS: Node 24 and 22 unit/integration suites, the full real-Chromium suite, package build and package smoke test.
- Real Windows 11: the full Chromium suite (one screenshot comparison failed once and passed when run alone), and a real npm-generated openclaw.cmd passing 11 metacharacter arguments unchanged. Several Node tests still assume POSIX and fail on Windows, as in 1.4.2; they do not affect the product.
- Cold sessions with two agent models across seven review scenarios: the stronger model completed publish, echo, confirmation and revision, with exact source-coordinate conversion; the weaker one did not finish the multi-turn flow. No wording or interface conflict was found.
Not claimed: an installed OpenClaw 1.5 acceptance run before this tag, real old MCP clients, generic STEP placement and unit correctness, 3MF, animated or skinned models.
This release is commit d436f35.
MeshCue 1.4.2
Windows bug-fix release (#11). On Windows, open never started the workbench; it does now.
- The bundled release cache no longer fails its own verification on Windows (CACHE_CHANGED). Cache identities on macOS and Linux are unchanged.
- On Windows the Agent channel is a named pipe with a fresh random name per start, recorded only in the project's private state. The runtime directory is restricted to the current user, SYSTEM and Administrators, and setup fails closed if that cannot be done. The client proves it is talking to its own server before sending anything; a pre-existing pipe of the same name makes the server refuse to start. Connections that send nothing are dropped after 5 seconds.
- Workspace paths returned to the Agent (
project, precheckfile) use/on Windows too, so they can be passed straight back. - MCP
initializeinstructions no longer include the Skill's YAML header when the checkout uses CRLF line endings. - README notes that an older Claude Code may not support the archive plugin source; update Claude Code if
claude plugin installreports that. - Dependencies: proxy-addr 2.0.8, source-map-js 1.2.2.
Tested on a real Windows 11 machine: CLI, packaged plugin and MCP each opened a review, a mark was placed in Chromium, submitted and read back, including under a restricted (non-administrator) token. Known limits: a true Medium-integrity user session, cross-user and remote SMB access were not tested; other local accounts can still open the pipe read-only (they cannot send requests). Several tests in the Node suite still assume POSIX and fail on Windows; they do not affect the product.
Thanks to @ccj241 for the detailed report.
This release is commit bf2972a.
MeshCue 1.4.1
Nothing in MeshCue itself changes in this release. It moves the README forward
so that the page people land on shows what 1.4 added.
The README now opens with a 51-second film of the 1.4 release: measuring on the
model in four ways, a note on a mark, each mark keeping the view it was made
from, the page naming the agent and following the batch sent to it, the
agent's cyan echo of what it will change, and the two commands that install
MeshCue as a Claude Code plugin. It is an animation, rendered from code with
Remotion, and the drone frame in it was made for the film; the recording under
it is still the application itself. A vertical Chinese cut is in the
announcement, discussion #10, and the 43-second film from 1.3 stays in
discussion #9.
The Claude Code plugin marketplace and the install lines now point at this
release, whose package is built from the same code as 1.4.0.
This release is commit 4f43766.
MeshCue 1.4.0
What the reviewer means now reaches the agent, not just where they clicked.
A mark can carry a note. Pins and regions take up to 200 characters of text,
written under the list of marks, and it travels with the batch. An agent is
told to treat a note as the reviewer's own words about that mark, worth the
same as something said in the conversation: it echoes what it understood
before changing anything, lists a note and a chat message that disagree
instead of choosing between them, and treats the text as data about the model
-- a command or a link in it is never followed. The push that announces a
batch says only that a mark has a note; the words themselves reach the agent
through read, as a field.
Every mark records the view it was made from: the camera in the model's own
coordinates and units, which way was up on the reviewer's screen, the field of
view and the aspect ratio. It is taken when the mark is placed, painted, moved
or given a note. The batch's camera keeps its meaning, and a mark made before
1.4 falls back to it.
The reviewer can measure the model. Measure in the toolbar offers point to
point (snapping to a corner within 10 pixels), the length of a straight edge,
two faces (their distance when parallel, otherwise the angle between them) and
the circle through three points on the rim of a hole or shaft, which gives its
diameter and centre. On a STEP the edges and faces are the file's own, so a
tangent edge or a shallow chamfer can be measured and a curved face is refused
rather than approximated; GLB and STL are measured on their triangles.
Millimetres show two decimals; a model that declares no unit shows the bare
number and says so. A measurement is only for the reviewer until they keep
it: then it becomes a mark of its own, M1, M2, that can carry a note ("make
this 22 mm"), be undone or deleted, and is sent with the batch, with its
points, the triangles it was taken from, its value and its unit. The service
refuses a measurement whose numbers do not agree with its own points.
The page calls the agent by name. open takes an optional agentName (up to
24 characters, plain text), and where the tool it runs in is known the page
writes that after it: "Send to Ada (OpenClaw)" instead of "Send to the
Agent", with full-width brackets in Chinese and Japanese. An agent that gives
no name is named after its tool alone -- OpenClaw, and over MCP Claude Code or
Codex from the client's handshake -- a name given through the CLI stands
alone, and otherwise the page keeps its own word for an agent. open and
status report both, as agentName and agentTool.
Once a batch is sent, the page follows it: how many marks went, that it is
waiting for the agent to read it, that the agent has read it and when, and
when its understanding arrived. Where nothing can wake the agent -- an MCP
client such as Claude Code or Codex, or the CLI -- the page says so and offers
one sentence to paste into its conversation, naming the project and the
batch, with a button that copies it. Under OpenClaw, a batch sent from a
Telegram conversation gets a line in that conversation as soon as the host
accepts it, "📐 Marks received: 3 (B–D). Handed to Ada (OpenClaw), reading
them now…", which changes to say so once the agent has read them.
The agent's echo looks like nothing a reviewer draws. A reviewer's mark is a
solid, still fill; an echo is a moving dashed line with a soft glow along the
edges of each place the agent means, in a cyan none of the reviewer's paints
use. It is drawn above the reviewer's marks, but only as wide as a line, so
where the two meet both stay visible, and a screenshot, which stops the
movement, still shows the dashes. A new echo's glow pulses twice; with reduced
motion the dashes stand still. An agent is told to mark only the places it
intends to change, and only once the reviewer has asked for a change: a batch
that asks for nothing is answered in words, and the reviewer's own marks are
never handed back to them.
MeshCue can be installed as a Claude Code plugin:
claude plugin marketplace add lzyling/meshcue
claude plugin install meshcue@meshcue
The plugin is the package attached to this release, already built, so the
install runs no build and no npm install. It needs Node.js 22 or later on
PATH, and works in the directory Claude Code was started in. meshcue-mcp
now reads its workspace from MESHCUE_WORKSPACE when a host starts it
somewhere else, and refuses every call with WORKSPACE_INVALID when that is not
an existing absolute directory.
Going back to 1.3.x after using 1.4: an older page sends a note back as it
found it and the older service refuses it, so a draft that has a note
cannot be edited there, and an older read silently leaves notes out. A
draft with a kept measurement is worse: the older page cannot draw it at
all, and the older service will not store it. Submit or finish a round
that has notes or measurements before going back.
Also:
- A pin's letter no longer shows for a frame in the top-left corner of the
view when the marks are drawn again. - A review opened through the CLI or MCP now takes the reviewer's marks.
Since 0.9.0 it refused every write from the page as if MeshCue had been
uninstalled, because it looked for a file only the OpenClaw package has;
the page opened and nothing could be marked or sent. Reviews opened from
OpenClaw were never affected. - In German and French, painting a region violet no longer fails to save: its
name was longer than the 12 characters a region name was allowed. - A STEP written with lowercase hex escapes, as SolidWorks writes them, gets
its part colours: the names are matched again. - Part names that a STEP stores as UTF-8 read back as Latin-1 are restored,
so Chinese names reach read intact where the file still holds the bytes. - A GLB with morph targets is refused by the service, with ANIMATED_MODEL,
instead of being accepted and then refused by the page every 2.2 seconds.
The page stops fetching again any bytes it will refuse the same way. - STL has no colour, and the help and the agent documents now say so: send a
STEP or a GLB for colour. - Vite 8.3 builds the page, with Rolldown instead of Rollup. Nothing a
reviewer or an agent does changes; the bundle is a little smaller.
This release is commit bb8db68.
MeshCue 1.3.2
Nothing in MeshCue itself changes in this release. It moves the README forward
so that the page people land on shows what MeshCue is for.
The README now opens with a 43-second film: a review held in words that goes in
circles, then the same review done by pointing -- lettered pins, a painted
plate, the agent reading positions, echoing what it understood, and publishing
the next version while the old one keeps its marks. It is an animation,
rendered from code with Remotion, and the drone frame in it was made for the
film. The recording under it is still the application itself. A vertical
Chinese cut is in the announcement, discussion #9.
The roadmap is on the front page as well: 1.4 carries what the reviewer means
to the agent -- which way was up on their screen, a short note on a mark, a
measurement attached to one; 1.5 opens every valid GLB as its author made it;
1.6 shows a GLB as intended -- animation poses, LOD sets, material variants;
1.7 adds review aids for game assets; 2.0 plays animation. They are plans, not
promises, and the order can change as people use it.
docs/media/social-card.png is the new link preview.
If 1.3.1 is installed there is nothing to update for: the code is the same.
This release is commit 55751bc.
MeshCue 1.3.1
STEP and STL now stand upright. Neither format records which way is up, and
MeshCue drew both as if +Y were, so anything modelled Z-up -- every build123d,
CadQuery or OCCT part, and every STL a slicer has touched -- lay on its side.
Both are now drawn with +Z up, -Y towards the reviewer and +X to the right. GLB
is unchanged: glTF defines +Y up itself. There is no setting for it. A model
built another way should be rotated before it is published, and
AGENT-INTERFACE.md now says so. Marks are unaffected: pins and region extents
stay in the published file's own coordinates.
If you have been rotating STL files to Y-up so that they would stand in
MeshCue, stop: they will now lie down.
The colours a STEP declares on its solids now reach the page, and so does its
transparency. The bundled tessellator reads a colour only where it is filed
against a whole part, so a part made of several solids -- a coloured compound
in build123d, a multi-body part in CAD -- came out grey, and nothing was ever
drawn translucent. MeshCue now reads the styles from the file itself, and gives
them only to meshes it can check against the solids they came from. Across
1,024 real STEP files, meshes with a colour went from 6,601 to 7,896, 465
gained their opacity, and no colour the tessellator had read changed. Meshes
made by 1.3.0 are kept as they are, because marks are anchored to them:
publish a STEP again to see its colours.
Looking straight down or up from the view cube no longer changes how the right
button turns the model. It used to switch the camera's up vector, which the
orbit only reads once, so a sideways drag afterwards hardly turned anything
until a side face or home put it back.
Publishing the same STEP again reuses its mesh instead of tessellating it
again, and a STEP no longer needs precheck: open measures it while importing
and refuses it the same way, so a round tessellates once instead of twice. A
STEP is labelled in millimetres, which its mesh always is.
Also:
- A converter that crashes says what it crashed on.
- A package with a part missing says which part, instead of a bare ENOENT.
- inspect reports the build that is running, not the one on disk.
- A project whose folder was deleted leaves the registry, instead of being
warned about at every Gateway start and stop. - A clone runs from itself: samples go to tmp/samples, published copies to
runtime/models, and nothing is written two directories above it. - three-mesh-bvh 0.9.15, zod 4.6.5, prettier 3.9.8. three.js stays at 0.180.
This release is commit 106e6c9.
MeshCue 1.3.0
Release 1.3.0
This release is commit 75c002d.
MeshCue 1.2.0
The wheel now means the same thing on every device. A mouse and a trackpad are
both pointerType: "mouse", so the wheel was the only thing left to tell them
apart — and on macOS there is nothing to find: both go through the same scroll
acceleration, so a mouse notch arrives small and often fractional, exactly the
shape a trackpad glide has. Every Mac was therefore read as a trackpad and had
its wheel turned into a pan, including a laptop with a mouse plugged into it.
Detection is removed rather than improved. The wheel zooms on every device,
Shift and the same gesture pans, the middle button still pans, and pinch still
zooms. The pointing-device setting and its stored preference go with it.
If you work on a trackpad: a two-finger drag now zooms. Hold Shift to pan.
The version beside the name says when your copy is behind. A badge appears when
a newer release exists and links to its notes. It offers no button — a reviewer
was handed a URL and is usually not the person who installs anything — so it
says to ask your agent, which is also the honest shape of the part still open:
nothing yet lets a page ask an agent to act.
This is the first outbound request MeshCue has ever made, and the service
makes it, not the reviewer's browser. One machine, at most once every six
hours, and only while somebody has a review open. Nothing leaves but the
request itself — no version, no project, no identifier, no review content.
SECURITY.md gains a section naming the single host, what is sent, how often,
and the word that stops it: REVIEW_UPDATE_CHECK=off returns the service to
making no outbound requests at all.
192 node cases, 74 in real Chromium, 11 install cases. The pointing changes were
also driven by hand on macOS and on Windows, with a mouse and with a trackpad.
This release is commit 54f5643.
MeshCue 1.1.1
The repository now shows what it does. No product code changed in this
release: it is the README, the pictures in it, and where work happens.
-
The README opens with a recording of the loop — turning a model with the
right button, dropping lettered pins, filling a face with the bucket,
handing the batch over. It is recorded from the application by
npm run demo: a real server, a real publish, real Chromium. The Agent at
the last step is the test double the suites use, and the caption says so. -
A shared link previews as the workbench instead of GitHub's generated grey
card. The card is built from the viewer the application draws, in the same
run as the film, so the two cannot disagree about what this looks like. -
CI and licence badges.
-
devis where work happens;mainis only fast-forwarded from it with the
tag going on straight afterwards. CONTRIBUTING.md has the whole of it.
Fixing a defect no longer needs a release to reach someone who will try it.
Outside scripts/ and the documents, the only changed lines are version
numbers. 189 node cases, 71 in real Chromium, 11 install cases.
This release is commit 75146bc.
MeshCue 1.1.0
Every model looks different in this one, and the ones that carry their own
colours look different by a lot.
A modelled scene of a hundred and thirty materials was coming back as a flat
sheet of near-white: canopy at 241, walls at 228, thirteen levels of separation
for an entire building, with nothing clipping and every colour converting
correctly. ACES is a film curve and it was doing what a film curve does — roll
everything bright together, and take the hue with it. The work in 1.0.2 and
1.0.3 had never touched this, because both were about models that arrive with
no materials at all.
The viewer now tone maps with Khronos' PBR Neutral, the curve meant for showing
an object rather than grading a frame. On that same scene it nearly doubles the
tonal range the model occupies and doubles what is left of its colour.
The lamps were set against a shoulder that is no longer there, so they come
down — the two overhead by well over half, the hemisphere barely at all. They
are not doing the same job: the hemisphere is the only light that reaches a
face pointing away from the lamps, and scaling all three together halves every
underside in the scene.
The grey given to a model with no materials of its own is solved again for the
new lamps, against the same rendered result that was approved for the old ones.
An unpainted part keeps the appearance it had; its shaded side is brighter than
it was.
Plain view had been painting with a second grey that agreed with the first by
luck until the first was tuned. Pressing Plain on an already unpainted model
made it brighter — the one model where that button has nothing to do. There is
one grey now.
Nothing about the tools, the disk format or the agent contract changes.
Install: npm i -g "github:lzyling/meshcue#v1.1.0"
This release is commit fabea01.