Release Notes — v0.0.43
Covers changes from v0.0.42 to v0.0.43.
This is the biggest FluidCAD release so far, and the first with a desktop app. Sketching moved to a constraint solver — a breaking change to the sketch language, and the one that makes sketches behave like they do in every other parametric CAD. Assemblies arrived: insert parts, mate them, drag and animate the mechanism, export the whole thing as one STEP.
Desktop app
FluidCAD now installs like any other app. Downloads for every platform are on the release page and linked from the installation guide. The app is optional: npm i fluidcad and npx fluidcad serve still run the same product in your browser.
- Windows (x64 installer), Linux (AppImage and
.deb) and macOS (Apple Silicon dmg and zip). - The whole product in one window: 3D viewport, every modeling tool, and a built-in code editor with completion driven by the engine's own types. Open it from the panel rail or with Ctrl+B.
- A start screen with recent projects and thumbnails; File → New Project… scaffolds a project in an empty folder.
- Updates are silent, Chrome-style: checked in the background, installed on quit, with a Restart to Update menu item while one is staged.
- Projects pin their engine version in
fluidcad.json; the app downloads the pinned engine when a project needs one it does not have. - The macOS build is signed and notarized. The Windows build is not signed yet — SmartScreen shows Windows protected your PC on first launch; choose More info → Run anyway. A signing solution is still being worked out.
The VS Code and Neovim extensions will be dropped starting from the next release. The desktop app and npx fluidcad serve cover what they did — the built-in editor completes against the running engine, and any external editor still works alongside the served viewport, since the model rebuilds on save. v0.0.43 is the last release that ships them.
Constraint-driven sketching (breaking)
Every sketch is now solved. You draw lines, arcs and circles, and constraints say how they relate; the solver moves the geometry until every relationship holds. Drawing with the tools writes both the geometry and the constraints for you, and dragging a vertex in the viewport moves the whole sketch through the solver.
What was removed
The chained "pen" sketcher is gone, along with everything that only made sense for it. Files that use these forms fail with a pointed migration error naming the replacement.
- The relative chain commands:
hLine,vLine,tLine,aLine,tArc,tCircle,connectandmove. Draw withline(),arc()andcircle()and let constraints hold the relationships. - Chained qualifiers on segments, and the mini toolbar that converted segments between forms. Constraints replace both.
trim()andsplit(). The'll be re-written to work well with the new sketcher.- In-sketch
rotate()— orientation is owned byangle,horizontalandvertical. local()— usexAxis()andyAxis().- The third
sketch()argument that selected a mode;text()anchors at the plane origin (.at([x, y])moves it) andellipse()requires a center.
The fastest migration is to redraw the sketch with the tools: the emitted code is the solved form. Every guide, tutorial and example on the website has been rewritten for it.
Assemblies
Open a .assembly.js file and the toolbar switches to assembly tools, with Parts, Connectors and Joints on the left rail.
- Insert lists every exported part and sub-assembly in the workspace; queue instances by clicking tiles. Parts that declare
param()get one form per instance, written asinsert(def, { … }). - Connectors are the mate frames:
connector()on a face, edge or vertex inside a part, picked with a hover gizmo;connector('name', [x, y, z])places a free frame at assembly level.expose()publishes a part's geometry for other parts and assemblies to build on. - Mates: fastened, revolute, slider, cylindrical, planar and tangent, plus
.grounded(). The joints panel edits and deletes them, failing mates report how far they missed, and deleting a part sweeps every mate that referenced it. - Motion: drag a free part with the transform gizmo and the mates hold; the Animate bar drives a revolute or slider joint in Loop or Reciprocate mode.
- Replicate:
replicate(seed, targets, rows)copies a mated instance or sub-assembly onto new mate targets — a bolt placed once, repeated onto every hole. - Sub-assemblies: an exported
assembly()definition inserts into another assembly like a part. - Export the whole assembly as one STEP with its tree intact (instances, locations, nested sub-assemblies, part names), or as a flattened STL.
- Measure works across instances, including the ones the solver moved.
Two part-definition changes are breaking: .with() is gone — insert(def, values) is the one way to pass parameters — and a part callback no longer publishes geometry by returning it; use expose().
Also in this release
- Units: a project (
fluidcad.json) or a single document (unit('in')) can work in mm, cm, m, in or ft; export, import and every readout follow. - Share button in the top bar opens the model in the online viewer at viewer.fluidcad.io.
- Selection filters gained rank (
nearest,farthest,nth,largest,smallest) and convexity (convex,concave,smooth) atoms, andr.instance(k)addresses one instance of a 3D repeat. - Timeline: three nesting levels so a sketch's curves and constraints show inside their
part(); deleting a feature warns with the list of dependants and removes the closure; multi-select rows and drag them into a part. - Parameters panel is scoped to the active part and edits declarations, not just values.
- Files: drag tabs to reorder, rename in place, and every relative import that pointed at the file is rewritten.
helix().ccw()for right-handed winding, and a Part tool that appends an emptypart()from the toolbar.fluidcad initscaffolds a constraint-sketchedbox.part.js.- MCP:
resolve_selectionevaluates filter expressions live,interferereports clashes between solids, and every render reports what changed with before and after bounds. - Security: the server binds to the loopback interface only and refuses non-local
Hostheaders.
Bug Fixes
- Booleans: cut edges and internal faces follow the result topology through OCCT history, so later features that reference a rim or wall reshaped by a cut keep resolving.
- Extrude: symmetric and two-distance extrudes merge the seam edges left at the mid plane; up-to-face follows the sketch normal when the target straddles the plane.
- Fuse: junction circles no longer split into arcs at the inputs' closure vertices.
- Cut: through-all tools are sized to the stock instead of a fixed 100 m stand-in, which had blown up boolean tolerances on repeated cuts.
- STEP export: revolved cones with a negative semi-angle are written instead of silently dropped.
- Sketch on a face: the sketch plane is upright — axes derive from the face normal instead of the surface's own frame.
- Connectors: cylindrical and conical faces take the surface axis as Z with a canonical sign, with the origin on the axis.
- Desktop: the engine staging and pack scripts run on Windows.