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.10: this is a minor bump because it adds new capabilities (a set of surface tools, curvature-continuous fillets, URDF export and more) on top of a lot of fixes. Designs saved by 0.10.0 use a newer file format, so read Compatibility below before you share files with people still on 0.9.0.
What's new
- Surface tools. Surface Revolve, Surface Sweep and Surface Loft make sheets from open curves and profiles; Offset Surface copies faces out at a distance; Thicken works on any surface, across sharp edges; Unstitch and Reverse Normal round out the set.
- Fillets, chamfers and sketching. Smoother, curvature-continuous (G2) fillets, plus many fillet and chamfer fixes (corners on curved walls, knife-edge tips, edge picks far from any edge). New Rounded Rectangle tool. Sketch text gets bold, italic, alignment, spacing and text along a curve. Sketch patterns show live previews with editable offsets.
- Export. URDF export of assemblies for robot simulators, and 3MF export with B-rep face tags.
- Speed. Large designs open about twice as fast. Large STEP imports no longer hang: a 52 MB board now loads in about 45 s instead of 12 minutes, with progress and a Cancel button (#925).
- Holes. The Hole tool drills into the part instead of out of it, and holes saved with a wrong direction by older versions fix themselves when the design is opened. Holes can now go on round faces, and holes at sketch points can be flipped.
- Extrudes. Sketching works on every side face of extrudes that go both up and down.
- Sheet metal. Holes in rims work, and the fold regression from 0.8.0 is fixed.
- Web app. The browser app works offline and updates itself.
- Languages. Simplified Chinese, with a Chinese font fallback.
Security
I recommend upgrading if you drive SolidCraft from an AI agent or run it with --control on a shared machine (#205).
- MCP file access is confined (#578). By default an MCP agent can reach files only in the open design's folder (inside your home, without its hidden files) and SolidCraft's recovery folder.
--allow-path DIR(repeatable) widens that..., symlinks that lead out, and Windows UNC, device, stream and short-name paths are refused.doc.recovery_discarddeletes only real recovery entries. - The control port needs a token (#901). Each launch writes a token to a file only you can read, so other local users can't drive the app.
solidcraft-cli mcp --connectfinds it by itself; other clients must send it (SOLIDCRAFT_CONTROL_TOKEN, see docs/control-protocol.md). - MCP tool annotations no longer understate side effects.
- Heads-up for scripts: if an MCP script writes to
./or/tmp, it now needs--allow-pathfor that folder.
Thanks to @CalvinEthos for reporting this, and to @kravens for the fix in #578.
Compatibility. The design format goes from 17 (0.9.0) to 19. Designs saved by 0.10.0 don't open in 0.9.0 or earlier. 0.10.0 opens all older designs, so upgrading from 0.9 needs nothing: open your designs and save (they're saved as format 19 from then on). Keep a copy of any file you may still open in 0.9.
Known issues
- #951: in the Pi-case example, editing a parameter after the extrude on the inner floor loses its profile.
- #967 leftovers: a few correct holes on thin slanted faces are still refused by the boolean; picking several faces makes several Hole features rather than one; and a hole wider than its face is accepted without a warning.
Packages are unsigned, as before.
Thank you
Thanks to everyone who contributed to this release: @0xlillith, @froglemonade2, @gvocale, @HEOJUNFO, @HiroKenEz, @ingvarch, @jasiek, @jijinbei, @jyviko, @Karl-VonRichter, @kravens, @lasselian, @lunar-me, @midasdf, @Mqrius, @Nathan-Dane, @Noly1990, @NOWN-DEV, @phanoob, @queball1999, @SychPL and @wdunn001. And thanks to @CalvinEthos for the security report.
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.10.0-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.10.0-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.10.0-freebsd-x86_64.tar.gz --strip-components 1 -C /usr/local. - Web:
solidcraft-web-0.10.0.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
- T3/fix issue 971 by @Karl-VonRichter in #1009
- feat: validate sourced physical material properties and elastic stability by @0xlillith in #934
- Release 0.10.0 by @bherbruck in #1010
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.10.0