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.15.0-nightly.20261018.51.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.15.0-nightly.20261018.51.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.15.0-nightly.20261018.51.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.15.0-nightly.20261018.51.1-freebsd-x86_64.tar.gz --strip-components 1 -C /usr/local. - Web:
solidcraft-web-0.15.0-nightly.20261018.51.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
- Boolean property tests: nightly only, and the cases they found as ignored tests by @bherbruck in #1650
- Robustness goldens: record seeds 31 and 83 after #1581 and #1495 by @bherbruck in #1657
- Release 0.14.0 by @bherbruck in #1671
- Timeline marker, undo and redo compute off the window thread by @phanoob in #1675
- test: three ignored tests pass again and run in CI (#679, #562) by @PhilippBischoff0 in #1663
- 2D prism route: the same letters cut again are one exact boolean by @phanoob in #1644
- A feature that names its body finds its named face there first (#1637) by @rlartot in #1643
- Class-A surfacing 3/3: blend curves, curved-edge fillets, the G2 corner and continuity analysis by @midasdf in #1642
- Sketch: rectangles, circles and polygons draw by press, drag and release (#1630) by @DuBearte in #1641
- Extrude: to an object through the body, the automatic operation is Cut (#1633) by @DuBearte in #1636
- Add the Ukrainian translations for the messages added after #1196 by @BrunIF in #1632
- Register
surface.boundary, which the 2/3 squash left unregistered by @midasdf in #1701 - Motion animation export: a study or a joint drive as an animated GIF by @SychPL in #1680
- Screenshot of a hidden window: at once, and say so (#1677) by @DuBearte in #1707
- Joint origin: a circle given by its centre (#393) by @SychPL in #1686
- Component rename also renames its placements (#1665) by @SychPL in #1685
- solid.hole: position takes length expressions and follows them (#1678) by @DuBearte in #1683
- Add three-axis milling with independent CAM and Fusion validation by @CypherNaught-0x in #1682
- Mesh export: twisted ruled faces are divided to the chord tolerance (#1666) by @DuBearte in #1670
- Revert #1682 (three-axis milling) by @bherbruck in #1715
- Save As: a design named after its file takes the new file's name (#1710) by @DuBearte in #1716
- SpaceMouse test: make the app before the reading, which goes stale on a slow runner by @phanoob in #1711
- Rolling-ball blends: a strip ends on its joint where its neighbour is too short to lend sections (#1667) by @erkexzcx in #1702
- Emboss: say how far the picked point is from a face (#392) by @SychPL in #1733
- Fillet fit check: rounds on both sides of a wall in one feature fit as they do one after the other (#1668) by @erkexzcx in #1720
- Accelerate current-view DXF export and keep desktop exports responsive by @crono2250 in #1738
- Add Brazilian Portuguese translation (#1688) by @DuBearte in #1735
- Joints: cam and follower coupling (joint.cam) by @SychPL in #1734
- Windows relaunches after an update by @bherbruck in #1748
- Update check works under either repository owner by @bherbruck in #1747
- SpaceMouse tests: run the frame and the wheel hook at the test's own time by @SychPL in #1749
- Split Body and Combine Intersect keep their faces' sources, so sketches attach (#565) by @SychPL in #1732
- README: centred header with downloads and badges; link the Discord by @bherbruck in #1761
- README: link solidcraft.io by @bherbruck in #1769
- Mesh export: the faces of an edge share its points exactly by @SychPL in #1753
- Create Sketch shows the origin planes through the model (#1755) by @pablopeza in #1757
- Thread: suggest cylinder size and expose metric diameter and pitch by @cfaulkingham in #1759
- Keep large STEP assemblies responsive during 3D navigation by @crono2250 in #1762
- Split Body: the face a plane split cuts takes an attachment that follows the plane (#565) by @SychPL in #1746
- Tapered join on a face: sew a whole face, keep the run-on inside the body (#1534) by @HiroKenEz in #1763
- Add Galician (gl) UI localization by @pablopeza in #1771
- Agent chat: show the agent's answers as Markdown by @Rec0iL in #1778
- Drag arrows take a press on their stem, not only on their tip (#1740) by @HiroKenEz in #1764
- Keep viewport hover and click picking while a 3D mouse moves the view by @oursland in #1781
- Viewport picking: a BVH per body mesh and a GPU pick buffer for visible edges by @oursland in #1776
- Revolve: a partial turn's planar faces come out whole (#726) by @SychPL in #1718
- Agent chat: Antigravity replaces the retired Gemini CLI (#1790) by @Rec0iL in #1795
- Fix/clippy option zip by @Ian-cmd-ops in #1798
- feat: a slanted or curved edge across a sheet metal bend folds to a smooth curve of few pieces by @NOWN-DEV in #1799
- Viewport: hidden edges no longer show through faces, and thin or coplanar faces stop z-fighting (#1434, #1739) by @CamWight in #1768
- Update public links and docs custom-domain deployment by @PixelSoftwareStudios in #1780
- Sketch symmetry: the free symmetry line moves when both mirrored lines are fixed (#1796) by @SychPL in #1823
- 3D mouse: read spacenavd on Linux so the spnavcfg settings apply (#1000) by @Rec0iL in #1825
- Robustness goldens: seed 55 builds a valid body (main is red) by @jyviko in #1839
- Motion analysis: chart a study's joints and points, and find the parts that collide along it by @SychPL in #1712
- CI: run the full suite for the merge queue by @bherbruck in #1841
- Update README browser links to solidcraft.io/app by @PixelSoftwareStudios in #1844
- Add Remade listing badge before Stars in README by @PixelSoftwareStudios in #1857
- CI: main and merge-queue builds run on the self-hosted runner by @bherbruck in #1847
- CI: all Linux jobs of main and merge-queue runs use the self-hosted runner by @bherbruck in #1864
- CI: back to GitHub's runners for now by @bherbruck in #1871
- CI: drop the self-hosted build directory by @bherbruck in #1872
- CI: fix the workflow file by @bherbruck in #1877
- docs: fix incorrect Trunk link in CONTRIBUTING.md by @Karl-VonRichter in #1838
- Insert SVG: the file picker opens on SVG files (#1801) by @SychPL in #1827
- Implement the reviewed UI icon system and durable review workflow by @Nathan-Dane in #853
- Expressions: a mixed number such as 2 1/8" is 2.125" (#1802) by @SychPL in #1820
- Midplane asks for the two planes (#1845) by @thodoristsagko in #1846
- Escape stays in the sketch (#1804) by @thodoristsagko in #1836
- STEP import: read HYPERBOLA and PARABOLA edges exactly by @NOWN-DEV in #1832
- Kernel/refine mesh for curved meeting by @Ian-cmd-ops in #1812
- CI: Windows jobs only when what they test changes; only main saves caches by @jyviko in #1840
- Sketch Fillet: pick the two lines of a corner where more lines meet (#1824) by @SychPL in #1826
- Robustness goldens: one test per seed, so CI spreads them (full runs ~33 → ~15-20 min) by @jyviko in #1851
- Sweep guide rails and two-rail sweep (#771) by @jyviko in #1806
- CI: main and merge-queue runs share the work with the self-hosted runner by @bherbruck in #1914
- Regression test: a box intersect splits the end off a raked wedge after its end rounds (#1617) by @SychPL in #1862
- docs: CLAUDE.md carries the current shared agent rules (#1822) by @DuBearte in #1859
- ui(feat): open expression suggestions with Ctrl+Space by @Karl-VonRichter in #1852
- Extrude preview: a New Body has its own colour, apart from Join (#1805) by @DuBearte in #1861
- Look At pressed again looks from the other side (#1886) by @DuBearte in #1904
- fix: text cut into a large part stays on the exact 2D route by @NOWN-DEV in #1903
- Evaluation: sketch and rename commands no longer slow down with the number of placed bodies by @NOWN-DEV in #1898
- solid.mirror: mirror bodies of placed components where they are shown by @NOWN-DEV in #1896
- STEP export: an inserted assembly's nested parts are placed once by @NOWN-DEV in #1895
- Interference: a pin a hair off the axis of its hole gets its crescent by @NOWN-DEV in #1893
- fix: booleans with whole-turn round faces read from STEP are exact instead of failing by @NOWN-DEV in #1892
- Fillet beside a hole: the suggested largest radius fits (#324) by @SychPL in #1885
- Sketch profiles: a line passing next to a junction splits the loop it crosses (#755) by @SychPL in #1879
- Updater: recognise an MSI install outside Program Files (#1870) by @SychPL in #1873
- Navigation: hold Space to pan by @styles01 in #1754
- Action matrix: record the chamfers #1428 refuses by @phanoob in #1684
- 3D mouse: invert and speed for each of the cap's six axes by @NecroKote in #1814
- Stand this part up? offer: handles for its buttons, and stand_up: false leaves it (#1905) by @DuBearte in #1911
- Fonts: a Thai fallback, so Thai text no longer draws as boxes (#1902) by @DuBearte in #1913
- README: link Send2Orca (SolidCraft to OrcaSlicer) by @tommasobbianchi in #1906
- Add Spanish (Spain) localization (es-ES) by @jawler in #1689
- Robustness goldens: seeds 13, 71 and 94 build as main builds them (after #853) by @bherbruck in #1929
- Add Czech (cs) UI translation (#1750) by @potuzai in #1752
- Sketch: Explode Text turns a text's outlines into ordinary curves (#1842) by @DuBearte in #1921
- Clearance report: overlaps, near pairs and nearest bodies in one call (#1889) by @NOWN-DEV in #1900
- fix: STEP import reads unclamped (periodic) B-splines on their domain by @NOWN-DEV in #1916
- fix: a blind cut on a long body keeps its small rounds by @NOWN-DEV in #1593
- Parameters: a favourite's expression takes each key once (#1767) by @HiroKenEz in #1919
- Fix missing viewport surfaces after a skipped startup frame by @allisonChilton in #1791
- Attribution: the Czech catalog by @bherbruck in #1952
- Web: show the SolidCraft mark being cut from a cube while the app loads by @shuff57 in #1908
- test: save the proptest seed for the grid union face that does not mesh by @Ian-cmd-ops in #1813
- STEP import: a ball bounded only by its seam comes in whole by @onembyte in #1742
- 3D mouse: any HID multi-axis controller with motion axes, its axes and buttons found from the descriptor (#1463) by @nomadsgalaxy in #1880
- Draw the view orthographic while a sketch is open (#1756) by @pablopeza in #1758
- Expose a JavaScript command API for the browser app by @olup in #1713
- inspect.silhouette: the outline of bodies seen from a view, as a mask by @onembyte in #1743
- Saving to a network share on macOS: fall back to a plain fsync by @onembyte in #1741
- fix(kernel): fillet mixed arc and line loop corners by @onenewcode in #604
- French: catch up with main (194 messages) by @rlartot in #1676
- Split Body: a plane lying on a face of the body splits it exactly (#1510) by @SychPL in #1897
- Per-command timings for script runs and batches (#1833) by @DuBearte in #1868
- Pages links point at docs.solidcraft.io: Flatpak repository, help and troubleshooting (#1920) by @CamWight in #1922
- Booleans: prism cuts whose walls only touch the target are exact and prompt by @NOWN-DEV in #1894
- Clearance: give inspect.clearance the Interference icon by @bherbruck in #1991
- Continuity Analysis tool, legend and theme colours on #1642's inspect.continuity; curvature combs on faces (#770) by @jyviko in #1247
- fix: a cut takes only its sketch, a join adds only it by @NOWN-DEV in #1310
- io: every file reader survives deterministic mutation; glTF refuses a POSITION naming a missing accessor (#469) by @CamWight in #1923
- deps: zip 3.0.0 → 9.0.4 (RUSTSEC-2026-0367, -0368, -0369) by @jyviko in #1971
- Sheet metal: machine a hole feature's drills in one pass, keep cuts after a text cut (#1979) by @NOWN-DEV in #1980
- i18n: Czech is not a complete catalog yet by @bherbruck in #1999
- docs: remove the Send2Orca note from the README by @froglemonade2 in #1982
- Grid: stays on XY by default; following the view is a preference by @bherbruck in #2035
- CI: one full suite per merge (skip main pushes the queue tested); lighter PR runs by @jyviko in #1860
- docs: ribbon redesign proposal by @Nathan-Dane in #1439
- Release 0.15.0 by @bherbruck in #2039
- Link the Discord invite directly by @bherbruck in #2094
- Fix complete Japanese and Chinese grid-follow-view messages by @0xlillith in #2092
- CI: trusted pull requests use the self-hosted runners too by @bherbruck in #2012
- Sweep: close circular tools before cutting a torus (#2005) by @fkirill in #2010
- Grid: hysteresis and no wall swap at the 45° crossing behind Grid follows the view (#1993) by @jeremymiribung-blip in #2050
- Fix Steam Frame STEP trims and spline projection (#1974) by @moritzuehling in #2043
- Extrude: join extensions of ribs on curved bases (#2059) by @fkirill in #2082
- Revolve: a profile that comes back to the axis along a curve revolves right, and cuts with it work (#1853) by @SychPL in #1866
- Self-host the web app with Docker; publish the image to ghcr.io by @rpromas in #2033
- Fix red main: silhouette icon, colour vision scenario by @bherbruck in #2134
- Rib/Web: grow along the sketch normal (#2056) by @pablopeza in #2057
- Toolbar fills the available width instead of leaving a gap (#2108) by @bherbruck in #2109
- Updates: 0.11–0.14 must install 0.15 by hand once (#2136) by @DuBearte in #2141
- Web: a launch behind an expired sign-in shows the sign-in instead of the kept build by @nofuturekid in #2151
- sketch(feat): show dimension names and insert references on double-click by @Karl-VonRichter in #1548
- Macos space mouse support by @NecroKote in #1815
- Multi profile extrusion performance by @Koschtetnix in #2064
- Sketch: show open and untied profile ends (#2000) by @jijinbei in #2001
- CI: fork PRs run on the isolated self-hosted runners by @bherbruck in #2249
- CI: a fork PR's Select checks and ci jobs run on the untrusted runners by @bherbruck in #2252
- CI: Blacksmith Ubuntu 24.04 runners for fork PRs and GitHub-hosted Linux jobs by @bherbruck in #2237
- Revert #2237: Blacksmith account awaits verification, jobs never start by @jyviko in #2277
- CI: a pull request fast lane; the heavy checks run on main by @bherbruck in #2278
- CI: fork PRs' light jobs on GitHub, heavy jobs on the self-hosted pool by @bherbruck in #2284
- CI: fold the list checks into CI's repository-checks job by @bherbruck in #2292
- surface.boundary: surfaces through boundary curves and curve networks (#763) by @jyviko in #2129
- README: list the crash_reports MCP tool (#1821) by @DuBearte in #1830
- French: catch up with main (10 messages) by @rlartot in #2203
- Spanish (es-ES): catch up with en.json by @carlymx in #2101
- CI: restore main's Rust cache in fork pull request jobs by @bherbruck in #2254
- CI: run all four test shards on the trusted self-hosted runners by @bherbruck in #2220
- Add complete Italian UI localization by @amolinari-autotex in #1941
- CI: give fork builds on the untrusted pool 90 minutes by @bherbruck in #2339
- Drawing: validate section geometry contracts (#2053) by @0xlillith in #2085
- Drawing: share length display formatting (#2054) by @0xlillith in #2086
- Sketch: the arc's sweep box no longer covers the end-point pick (#2201) by @DuBearte in #2242
- Add regression coverage for mouse picking during 3D mouse navigation by @crono2250 in #1786
- Clarify draft PR and /claim workflow in contributor guides by @Karl-VonRichter in #2317
- Sketch drag: move only what the constraints need by @jijinbei in #2060
- Avoid per-frame mesh copies in both timeline layouts by @crono2250 in #1907
- Preferences: reverse horizontal pan direction (#2007) by @lasselian in #2047
New Contributors
- @PixelSoftwareStudios made their first contribution in #1780
- @styles01 made their first contribution in #1754
- @NecroKote made their first contribution in #1814
- @tommasobbianchi made their first contribution in #1906
- @jawler made their first contribution in #1689
- @potuzai made their first contribution in #1752
- @allisonChilton made their first contribution in #1791
- @shuff57 made their first contribution in #1908
- @onembyte made their first contribution in #1742
- @nomadsgalaxy made their first contribution in #1880
- @olup made their first contribution in #1713
- @fkirill made their first contribution in #2010
- @jeremymiribung-blip made their first contribution in #2050
- @moritzuehling made their first contribution in #2043
- @rpromas made their first contribution in #2033
- @nofuturekid made their first contribution in #2151
- @carlymx made their first contribution in #2101
- @amolinari-autotex made their first contribution in #1941
Full Changelog: v0.13.1-nightly.20261016.47.1...v0.15.0-nightly.20261018.51.1