SolidCraft is open-source parametric 3D CAD in Rust: sketch, constrain, extrude, and change a
parameter to watch the timeline rebuild. Documentation
· try it in the browser ·
contributing ·
issues. AI agents can model with it over MCP:
solidcraft-cli mcp (how).
Why 0.9: this is a minor bump because the design file format moved to version 17, and
because it adds many new features.
What's new
- Face actions work on about 90% of flat faces. Sketches, offset planes and press-pull now
attach to sheet metal rims and holes, plastic features (Boss, Lip, Rest, Snap Fit), lofts,
revolved faces, pieces Offset Face moved and walls a Join merged
(#677, fixing
#681). Across the test models: sketch
75% → 90%, offset plane 75% → 90%, press-pull 64% → 85%. - Joins: a logo-style part with pieces extruded up and down from one sketch now joins
(#679), faces that only partly overlap
fuse correctly (#704, fixing
#674), and booleans build the same body
every time (#748), so a design rebuilds
identically on every run. - Sketch: type a dimension right after picking (D, click, type;
#695); redundant but consistent
constraints are accepted, such as a rectangle clover
(#699); tool windows for Scale, Offset,
Mirror, Move/Copy, Fillet and Chamfer and the rectangular pattern (thanks @wdunn001), shown
next to the Sketch Palette, which now lists the running tool's options; a typed Rho for the
conic; a Construction Geometries row in the Sketch Palette that hides construction geometry
(#804); sketch tool shortcuts open a sketch on the selected plane; Edit Sketch from the viewport
menu. - Features: feature history on the left side with folders (opt in under Preferences;
#449); Convert to Sheet Metal from a solid
or shelled body by its bend edges (#725);
a tear corner relief (#809); tapered and
variable fillet radii (#675,
#749) with a radius spline you drag on the
edge (#752); free-form cut-outs stay exact
in sheet-metal flat patterns (#692) and edge
flanges run along what cut-outs leave of an edge
(#702); and Surface Extrude, sheets from
open curves and profile walls (#815). - View: Home and Fit frame only what is shown, and a middle double-click goes Home
(#701); a cube navigator option
(thanks @Karl-VonRichter, #664); the window
stays responsive and draggable while a design opens, with a Cancel button that stays put
(#643,
#686). - Quality: cuts no longer split walls they don't touch
(#670); booleans are faster and use less
memory (#714); STL export welds shared
vertices (#816); complete Japanese
translation (#753). - Fixes: pasted features act on the pasted bodies (#613); a refused OK's error clears when
you change the inputs (#641); dialogs show the units of their sizes (#630); the wheel over a
dialog's list scrolls only the list (#678); a Single hole picked at a circle's centre lands on
the centre (#657); axis or tangent plane on a drill tip works (#567); sketch text edits from
letter interiors and moves as a whole; a projected edge stays the edge you picked; a size from
a bare diameter keeps its unit (#716); Convert Mesh says how big a mesh is and what converts;
the Save changes prompt takes arrow keys and Enter. - MCP: agent skills for modeling and editing over MCP
(#728). - A new README demo and the SELENE rover showcase.
File format 17. Designs are now format 17 (solidcraft/17). SolidCraft 0.8 and older can't
open designs saved by 0.9, as a container or as JSON; they ask you to update instead. Keep a
copy of a file you may still open in 0.8. Files from every earlier version still open in 0.9.
Upgrading from 0.8. Nothing to do: open your designs and save (they're saved as format 17
from then on). Feature-history folders on
the left are off by default; turn them on in Preferences.
Known limitations
- Some through-all holes along a wall or beside curved faces still fail
(#559), as does a hole crossing an
equal-radius hole (#788). - Some fillets are still refused, such as along an outline of lines and arcs
(#431). - Some faces still can't take an attached sketch: a revolve's flat faces before a later feature
(#726) and faces after Split Body or
Combine Intersect (#565). - Fillet and chamfer accept an edge pick far from any edge and change the nearest one
(#783); Press Pull fails on faces beside
rounds (#562). sheet.foldrefuses a fixed point exactly on the sheet face
(#685), and some tabs on L-shaped or
collinear blanks can't be folded (#638,
#639); an edge flange with different
per-edge angles leaves gaps at the corners
(#501).- More in ROADMAP.md.
Upgrading from 0.7 or earlier. 0.8 changed the Linux app ID to ai.storyteller.solidcraft:
flatpak update offers to replace the old app, and the .deb, .rpm and AppImage remove the old
menu entry.
Upgrading from 0.5 or earlier. 0.6 renamed SolveCraft to SolidCraft and made the zip
container the default save format. .solvecraft designs, old settings folders and
SOLVECRAFT_* variables are still picked up, and solvecraft-cli still forwards to
solidcraft-cli. Want plain JSON? Use File ▸ Save As JSON… or --save design.json. On
macOS, replace SolveCraft.app with SolidCraft.app. Details:
compatibility notes.
Documentation, the browser app and the Flatpak feed use the SolidCraft project Pages URLs.
Which file?
- Windows:
SolidCraft-0.9.0-nightly.20261014.36.1-windows-x64.exeruns as is. Or install the.msi, or unzip the
-portable.zip(x64, x86 and arm64). - macOS 11+ (Apple silicon and Intel): open the
.dmgand dragSolidCraft.apponto Applications.
The CLI is insolidcraft-cli-0.9.0-nightly.20261014.36.1-macos-universal.zip. - Linux (x86_64 and aarch64, glibc 2.35+): the
.AppImage(chmod +x, then run it), the
.debor.rpm, the.flatpak(flatpak install --user <file>), the.snap
(sudo snap install --dangerous <file>, orsudo snap install solidcraftfrom the Snap Store), or the.tar.gz. - FreeBSD:
tar -xzf solidcraft-0.9.0-nightly.20261014.36.1-freebsd-x86_64.tar.gz --strip-components 1 -C /usr/local. - Web:
solidcraft-web-0.9.0-nightly.20261014.36.1.zipis a static site to host yourself. SHA256SUMS.txt:sha256sum -c SHA256SUMS.txt --ignore-missing.- Files without a version in the name (
solidcraft-windows-x64.msi,solidcraft-linux-x86_64.AppImage, …)
are the same packages under fixed names, for download links that always fetch the latest release.
For Flatpak feed installation and updates, add Flathub for the required runtime before
installing SolidCraft; keep both remotes in the same user installation:
flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
flatpak remote-add --user --if-not-exists solidcraft https://bherbruck.github.io/solidcraft/flatpak/solidcraft.flatpakrepo
flatpak install --user solidcraft ai.storyteller.solidcraft
flatpak run ai.storyteller.solidcraftFlatpak installs from 0.7 or earlier use the old ID ai.storyteller.solvecraft: flatpak update --user
offers to replace it with ai.storyteller.solidcraft, and settings move along.
Single-file .flatpak bundles include the runtime repository address; missing runtimes
still need an internet connection. Linux installation details.
The builds aren't signed yet. On macOS, right-click SolidCraft.app in Applications and choose
Open the first time (or run xattr -dr com.apple.quarantine /Applications/SolidCraft.app).
On Windows, SmartScreen may say "Windows protected your PC": More info, then Run anyway.
Licences are built in (Help ▸ About ▸ Licences, solidcraft-cli licences); the packages also
install THIRD-PARTY-LICENSES.txt.
What's Changed
- test: seeded goldens for the robustness seeds by @bherbruck in #826
- Display tessellation plans (3/4): display meshes from plans, GPU evaluation in the viewport by @jyviko in #805
- Export 3MF with B-rep face tags by @jyviko in #834
- Sketch Offset on two sides, or symmetric about the source by @wdunn001 in #807
- Fillet and chamfer: refuse an edge pick far from every edge (#783) by @HiroKenEz in #820
- Sketch text: live Edit Text from the Text tool, a font list, handles, and whole-text picking by @phanoob in #821
- fix: saving follows symbolic links and keeps the file's permissions by @lasselian in #845
- fix: contact and shell-grouping checks use a shared broad phase (#232) by @Mqrius in #838
- fix: joins, cuts and sketch profiles where outlines touch at a point (#588) by @froglemonade2 in #841
- fix: a base trimmed for an edge flange keeps the arcs of its outline by @NOWN-DEV in #839
- render: bounded cooperative HDR input foundation by @0xlillith in #837
- A tool window for the circular sketch pattern by @wdunn001 in #801
- Fix live hinge animation and Drive Joint slider previews by @bherbruck in #835
- Unstitch and Reverse Normal (#766) by @jyviko in #856
- feat: add and remove fillet spline points; handles on every edge by @jyviko in #855
- Cargo.lock: solidcraft-gpu at the workspace version by @bherbruck in #857
- Robustness goldens: record seed 0 after the tessellation plans by @bherbruck in #870
- fix: confine MCP agents' files to allowed folders; recovery discard deletes only recovery entries (#205) by @kravens in #578
- Cut an extrude's profiles that stand apart in one boolean (a text cuts 8-10x faster) by @phanoob in #848
- Robustness goldens: record the seeds the 13 October kernel merges changed by @bherbruck in #898
- fix(sheet): a hole square to a sheet metal panel is flat machining (#560) by @NOWN-DEV in #656
- docs: fix grammar issue in docs/book/src/guide/sheet-metal.md by @lunar-me in #893
- docs: fix grammar issue in docs/book/src/guide/sheet-metal.md by @lunar-me in #894
- docs: fix grammar issue in docs/perf.md by @lunar-me in #895
- docs(skills): correct slot, open rim and boolean retry advice in modeling skill by @ingvarch in #879
- fix: renaming a body no longer rewrites sketch text and other strings with its name by @jijinbei in #875
- ci: the nightly and Run workflow get their own concurrency group by @bherbruck in #877
- fix: control port needs a per-launch token; MCP tool annotations tell the whole truth (#205) by @bherbruck in #901
- Sketch text: bold and italic, text along a curve, alignment and spacing by @phanoob in #852
- fix: face projection walks through pinch points (boundaries touching at a vertex) by @Mqrius in #899
- Open large designs faster: name a moved body's faces only when asked by @bherbruck in #913
- Open large designs faster: count the cache budget without cloning wires by @bherbruck in #911
- Open large designs faster: index the previous bodies by name after each feature by @bherbruck in #912
- Open large designs faster: meshes, face names and Measure on all cores by @bherbruck in #916
- Open large designs faster: move bodies into components without copying the model by @bherbruck in #915
- face.delete heal: false leaves an open surface body (#768) by @jyviko in #861
- fix: a hole at sketch points drills into the part its sketch touches by @queball1999 in #910
- Open large designs faster: list each face's mesh vertices once when flagging seams by @bherbruck in #914
- Count the contact grid's own work, and test find_close_pair (#232) by @gvocale in #836
- MCP batch runs as one request in the app (#743) by @SychPL in #885
- Mesh a cylinder wall whose seam edges a cut split without fans across it by @bherbruck in #921
- A generated many-part assembly: test and open-phase benchmark by @bherbruck in #927
- Lip: run along the rim's opening, not the foot of a boss standing on the face by @bherbruck in #933
- Surface Revolve: sheets turned from open curves and profiles (#757) by @jyviko in #824
- perf: planar source matching looks only at planes with the same normal by @Mqrius in #917
- fix: preserve fine meshes at collapsed taper boundaries by @0xlillith in #906
- Join walls swept along splines in 2D (#844) by @gvocale in #908
- Surface Sweep: sheets carried from open curves and profiles along a path (#757) by @jyviko in #843
- fix: imprinting a partial contact boxes faces by their control points by @bherbruck in #929
- Fillet and chamfer: refuse a smooth seam as having no corner to round by @bherbruck in #936
- Surface Loft: sheets through open or closed sections (#757) by @jyviko in #847
- Clamp the window surface to the device's largest texture (#869) by @bherbruck in #905
- Toolbar drop-downs show all their rows after a shorter list (#874) by @bherbruck in #918
- Web: fetch the CJK font when Japanese text is drawn, whatever the UI language (#720) by @bherbruck in #937
- Surface walls named after their sketch curves (#757) by @jyviko in #850
- URDF export of assemblies for robot simulators (#719) by @SychPL in #942
- Booleans: small tools in large bodies are traced at their own scale (#559) by @bherbruck in #946
- fix: a refused control connection reads what was sent before closing by @bherbruck in #945
- Section Analysis in the browser, with an eye to turn it off (#822) by @bherbruck in #947
- Offset Surface: faces copied out at a distance, exact or fitted (#758) by @jyviko in #872
- feat(skills): add solidcraft-checking skill by @ingvarch in #880
- fix: the model's body mesh comes from the reference mesher again by @bherbruck in #940
- Thicken any surface, across sharp edges (#765) by @jyviko in #932
- Display tessellation plans (4/4): one GPU dispatch for the scene, intersection edges by Newton by @jyviko in #806
- feat(i18n): complete Simplified Chinese catalog, Chinese font fallback and a coverage xtask by @Noly1990 in #930
- Fillets and chamfers where edges meet at corners on a curved wall or a knife-edge tip (#851) by @lasselian in #935
- docs: propose extensible material, appearance and component libraries by @0xlillith in #792
- Make the web app work offline and update itself by @jasiek in #239
- Preferences › Sketch: auto-projection holds across designs (#680) by @HEOJUNFO in #959
- Loft: pair section vertices by the best fit of all of them, not the first (#881) by @HEOJUNFO in #956
- Rounded Rectangle sketch tool (#891) by @bherbruck in #948
- test: record the bracket example's action matrix after its fillet moved by @bherbruck in #962
- fix: grid lines for split ruling edges only in display and export meshes; record the moved seeds by @bherbruck in #961
- Sheet metal: a fold's fixed point on the sheet's face counts as on it (#685) by @bherbruck in #958
- Fillets and chamfers ending on a boss's pieced wall or beside it, and loops the loop blend refuses by @bherbruck in #926
- Sheet metal: a thousand cut-outs fit the flat budget, ten times faster (#732) by @bherbruck in #964
- Collect application resources for #433 by @Nathan-Dane in #833
- Sketch on every side wall of one sketch extruded up and down by @bherbruck in #957
- Sheet metal: fold a second tab on a line, and a tab on an L's inside edge (#638, #639) by @bherbruck in #963
- test: MCP default-folders test fails on Windows (scratch folder vs canonical roots) by @SychPL in #965
- Fillet: refuse a result with openings in its surface (#871) by @bherbruck in #949
- A hole on a face drills into the material, also in older designs (#950) by @bherbruck in #952
- fix: Convert to Sheet Metal keeps a plate's round holes round by @NOWN-DEV in #977
- Retry a face's parameter boundary leniently (#968) by @gvocale in #970
- feat: guide sketch patterns with live previews and editable offsets by @Karl-VonRichter in #966
- Holes on round faces from the app, and Flip for holes at sketch points by @bherbruck in #980
- Sheet metal: a hole drilled into a rim is a bore its panel keeps (#560) by @bherbruck in #955
- fix: an edge flange folds beside a ledge as tall as its setback by @NOWN-DEV in #978
- test: web-offline-test reads the worker's caches without opening them by @bherbruck in #982
- Boolean nudge: no sliver where a tool only touches a round side (#827, seen in #897) by @bherbruck in #941
- fix: renders hide edges just behind a face; lines on steep faces draw whole by @NOWN-DEV in #983
- fix(kernel): cut a hole tangent inside a stepped boss (zero-thickness curved wall) by @froglemonade2 in #986
- feat: curvature-continuous (G2) fillets for straight planar edges by @midasdf in #862
- To / From Object finds a target in another, moved component (#928) by @SychPL in #993
- fix: a lenient parameter boundary found across a seam is not used; record seed 81 by @bherbruck in #1003
- Large STEP imports: no more multi-minute hang, shared STEP text, cancel and progress (#883) by @bherbruck in #925
New Contributors
- @phanoob made their first contribution in #821
- @lunar-me made their first contribution in #893
- @ingvarch made their first contribution in #879
- @jijinbei made their first contribution in #875
- @queball1999 made their first contribution in #910
- @gvocale made their first contribution in #836
- @Noly1990 made their first contribution in #930
- @jasiek made their first contribution in #239
- @HEOJUNFO made their first contribution in #959
- @midasdf made their first contribution in #862
Full Changelog: v0.9.0...v0.9.0-nightly.20261014.36.1