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).
What's new in SolidCraft 0.21.0-nightly.20261024.75.1 is listed below, and the
ROADMAP lists
the known limitations. Designs from every earlier version open in this one.
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.21.0-nightly.20261024.75.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.21.0-nightly.20261024.75.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.21.0-nightly.20261024.75.1-freebsd-x86_64.tar.gz --strip-components 1 -C /usr/local. - Web:
solidcraft-web-0.21.0-nightly.20261024.75.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://docs.solidcraft.io/flatpak/solidcraft.flatpakrepo
flatpak install --user solidcraft ai.storyteller.solidcraft
flatpak run ai.storyteller.solidcraftA remote added from the old bherbruck.github.io address no longer finds updates: run
flatpak remote-modify --user --url=https://docs.solidcraft.io/flatpak/repo/ solidcraft, then
flatpak update --user.
Flatpak 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
- Plane at Angle: allow planar faces as base plane (#1939) by @jeremymiribung-blip in #1956
- Agent chat in the Flatpak says why no agent is found and how to allow one (#4765) by @raykholo in #4769
- web-offline-test: wait only for the files the browser can ask for at once (#5287) by @raykholo in #5294
- Web: Ctrl+Tab and Ctrl+Shift+Tab switch browser tabs again (#5227) by @SychPL in #5350
- Motion Trace: regenerate kept curves only when inputs change (#5248) by @takuto-NA in #5270
- Home: a recent design's location shows in one tooltip, not two by @N3MI-DG in #5208
- Format registry: one table of formats, extensions and options (#5215) by @wdunn001 in #5217
- Viewport: the ground shadow no longer sends every frame through the transparency path (#5230) by @raykholo in #5255
- Agent cursor follows the agent's own mouse input (#5161) by @N3MI-DG in #5162
- Extrude without a profile selection keeps holes in nested loops (#5172) by @raykholo in #5176
- component.create refuses parameters it does not take (#5174) by @raykholo in #5178
- Joints: a joint origin's name given as a face says to pass it as the origin (#5175) by @raykholo in #5179
- Joint: avoid redundant analysis and residual placement work (#5185) by @takuto-NA in #5186
- Viewport: reuse still pictures and draw scenes into a 1x window pass (#4820) by @oursland in #5187
- App icon: draw the borderless mark everywhere (#5461) by @froglemonade2 in #5465
- Themes: drop the logo's fourth colour, which #5465 retired by @bherbruck in #5548
- Extract to File: move a component into its own linked design (#5112) by @chrishamm in #5113
- Extrude: a sketch on an inserted part cuts it with Through All too (#4424) by @sthifen in #5115
- A renamed body keeps its number: the next body does not take the freed name (#4957) by @vdirienzo in #5053
- Parameters: a favourite renames by double-click (#4952) by @dudedagger42 in #5070
- view.apply: keep the camera's roll, and refuse an up axis (#5087) by @raykholo in #5094
- Dragging a docked dialog no longer highlights the view under it (#5086) by @raykholo in #5095
- gpu tests: open the OpenGL regression device without indirect-call validation (NVIDIA GL 3.3) by @ivisaf in #5101
- GPU tessellation: an empty plan no longer fails buffer validation (#5049) by @raykholo in #5104
- i18n(pl): translate 213 missing messages by @cyryllo in #5031
- Coincident on two circles lays the second on the first by @dudedagger42 in #5038
- Release 0.21.0-rc.1 by @bherbruck in #5566
- Add .vscode to .gitignore. by @oursland in #5588
- Extrude and loft: refuse duplicate profile indexes (#5023) by @raykholo in #5028
- Assistant: add Anthropic-compatible API agents (#5015) by @oursland in #5017
- Opening a design: range-check integer-valued coordinates too (#5021) by @raykholo in #5026
- Snap fit: refuse sizes too small to build (#5022) by @raykholo in #5027
- Timeline: delete the selected features, Shift+click ranges, delete after the history marker (#5005) by @dannyow in #5006
- Sketch drag: a linkage with redundant parallelogram constraints still moves (#4585) by @HiroKenEz in #4983
- Browser: Shift+click above the anchor selects the whole range (#4991) by @raykholo in #4997
- Fix/mcp stdio bounded request lines by @tahazarif10 in #4972
- OpenGL: the viewport scene renders 1x again, like the window by @bherbruck in #5605
- Fix design format 33 for 0.21.0-rc.1 by @bherbruck in #5610
- Agent chat: serve the bundled skills' reference through an MCP tool (#4966) by @raykholo in #4970
- solidcraft-cli bench-assistant: the standard Assistant model test (#4851) by @raykholo in #4930
- UI: drag features across the history marker in one step, clearer drop feedback by @javl in #4938
- icon_audit: compare the requested-icons manifest with CRLF checkouts ignored (#4932) by @flyboy-byte in #4960
- Sketch: offer Break Offset Association for offsets of lines (#4899) by @raykholo in #4920
- MCP tools: unknown command ids suggest the closest ids (#4846) by @raykholo in #4915
- Keyboard Shortcuts page: draw only the visible rows (#4804) by @raykholo in #4919
- Model cache: thin the checkpoints of a design too big for its file instead of leaving the cache out (#3220) by @SychPL in #4882
- Rename a body: keep the names of siblings a later feature removed (#4880) by @raykholo in #4904
- Hem: the direction arrow points the way the hem builds (#4794) by @raykholo in #4836
- Web: a trackpad swipe pans instead of zooming (#4116) by @raykholo in #4834
- Units of new designs apply to the empty design already open (#221) by @raykholo in #4835
- Physical material: one rule for a body's material and its density (#4783) by @CamWight in #4785
- Move: the value box follows the dragged axis, and Tab steps through X, Y, Z (#4776) by @DuBearte in #4788
- Flange on a plain solid says how to start sheet metal (#2987) by @raykholo in #4789
- Sketch Point: a point put on a midpoint or a curve snap is held there (#4691) by @dudedagger42 in #4745
- Imports through the app keep their matrix, name and options (#4676) by @dudedagger42 in #4746
- Timeline marker: refuse a negative position, and name the command asked for (#4712) by @dudedagger42 in #4749
- French: "Répétition" instead of "Réseau" for patterns by @rlartot in #4751
- Combine takes bodies clicked in the Browser (#4452) by @DuBearte in #4766
- Shortcuts: a sketch tool and a model command can share a key (#4163) by @DuBearte in #4781
- Accept a leading = in expressions, so a fillet radius can be =d3 (#4681) by @56steve in #4686
- Pattern and mirror: a rib as the source (#4593) by @martinpalsson in #4667
- Expression suggestions stay closed while another control is dragged (#4589) by @SS-EN in #4590
- Preserve sketch circular-pattern Quantity parameters (#4435) by @Reefwalker in #4607
- Mesh Convert works without activating the mesh's component first (#4609) by @raykholo in #4613
- Control: a whole-design measure reads a copy off the window thread (#4604) by @dudedagger42 in #4614
- Sketch Symmetry: a dimensioned shape slides onto the axis (#4030) by @DuBearte in #4626
- Convert to Sheet Metal: a bend picked on its tangent edge connects, on rotated parts too (#4328) by @raykholo in #4630
- Measure: report obtuse angles at a shared corner (#4625) by @Reefwalker in #4634
- Intersection edges divide at 1e-6 when asked for less, instead of panicking (#4623) by @DuBearte in #4650
- Keep Parameters responsive in large feature histories (#2733) by @cfaulkingham in #4549
- Section Analysis: a Hatch option (#4563) by @SS-EN in #4565
- Mesh leftovers from the ribbon redesign (#133) by @gsrunion in #4471
- Add macOS native menu bar (#2361) by @peppelorum in #4531
- An intersect that would leave nothing is refused instead of deleting the body (#5295) by @raykholo in #5303
- Viewport: whole-body highlights reuse the model's own triangles (#4554) by @oursland in #5109
- Ask before standing up a SolidWorks file; add Turn Up Axis to the component menu by @bherbruck in #5655
- Sketch on a picked origin plane uses the plane shown after standing an import up by @bherbruck in #5659
- gpu tests: set the new hover and selection tints in two test frames by @bherbruck in #5698
- Release 0.21.0-rc.2 by @bherbruck in #5691
- Viewport: show reference geometry through bodies by @plexi32 in #2697
- ui-egui tests: offscreen GPU tests start their devices one at a time (#3989) by @raykholo in #3990
- DXF: write and read a Bézier at its own degree (#5269) by @CamWight in #5281
- Renaming a plane keeps its projections, canvases and hidden state (#4353) by @SS-EN in #4354
- Browser: add Rename and Delete to feature menus (#3839, #4343) by @cfaulkingham in #4342
- Browser: a second click on a Document Settings entry closes its window (#4150) by @CamWight in #4152
- Fix feature editor picks after upstream sketch resizing (#4083) by @raykholo in #4084
- Preserve expression-positioned sketch fillet corners (#4097) by @raykholo in #4106
- macOS: Fusion navigation preset does not support Shift + two-finger orbit by @peppelorum in #3446
- Delete in a rolled-back history warns about the features after the marker (#3471) by @HiroKenEz in #3698
- Rectangular and circular pattern: copies that miss the body are reported (#3042) by @raykholo in #3919
- Frames: profile library, members along frame sketch lines, and the Frame Member dialog (#4003) by @Karl-VonRichter in #4004
- ui-egui tests: clear the texture deltas of the frames they run by @raykholo in #4039
- 2-point circle takes a typed diameter (#3278) by @phanoob in #3335
- Renaming a body keeps the evaluated timeline, off the window thread (#2467) by @kaievns in #2468
- Reorder design tabs by dragging them (#3187) by @phanoob in #3188
- FreeCAD/Rhino import: decode caps with room for detailed parts (#1783) by @raykholo in #3209
- Flat Pattern view draws perforations (#4440) by @raykholo in #4441
- Sketch offset keeps its source lines free to turn (#4464) by @plexi32 in #4466
- Toolbar: a constraint dragged out of the small box becomes a full button (#5254) by @raykholo in #5456
- "Don't Save" looks like a button in the Save changes prompt (#4380) by @raykholo in #4400
- Keep long Select Other labels inside the popup (#4209) by @cfaulkingham in #4225
- Esc ends the navigation bar's Pan, Orbit and Zoom modes (#4226) by @raykholo in #4233
- Spanish (es-ES): catch up with en.json by @carlymx in #4292
- 3D mouse test: clear the frame's texture changes, so it passes in debug builds by @Tyler-Chiriboga in #4382
- Deleting an inserted file removes its components, placements and joints (#4100) by @raykholo in #4113
- Cancel Sketch: leave a sketch without keeping its changes (#3838) by @leValdemar19 in #3938
- Rigid joint saved with the wrong occurrence when two occurrences share a component (#3857) by @Loohi in #3939
- Viewport: right-click keeps a multi-selection of faces and edges (#3733) by @ahmetv10 in #3788
- 3MF import: name a Bambu Studio project's bodies after its objects (#3858) by @Tyler-Chiriboga in #3859
- Return to the originating tab after finishing a sketch (#3250) by @rlartot in #3264
- Parameter import and image pickers offer their own file types (#3216) by @phanoob in #3314
- Close Change Parameters with Escape (#3372) by @Vittuu in #3399
- STEP import: let a cancelled import release the import slot (#3171) by @bluecmd in #3189
- Dragging a part along its joint no longer highlights what's under the pointer (#5137) by @raykholo in #5140
- Browser: a body picked in the viewport is opened to and scrolled to (#3005) by @phanoob in #3081
- Line tool snaps a diameter through the circle centre by @thodoristsagko in #4327
- Crash reports: keep component.activate in the journal (#5079) by @ahmetalpcelik in #5121
- Flatpak: find the host's fonts for CJK text and the font list (#5124) by @raykholo in #5127
- Control channel and MCP on by default, with a setting to turn it off by @bherbruck in #5561
- Tests: moving an occurrence recomputes only the cuts and joins it touches (#4965) by @raykholo in #4982
- Keyboard shortcuts: live chord previews and reliable modifier entry (#1809) by @ealitt in #1810
- Move: scope box selection to the active component (#4459) by @cfaulkingham in #4527
- Agent chat: end the agent's process group where
killis busybox' (#4587) by @vdirienzo in #4588 - Delete removes a selected construction axis (#4692) by @raykholo in #4695
- Extrude: picking a face, vertex or parallel plane off the profile switches the extent to To Object by @quantmind-br in #2855
- A spherical shell revolves into a solid with a void, and cuts and joins with hollow tools work by @H1D in #4182
- Assembly: ground the first part; drag free joint chains (#2804) by @Karl-VonRichter in #2805
- Section Analysis: OK with no plane picked turns the section off (#2410) by @kaievns in #2411
- docs(mcp): Windows setup for Claude Desktop by @rbousigues88 in #3794
- Sketch slots: provide typed dimension inputs for every variant (#2423) by @cfaulkingham in #4318
- Browser: route body picks into open command dialogs (#2560) by @cfaulkingham in #4371
- Preserve construction references when axes and points are renamed (#4419) by @cfaulkingham in #4449
- Sketch Dimension: measure from edge midpoints by @crono2250 in #4872
- UI: integrate theme radii, borders, palettes and viewport refresh (#5045) by @Nathan-Dane in #5046
- Version 0.21.0 on main by @bherbruck in #5774
- MCP: wait out long requests, pending tool, honest batch outcomes (#1989) by @SS-EN in #2901
- 3D mouse: driver choice, guided calibration, button mapping and a picture of the device (#1463) by @nomadsgalaxy in #3825
- Timeline: suppressing a feature keeps later features' body names (#4302) by @plexi32 in #4311
- cadmpeg 0.6.3: FreeCAD and Rhino import in the browser too by @oursland in #4482
- Join: say so when the joined piece doesn't touch the body (#4434) by @plexi32 in #4436
- Pattern dialogs: Quantity fields get up/down step arrows (#4260) by @plexi32 in #4264
- Hole: snap to face and round-edge centres, drag placed holes, section in the dialog (#2171) by @Jacquesvdberg92 in #2912
- Hole: place a Single hole by distances from reference edges (#37) by @Jacquesvdberg92 in #2931
- Renaming a parameter follows it into sheet-metal and plastic rules and canvases (#4420) by @SS-EN in #4423
- CLI: --help on each subcommand prints its usage and exits 0 (#4538) by @vdirienzo in #4545
- Mirror and pattern: a pattern or mirror feature as the source (#395) by @martinpalsson in #3998
- Expression completion: keep longer names visible when the typed word is a unit (#3663) by @dannyow in #3664
New Contributors
- @chrishamm made their first contribution in #5113
- @vdirienzo made their first contribution in #5053
- @dudedagger42 made their first contribution in #5070
- @ivisaf made their first contribution in #5101
- @tahazarif10 made their first contribution in #4972
- @56steve made their first contribution in #4686
- @Reefwalker made their first contribution in #4607
- @gsrunion made their first contribution in #4471
- @kaievns made their first contribution in #2468
- @ahmetv10 made their first contribution in #3788
- @ahmetalpcelik made their first contribution in #5121
- @rbousigues88 made their first contribution in #3794
Full Changelog: v0.20.0-nightly.20261023.69.1...v0.21.0-nightly.20261024.75.1