Repository navigation
Releases
v0.18.0
CamCraft 0.18.0 - a clean-room CAM system that turns 3D models into
NC programs for CNC milling and turning.
- Full history: CHANGELOG.md
- Roadmap: the open issues are the current roadmap
- Questions: ask on Discord
What's in this release
Released 2026-11-12.
Breaking: none. The project file format stays at v58, so files saved by
0.17.0 open unchanged. Posted
G-code does change for some machines, so check the first program you post on
each: the Fanuc, Haas, Mazak and Doosan DNM posts now write G21 and the
Siemens 840D post writes G710 before any motion (#901); every mill post
writes an explicit spindle stop after a probe's tool change (#574); lathe
posts reset constant surface speed at the end of a section (#772); and the
post gate judges arcs and tool bodies more strictly in places (below), so a
program that posted before may now be refused by name.
A minor release headlined by CamCraft in a browser (a first web runner),
C-axis unwind for continuous live tooling, default holders on machine
files, a large fixture and holder library (plates, mod vises, 5-axis
vises, accessories, BT/CAT/ER/TTS holders), theme as a user preference,
a Trochoidal slot operation, Tormach microARC 4 and plasma posts, and
two new lathe and mill posts. Thanks to mkinney, vilts, tbrasselle, ahmetv10,
JSwetz and seelesturm for their contributions.
This cut
The UI snapshot goldens were regenerated for this cut and accepted by the
maintainer without the usual manual look at the diff images (maintainer's
decision, 2026-11-12).
New
- Runs in a browser (#31, #841, #847): the shell builds for wasm32 and runs
on a web canvas with an awaited GPU start-up and a page built by
web/build-app-wasm.sh. A first rung only, and not part of the release
download yet: the release workflow does not build or attach it, only the
manual CI workflow compiles it. The file picker is still owed. - C-axis unwind (#33): continuous C-axis live tooling now unwinds C at
clear links against the machine's stated C travel. Rotary Contour unwinds;
Rotary Parallel and Rotary Offset refuse by name where C would need a
rewind. Each rewind is an orbit the verifier and the post both see, and the
lathe post caps every C block's feed by the machine's stated linear feed and
C rate. - Machine default holders (#828): a machine file can name a spindle mount
and a default library holder (tooling.spindle_mount,
tooling.default_holder; refused by name when unknown or mismatched). A new
tool added in the GUI or over MCP starts with that holder in the same undo
step. The Tormach MX mills default to BT30 ER20, the PCNC/M mills to TTS ER20. - Theme is your preference (#877, vilts): the theme and colour-vision mode
survive restarts, and New, Open and project files no longer change them. The
light theme now has a light viewport with toolpath, overlay, view cube, hover
and title-bar colours that read on it (#698, vilts). - Holder library (#792, #793, #794, #799): BT30, BT40 and CAT40 taper
holders in ER collet chuck and Weldon versions; standalone ER11-ER40 collet
chucks and BT40 ER40 from one ER table, with the flange flare and Weldon
clamp screw enveloped; Tormach TTS holders (ER20, ER16 and set-screw) with
the collar face as the gauge line. MCP gainsset_tool_holderand
list_holder_library. A vendor tool STEP can be aligned by its ISO 13399 tool
coordinate systems (#370, JSwetz). - Tool editor and simulation (#93, #743): draw a milling tool's cutter,
neck and shank as a spun outline (Profile tab, validated against the stated
diameter and lengths, undoable, over MCP asset_tool_cutter_profile/
get_tool_cutter_profile). The simulation draws the tool and holder as the
same revolved body the collision laws judge. - Fixture library (#787, #788, #789, #819, #820): parametric milling vises
(3-8 in, 100-200 mm); 5-axis self-centering vises (52, 75, 80, 125 mm)
centred on the stock; accessories (parallels, 1-2-3 and step blocks, strap
clamps, soft jaws); fixture plates (12 x 12 in, 300/400 mm, 770MX table) with
any fixture placed at a named grid hole or dowel pair; mod vises (fixed and
adjustable jaw blocks on a plate, MCPadd_mod_vise_pair). Each is placed in
one undoable step and judged by the fixture mesh laws. Links and retracts
that would strike a fixture are raised over the steel instead of only being
reported; a clamp taller than the machine's Z stroke refuses generation by
name (#339). - Trochoidal slot operation (#220): an engagement-controlled trochoid along
a typed centre line, with the measured contact angle held under a limit by
adapting the step, microlift or retract returns, and named refusals. It also
refuses by name a forward step past the loop cap, a microlift above the
clearance plane and a bore past the helix-turn cap (#774). - Pocket and slot detection (#511): the Model page detects pockets and
slots and creates their operations with one click. - Posts and machines: Tormach microARC 4 and PathPilot A indexing between
operations on the new 770MX + microARC 4 machine (#785; simultaneous 4-axis,
unreachable tilts and A past travel are refused by name); a PathPilot plasma
post for the Tormach 1300PL (#671); a PathPilot lathe post (#612); a Doosan
DNM + Fanuc post aligned with a real sample program (#614, JSwetz; see
Known issues, #950, before using it with a 4th axis);
documented Heidenhain drilling and tapping cycles with explicit floating
holder intent (#51, seelesturm). - Plasma (#672, #801): the through-cut laws judge every Plasma Profile at
the post gate (cut order, cut crossing, a malformed record block the post by
name); a slot or keyway narrower than the kerf is refused at generation; the
laws warn on a rapid over a freed hole slug. - Refused generations show their moves (#261): the moves built before a
refusal are drawn as a dashed ghost in the refusal colour (display only;
never cached, simulated or posted), and the script/MCP error names its move
count. - UI polish (ahmetv10): larger ribbon cells with readable labels,
capitalised tab titles, no internal status text, an empty-viewport hint and a
Z=0 ground grid. The Machines pane's kind dropdown filters the list (#816).
The starter tool catalog is now a data file,assets/tools/catalog.json
(#741). - Documentation (#688, #291, tbrasselle): a Zola user-guide and developer
site published to GitHub Pages at each release tag; a first-part example
project with tutorial images.
Safety and correctness
- Posted programs: the mm unit word (
G21,G710on the 840D) is written
before any motion on the Fanuc, Haas, Mazak, Doosan DNM and Sinumerik posts,
so a control left in inch never reads an mm program as inches (#901). Every
mill post writes an explicit spindle stop (M5;MOTOFFon Mazak) after a
probe's tool change and length offset (#574). Lathe posts (Fanuc, PathPilot)
no longer carry a section's G96 into a later section that states none (#772).
The Carvera post names a per-operation smoothing ask with a one-time
"SMOOTHING NOT WRITTEN" note instead of dropping it (#757). - STEP chord cap and arc fitting (#689): a bore at a STEP hole's own size
posts clean. STEP meshes are capped at 0.005 mm chord error, arc fitting
keeps vertices within half the tolerance, closed rings fit whole, and the
gouge law reads arcs at a quarter of its tolerance. A nominal arc round a
convex wall now passes; an arc bowing past the floor between its old chord
joints is now caught. - Reach and tool-body laws (#903, #835): reach laws (c)/(c3) no longer
excuse a leaning shank or holder standing in the part as cutter kerf. A tool
body (imported or drawn) is judged by the same band stack the simulation
draws, so a stepped holder whose flange stands clear is no longer warned;
laws that still use the enclosing cylinder say so; a mid-turn swing through
the part is no longer hidden behind a stock shank warning on the same move. - STEP files with empty parameter lists import (#887, tbrasselle): files
exported by HOOPS Exchange, anything with an empty(), no longer fail as
corrupt. - 4th-axis A tables (#797, #804, #813): the machine check reads an A-about-X
table's pose through the tool axis (the underside A0 B180 posts as A180 on the
770MX + microARC 4). The program gate refuses an A index when the retracted
tool tip cannot clear the swept stock, part and turning fixtures by 5 mm. The
swing check also judges a work-turning A whose machine file states no axis
vector (an A is about X), and refuses one with neither a vector nor an
RS-274 letter. A machine whose work-turning A states nonose_to_axishas
every operation posted on it refused by name at the program gate until the
machine file states it. - Adaptive (#850): the growth planner refuses by name a plan that has
worked heavy ring geometry over a long walk, so an islanded area it cannot
finish falls back to the named Offset rings in about 22 s instead of about a
minute. Plans that finish today are unchanged. - Gouge law (b) in Boundary mode (#905): an arc move in contour, trace and
face is checked along its whole length against wall corners, not only at
sample points, so a gouge between two samples is caught. Arcs in the XZ and
YZ planes are still read at their chord joints (#946). - Picking over MCP (#692):
locate_partrefuses a mate id no click could
pick, like the other pick tools.
Fixed
- Fixtures: a vise or accessory key this build cannot read is dropped with
a load note and the project still opens; a strap clamp's stud must be
narrower than its strap; the parallels fit marks the heigh...
v0.17.0
CamCraft 0.17.0 - a clean-room CAM system that turns 3D models into
NC programs for CNC milling and turning.
- Full history: CHANGELOG.md
- Roadmap: the open issues are the current roadmap
- Questions: ask on Discord
What's in this release
Not a breaking release: the project file format stays at v58, so files saved
by 0.16.0 open unchanged and 0.16.0 opens 0.17.0 files. Posted G-code does
change for existing machines, so check the first program you post on each
machine. Every mill dialect's Face and other clearance-seeded paths now open
with an approach rapid on the clearance plane (#690, #691). Probe sections
start no spindle and descend to the safe plane before searching (#523, #570).
Lathe posts write the tool's control point for its orientation, threads cut
right-hand toward the chuck by default, and grooving and parting blades post
their touched-off corner (#629, #630, #632). Per-operation smoothing (#616) is
opt-in and changes nothing until you switch it on.
A minor release headlined by plasma cutting (a plasma machine kind, the
Tormach 1300PL and a Plasma Profile operation), one picking rule for the
whole app, new ways to align the part (three points, an edge or two
points, turning about the WCS origin), a fixture library, pocket and slot
recognition, per-operation smoothing in every mill post, and many new
machines. Thanks to mkinney, austin62jake, tbrasselle, vilts and JSwetz for
their contributions.
New
- Plasma (#669, #670, #672): a
plasmamachine kind (X/Y cut, Z torch
lifter, no spindle) and the Tormach 1300PL machine file; a Plasma Profile
operation with a plasma torch tool (kerf = diameter): kerf offset computed
or by G41/G42, outer contours clockwise and holes counter-clockwise
(overridable), arc leads, the small-hole rule, and holes cut before their
outer contour. Milling and turning operations are refused by name on a
plasma setup. - One picking rule everywhere (#692): faces, edges and points are picked
from one feature graph - whole faces, real feature edges and corner points
only, the visible one under the cursor first, never a tessellation edge or
a hidden edge through the part. - Part alignment on the Setups page: lay the part on a plane through three
picked points (#555); set the in-plane axes by an edge or two points (#557, #554);
alignment turns about the WCS origin and lays the picked face down (#606).
The setup page previews the stock it takes over from the previous setup as a
translucent body (#406). - Fixtures: a fixture library to save, insert and delete your own fixtures
(#339); moving a part warns when it or its stock would sink into a fixture
(#582); a square stock stays square when the part is turned (#571). - Pocket and slot recognition (#35): recognised pockets and slots turn
into operations; an inside-out or open mesh is refused by name (#718). - Posting: opt-in per-operation smoothing in every mill dialect (G64 P,
G5.1, G187, CYCLE832, G62; #616); per-setup post options and a per-setup
tool-list export (#389); Tormach programs can end in the operator's units
(#596); probe programs report the measured deviation on the control (#575); Haas
probing on an inverted X/Y axis (#392); comment text is escaped per dialect (#594). - Machines: Tormach 8L, 15L and 15LX Slant-PRO lathes (#611, #619), 24R
and xsTECH Pro routers (#620), 770M+ and 1100M+ (#618), and the Makera
Carvera and Carvera Air with a Carvera post (#707). The Machines pane's
"Use for this setup" assigns the selected machine (#384), and the machine overview
is a readable two-column grid (#745). - MCP: the tool table is served live from inside the GUI (#183); idle
live-session clients are dropped after a timeout (#567); newmove_modeland
repair_modeltools (#716, #717). - UI: recent projects and models on Open and Model (#662); a refused generation
marks the spot it names, and drilling refusals mark their hole (#261, #677).
Fixed
- Safety and the post gate: mill paths seeded on the clearance plane always
open with an approach rapid (#690, #691, #697); a step too small to ladder is
refused by name instead of allocated (#695); MCPverifyno longer reports
a job as clean while an operation's own warnings hold the post (#722); the
program sim sweeps a tap at its thread's minor diameter, so a tap-drill-size
hole is no longer a false gouge (#266, partial); an edge-break record is
credited only within its operation's stated width (#529). - Probing: a touch probe starts no spindle on any mill post (#523), is not
judged against the machine's spindle range (#565), searches a short way past the
face and feeds below the safe plane (#570); a probe-only program's stock sim
judges the uncut stock (#592). - Turning: threads cut right-hand toward the chuck by default and state
their hand (#629); lathe posts write the tool's control point (#630);
grooving and parting blades post their touched-off corner (#632, #641); facing
approaches at rapid and lifts off the face before retracting; the lathe
stroke and thread travel checks judge the posted radius (#631, #633, #647). - Setup page: lay-on-plane controls stay on screen so a picked face is
turned flat (#330); another setup's WCS triad stays on its spot (#558);
setup picks disarm when their page is left and the pick sweep runs every
frame (#664, #667); a hidden Properties pane drops the locate draft (#673). - Units: status lines, refusals and the gate's gouge clause speak the
document's units (#578). - Views: orthographic depth maps into WebGPU's clip volume (#600), and
orthographic picking and stock tracing cast parallel rays (#609, #610); view-cube pole
clicks keep the roll (#622). - Machines: the tool-number clash is judged per machine (#438); a saved
machine file keeps its key order (#480).
Changed
- Smoothing, picking and alignment are described above; the stock engine
builds a block stock in closed form (faster, same result).
Process changes
Contributor and agent process only; no effect on the program.
- PROCESS_VERSION 1-4 (#682, #683, #685, #687): process files carry a
version and are announced on the pinned issue #681 so forks pick them up;
the/resolve-conflictsskill and the conflict rule. - 5 (#742): MCP issues carry
area:mcpand P1. - 6 (#747): every issue is weighted
effort:low|medium|high|maxand
worked by the matchingissue-workeragent. - 7-9 (#750, #751, #753):
cargo xtask gate|release|packagereplace the
PowerShell/bash scripts on every OS; the scripts are wrappers. - 10 (#726): the camcraft-mcp skill's tool signatures match the server.
Known issues
- #738: setup-page alignment re-applies from the import pose instead of
composing on the current one, and picks are hard to see (fix in review,
PR #746). - #757: the Carvera post ignores per-operation smoothing without a note.
- #74: GPU selection can fail on hybrid Intel/NVIDIA laptops.
Report a bug or ask for a feature
- Found a bug? Open a bug report: a
toolpath that looks wrong, a crash, or a refusal you think is mistaken. - Want a feature or an enhancement? Request it:
say what you are trying to machine and what is in the way. - Not sure? Ask on Discord first.
Thanks
Thank you to everyone who contributed to this release:
v0.16.0
CamCraft 0.16.0 - a clean-room CAM system that turns 3D models into
NC programs for CNC milling and turning.
- Full history: CHANGELOG.md
- Roadmap: the open issues are the current roadmap
- Questions: ask on Discord
What's in this release
BREAKING: the project file format moved from v57 to v58 (PR #381: a tool can
carry a modelled holder body). Files saved by 0.15.0 or earlier open here and
are migrated when saved, but a v58 file saved by 0.16.0 is refused by older
builds (save a copy first if you still need 0.15.0). Two post behaviours also
tighten and can refuse a program that used to post: the Tormach posts now
retract to the machine file's safe_retract and refuse a non-Tormach machine
that states none, the Siemens 840D post refuses any machine that states none
(#495, #503), and a probing post script must declare
onProbeGuard or the Probe op is refused by name (#174). The built-in VMC,
tilt-head, Lathe and Mill-turn machines now state their strokes in program
coordinates (#457, #493), so programs they used to refuse now post.
A minor release headlined by fixtures judged against their real mesh, tools
that carry modelled holder bodies, one NC file per mount for multi-setup jobs,
a Machines pane that edits machine files, and a much larger MCP surface. It
also lands a long run of sim, gouge-gate and post fixes. Thanks to mkinney,
seelesturm, austin62jake and tbrasselle for their contributions.
New
- One NC file per mount (#388): setups on different machines or posts
generate on their own machine, and the post writes one NC file per
machine/post, each judged against its own machine; the program sim refuses
by name to carry stock between setups on different machines (#404).
Pause, optional stop and go-home entries can sit between operations (#155). - Fixtures judged against their real mesh (#339): the box stays the broad
phase, so a path between vise jaws no longer refuses the post; tilted,
rotary, spindle-C and XZ/YZ-arc moves are judged too, each arc chord padded
by its sagitta (#491), and spindle-C moves are judged at the station pose
(#486). An upright rapid checks the whole tool stack and a ramp each band
over its true height span (#424, #425). The fixture UX (PR #549, replacing
#482, mkinney): mark or import a fixture from the browser, see whether each
is judged by mesh or box and why, and see which fixture a warned move
strikes. The Fixtures page rows wrap and Place has labelled fields (#509). - Tools with holder bodies: a tool carries a modelled holder (STEP/STL/OBJ)
placed by axis and tip, judged by its revolved envelope (#368); import,
place and draw it in the tool editor and sim (#371); draw a milling holder
as a revolved outline (#93). Lathe tools carry a holder or boring-bar body
judged against the revolved stock (#369) with an optional insert zone
(#396). Export and import a.camtoolslibrary (#300, PR #487 replacing
#466). - MCP server: pick faces, edge chains and loops for an operation (#180);
detect_holes(#312, PR #456 replacing #314);render_stockPNG with rest
and gouge volume (#182); setups, work offsets, machines and fixtures (#181);
tool-library export/import (#355, PR #490 replacing #467); stdio hardening
against null ids, oversize and non-UTF-8 lines (#443). - Machines pane (View > Machines): browse and validate machine files
(#287), and create, edit and save.mchfiles with per-field validation
and atomic writes (#383). Machine files for the Tormach PCNC 770 and 1100
(#170). - Probing: seed a Probe op from a picked face, edge, vertex or round wall
(#171); positioning moves post as protected stop-on-contact moves (#174);
Fanuc probing on an inverted X/Y axis (#392). - UI: orthographic (parallel) projection with a Projection row and bare P
(#434, tbrasselle); warned toolpath moves are marked in the viewport and
framed from the op page (#261, PR #454 replacing #349); a refused post's
reason stays in a window (#265, PR #451 replacing #296); the Post dialog
opens where the document last posted (#258, austin62jake); the G-code
viewer lists from the left edge (#256, austin62jake); the Stock page and
Theme button split (#441, #442); macOS Cmd+Q asks about unsaved changes
(#144); the browser tree reads on the light theme (#506). - Licence: CamCraft is now Apache-2.0 (was MIT), copyright held by its
contributors (#452).
Fixed
- Post gate false gouges and misses: XY arcs are cut on the true circle,
not inscribed chords, in the column engine (#402), the field engine and the
envelope scan (#413); a column within tolerance of a wall is judged against
the floor beside it (#299); a typed Slot's round ends no longer read as a
gouge (#510); a 2D Chamfer or Deburr is judged against its declared edge
break (#303); the scallop check reads to the ball diameter (#212). - Crash: an intermittent SIGSEGV/SIGABRT when threads created their first
world at once is gone (#379). - Alignment picks refuse by name on an inside-out, open or non-manifold
body instead of silently flipping the part (#366). - Turning: multi-pass, chamfer and taper turning exit a longer bar safely
(#323, seelesturm); the rotary wrap turns its seam clear of a D-flat or
keyway (#226); rotary Adaptive no longer sorts its leave-limit level by
float noise (#55); swarf raster lines keep their lying angle on rapids
(#48). - Posts: the Fanuc probe result no longer writes a doubled sign (#377); a
trailing Go home is written once (#504); the Tormach and Siemens 840D
retract from the machine file (#495, #503).
Known issues
- #554: face picking on the setup page keeps snapping to an edge.
- #330: Align by picking a face or two edges moves the part but does not
fully rotate it onto the chosen G17/G18/G19 plane. - #558: another setup's WCS can be drawn in the wrong place when the part
is aligned differently. - #523: posts start the spindle (S0 M3) on a probe tool.
- #74: GPU selection can fail on hybrid Intel/NVIDIA laptops.
Report a bug or ask for a feature
- Found a bug? Open a bug report: a
toolpath that looks wrong, a crash, or a refusal you think is mistaken. - Want a feature or an enhancement? Request it:
say what you are trying to machine and what is in the way. - Not sure? Ask on Discord first.
Thanks
Thank you to everyone who contributed to this release:
v0.15.0
CamCraft 0.15.0 - a clean-room CAM system that turns 3D models into
NC programs for CNC milling and turning.
- Full history: CHANGELOG.md
- Roadmap: the open issues are the current roadmap
- Questions: ask on Discord
What's in this release
BREAKING: the project file format moved from v50 to v57, and two of those
steps change what a project means. Files saved by 0.14.0 or earlier are
migrated when opened, but a file saved by 0.15.0 is refused by older builds
(save a copy first if you still need 0.14.0).
- One WCS per setup (#342): a setup now owns a single work coordinate
system, and G54-G59 is only the label the post writes for it. Placed slots
that no setup posted are dropped on load, each with a load note naming the
entity and where it sat; single-WCS projects post byte for byte as before.
TheSetWcsOrigincommand lost its slot argument. - The setup defines the work offset, not each height (#329): a height
measured from the work offset reads its setup's offset, and the Heights
page no longer offers a per-height WCS choice. A project from 0.14.0 or
earlier whose operations used different G54-G59 slots inside one setup is
refused at load by name (open it in 0.14.0, make the slots agree, save,
then open it here).
A minor release headlined by multi-setup machining: a setup tree in the
browser, setups placed relative to one another, the stock carried from one
setup into the next (including rest machining, verification and fixtures),
plus inverted machine axes. Thanks to austin62jake, bherbruck, linuxguy123,
mkinney and seelesturm for their contributions.
New
- Setups as a tree (#343): the browser shows each setup as a node with an
active-setup radio and its own WCS, Stock, Machine, Post, Fixtures, Tool
list and Operations; a setup can have its own machine and post. - Part alignment per setup (#326, #330): hold the part flipped or turned
(presets or typed angles) with the stock following square to the setup
frame, or lay it on a G17/G18/G19 plane by picking a flat face or two
straight edges. Face, 2D Contour, 2D Pocket and 2D Adaptive generate and
post in an aligned setup; every other kind is refused by name. - Place a setup relative to another (#316): same way up, flipped, turned
or by angles; changing the previous setup's alignment carries into the
linked setups, and the transform between two setups is derived from their
alignments. - Stock carried between setups: the program sim carries the machined body
through the setup transform (#317); rest machining in a later setup reads
it, and an upstream change marks the later setup Stale (#318); rapids,
entries and links are judged against it (#319); a setup after the first can
take its own stock or what the setup before leaves behind, and the setup
page shows the incoming stock (#320); fixtures read the carried stock, a
lathe or mill-turn part flip is refused by name, and the carried body is
cached (#321). - Pick the work offset a setup posts at (#196) on the Setups page; the
setup sheet names it and conflicting picks are refused by name. - Inverted machine axes: the machine file states a per-axis direction
(#373); the Fanuc and Haas posts write the program mirrored (#374: signs,
I/J/K, G2/G3, G41/G42, work-offset origin; an inverted Z, helical arcs,
threading, rotary, live tooling, probing and every other post are refused by
name); the axis is shown on the viewport triad, the setup sheet and the NC
header (#375). - Pause or home after an operation, suppress an operation, "Skip pauses
and homes" post option and one NC file per operation (#110, #111). - G41/G42 cutter compensation on Haas, Mazak and Siemens 840D (#39).
- Continuous C-axis live tooling (#33): rotary kinds on a mill-turn's
spindle state the C angle per move and post through the Fanuc lathe post. - Comments in posted programs naming the setup, each operation and each
tool, in every dialect's own syntax (#257, mkinney). - Machine files for the other Tormach mills (#170, mkinney): 770M, 1100MX,
1500MX and PCNC 440; a .mch can state spindle belt ranges and rigid-tap
ability. - Lathe parts with a large keyway or flat turn instead of being refused
(#113, mkinney); grooving, parting and form tools are cut with their true
blade profile in the lathe stock sim (#21). - Probe: the stylus stem and body are judged against the part (#172,
mkinney). - Stock view and sim: dual contouring for the machined-stock mesh keeps a
pocket's sharp edges (#23); the mesh paints deviation classes and lights the
hovered facet (#25); the hidden-rest scan answers past its old budget (#24). - UI: the Stock page shows stock only and the theme and colour-vision
picks have their own Theme ribbon button (#441); build version, time and
commit show in the toolbar and a Debug info window with a Copy button opens
from the status strip (#352, linuxguy123; #157, bherbruck); spindle speed is
editable as rpm or surface speed (#225, bherbruck); a refusal on the status
strip is drawn as an alert (#192, bherbruck); ribbon section and machine
doors wear glyphs (#207, bherbruck); a new document can reach the Setups page
to create its first setup (#322). - Logging: the launching terminal logs save, open, post, generation and
commands (#163, bherbruck; CAMCRAFT_LOG / RUST_LOG). - Operation tops below the remaining stock are explained during upright
2D/3D generation (#104, seelesturm). - Packaging and tooling: Arch and FreeBSD package targets (#72,
linuxguy123); the Windows installer's embedded uninstaller is signed when a
certificate is configured (#29); headless dev binaries per crate (#32); the
kernel seam gains union/intersection and edge blends, benched only (#27).
Fixed
- Cutter compensation is engaged in G17, never in a stale G18/G19, on the
Fanuc, Haas, Mazak and Siemens 840D posts (#391). - Work offsets: a rotated work offset (3-2-1 alignment) is refused by name
instead of posting unrotated (#315); a non-finite or zero-length rotation
or a non-finite origin is refused by name (#327, mkinney). - Turning: a pass that ends inside a longer bar leaves its cut at feed
(#229, austin62jake); a plain two-ring bar fits its true axis and wraps
(#228, austin62jake). - Deburr leaves each edge run straight up before travelling (#304,
austin62jake). - STEP import reads the file's length unit (#306, austin62jake).
- CL text dump keeps a C-axis path's spindle angle (#295, austin62jake).
- Facing tells concave returns from narrow gaps between separate holes
(#260, seelesturm); cross-drill topology is stable under roundoff (#151,
seelesturm). - A fresh depth operation bottoms out at the part's floor, not the G54 plane
(#214, mkinney). - A loaded stock keeps its geometry revision, so a project resaves
byte-identically (#340, mkinney). - A ball nose's corner radius is its ball, shown and saved as half the
diameter (#263, austin62jake); Fit to Models' cylinder stock is snug (#230,
bherbruck).
Known issues
- #424 and #425 (P0, fixture law): an upright rapid checks only the flute
against fixtures, so the shank, holder and spindle housing can hit a clamp
unreported; and a ramp is judged at its lowest z, so the top of the tool
stack at the high end can hit a clamp unreported. Both predate 0.15.0 and
are being worked. Until they land, check clamp clearance for holder and
spindle by hand.
Report a bug or ask for a feature
- Found a bug? Open a bug report: a
toolpath that looks wrong, a crash, or a refusal you think is mistaken. - Want a feature or an enhancement? Request it:
say what you are trying to machine and what is in the way. - Not sure? Ask on Discord first.
Thanks
Thank you to everyone who contributed to this release:
v0.14.0
CamCraft 0.14.0 - a clean-room CAM system that turns 3D models into
NC programs for CNC milling and turning.
- Full history: CHANGELOG.md
- Roadmap: the open issues are the current roadmap
- Questions: ask on Discord
What's in this release
A minor release: a Probe operation, per-operation coolant, G76 threading,
wear-mode cutter compensation, a Tormach post, 3-2-1 work-offset alignment,
an MCP server for AI agents, and a long run of rapid, drilling and lathe
safety fixes. Thanks to bherbruck, mkinney and seelesturm for their
contributions.
New
- Probe operation (#108): face, edge, outside-corner and bore/boss-centre
finding with a touch probe. The Fanuc post writes G31 skip touches with a
no-contact alarm, can set G54-G59 or stop for the operator, and stops when a
result is out of tolerance. Posts that cannot probe refuse it by name. - Coolant per operation (#112): Off, Flood (default), Mist or Through
tool. Every post writes the machine's own code, with M9 before each tool
change and at program end. A coolant the machine has no code for blocks the
post by name. - G76 threading (#34): the Fanuc Lathe post can write a thread as a
two-block G76 cycle (post option "Threading", default G32 passes). - Wear-mode cutter compensation (#38): the contour's tool-centre path
posts under G41/G42 Dn / G40, with the register holding only the wear delta
(Fanuc; other posts refuse by name). - Tormach PathPilot post and 770MX machine (#131, mkinney). A machine
file in inches now posts inch (G20) programs through posts that read the
machine's units. - Controller tool numbers (#221, mkinney): a tool can carry its own
T/H number; two tools posting one number are refused. - Align a work offset 3-2-1 (#187, bherbruck) from a picked face, edge
and vertex or bore. - Box stock per-side allowance (#198, bherbruck), and the Stock page
shows the models' size and extents (bherbruck). camcraft-cli mcp(#128): a stdio MCP server that lets an AI agent
open or import a model, set stock and tools, edit operations, generate,
verify and post - every change undoable.- Unsaved changes (#107): the title shows
*, and closing, Ctrl+Q, New
or Open over unsaved work asks Save / Don't Save / Cancel. - 3D finish scallop ceiling (#37): a stepover at or past the ball
diameter, or a tolerance at or past half the ball radius, is refused by
name. - UI: Create cells darken without stock and open the Stock page (#216);
a chunkier, readable origin triad (#195); pinning ribbon cells is undoable
(#143, mkinney). - Stock view: the rotary simulation states (and can enforce) its
flute-rotation bound (#20); shading reads a true distance gradient (#22).
Fixed
- Rapids are judged more strictly: against the tool's whole footprint
(#106), along the whole length of sideways rapids (#140), and for turning
in the meridian plane against the revolved bar (#103). Any rapid into
uncut stock blocks the post. - Ops go Stale when what they read changes: a stock edit (#156) or an
earlier op of the setup changing (#109) marks dependent ops Stale, and the
post refuses them until they are regenerated; one Regenerate All brings a
job current. Saved projects may show some ops Stale once after upgrading. - Drilling reads the stock earlier operations left (#89). A cross drill
is judged against the finished part (#117) and enters box stock at the face
(#85). It no longer gets the axial-hole check on a lathe (#80), reads its
holder per station (#119) and unwelded STL rounds at their true surface
(#121), and hops clear between off-centre holes (bherbruck, #81). - Lathe: turning ops approach from, and rough down from, a bar wider
than the part (#130). A boring bar's body is checked on its cutting feeds
(#146). Facing faces the stock allowance above a finished part (#122,
bherbruck). - Axis fit: it no longer leans on one cross hole (#116), reads short bars
from their facing flats (#152), and refuses normals that only meet at one
point (#208). Fine-meshed balls (#237) and D-flat bars (#246) read
correctly again (bherbruck). The rotary wrap names a seam feature or skin
hole instead of "the mesh is open" (#54). - New operations post after their setup's existing ones, not in name order
(#167, bherbruck). - Project files round-trip every float exactly (#169).
- The Heidenhain DIN/ISO post declares the TNC's
.Iextension (#52,
mkinney). - Idle frames no longer redraw, resizing stays responsive, and rotated face
and edge picks no longer freeze (#164).
Changed
- With a single part (or its named source model), moving or rotating the
part now carries a non-model stock along in the same undo step (#164).
Known limits: the probe op is not yet created from a picked face, edge or
cylinder (#171); on CPU-rendered stock previews a paused scrub may stay stale
until the mouse moves.
Report a bug or ask for a feature
- Found a bug? Open a bug report: a
toolpath that looks wrong, a crash, or a refusal you think is mistaken. - Want a feature or an enhancement? Request it:
say what you are trying to machine and what is in the way. - Not sure? Ask on Discord first.
Thanks
Thank you to everyone who contributed to this release:
v0.13.0
CamCraft 0.13.0 - a clean-room CAM system that turns 3D models into
NC programs for CNC milling and turning.
- Full history: CHANGELOG.md
- Roadmap: the open issues are the current roadmap
- Questions: ask on Discord
What's in this release
A minor release: CamCraft now ships for Linux and macOS as well as Windows,
three collision checks are tighter (issues #84, #91, #96), and a keyed shaft
is no longer refused on the lathe (issue #71).
New
- Packages for Linux and macOS (contributed by linuxguy123): macOS ZIP
and DMG, AppImage, Snap, Flatpak, and Linux x86_64 TAR.GZ, DEB and RPM,
next to the Windows ZIP and installer; an Arch Linux source package
(PKGBUILD) is inaur/. This is the first release these packages are
built for on GitHub - the macOS, Snap and Flatpak builds have not run on a
real runner before, so report anything that does not install or start. The
macOS build is not notarized yet - Gatekeeper may call a downloaded DMG
damaged until its quarantine flag is cleared.
Fixed
- Drilling checks the tool can reach (#84): a hole deeper from the stock
surface than the drill's flute is refused by name (a bore or tap in an
existing hole only needs a shank that fits it), and the holder is proved
clear of the stock (including the cross drill's swing over the end face). - A drill R plane below the stock or part top is refused (#91): the rapid
down to R used to cut through material and post silently. - A rapid straight down into uncut stock blocks the post (#96), for every
milling and drilling operation - unless an earlier operation of the setup
already removed that stock. Turning rapids along the spindle axis keep their
old reading for now (#103). - Keyed and flatted shafts turn (#71): the lathe axis is read on the
turned surface, so a correctly placed keyed shaft is no longer refused; a
note names the share of the surface (keyways, flats, holes) left for a later
setup. - The AppImage starts (linuxguy123).
Known limits: with stock declared, a hole on an already-machined pocket floor,
or face-then-drill, may be refused by the drilling checks until they learn what
earlier operations removed (#89); a large keyway is still refused as "not
revolved" (#110).
Report a bug or ask for a feature
- Found a bug? Open a bug report: a
toolpath that looks wrong, a crash, or a refusal you think is mistaken. - Want a feature or an enhancement? Request it:
say what you are trying to machine and what is in the way. - Not sure? Ask on Discord first.
Thanks
Thank you to everyone who contributed to this release:
v0.12.0
CamCraft 0.12.0 (clean-room implementation)
A minor release, breaking first: Heidenhain NC output and the project file
format change (issues #50, #45, #62, #9, #19).
Breaking
- Heidenhain DIN/ISO programs take the TNC's own block form (#50):
numbered blocks ending*, signed words, the%NAME G71frame; drilling
posts as plain moves with the dwell at the bottom, because G73/G80/G54/G55
mean something else on a TNC. Tapping and any work offset but the first are
refused by name on this post until the native cycles land (#51). - Project files are v50 (#45 part, contributed by linuxguy123): older
builds refuse them; v49 files load and migrate.
New
- Project and operation workflow (#45 part, PR #58): Save As and kept
filenames; rename, reorder, copy and paste operations, with playback in
their order; browser collapse and viewport visibility controls. - Adaptive on the rotary wrap (#9): each developed level clears on the
adaptive planner under the load and kink laws; a level it refuses is named
by its radius and cut by Offset rings. - Turning programs in the stock simulation (#19): facing, profile,
contour and boring simulate about the part's spindle; blade, thread and form
tools are refused by name until their sweep lands (#21).
Fixed
- A turning part whose axis is not the machine spindle is refused (#62):
a part leaning even slightly, or off the work offset, used to post a taper
or an eccentric with no warning. It is now refused by name at generation
and again at posting (so moving the work offset afterwards is caught), to
within 0.0005 mm over the whole part.
CamCraft 0.11.0 (clean-room implementation)
A minor release, breaking first: Heidenhain NC output changes for every XY
arc (issues #49, #17, #18).
Breaking
- Heidenhain DIN/ISO arcs post their true centre (#49). The TNC reads
I/J as the absolute circle centre, entered in its own block before the
G02/G03 (TNC 640 ISO programming manual). The post wrote the centre
relative to the arc start, so a real control would cut around the wrong
centre. Every Heidenhain XY arc's output changes; an arc without a centre
is now refused by name.
Fixed
- Swarf links half as often and never tilts under level (#17): about
half the air links on the blade, the lowest pose level instead of 7-9
degrees under, and a ball tool's re-entry into the cut it just left is no
longer refused as a plunge.
Decided
- Heidenhain vertical arcs and oblique entries stay chord fans (#18):
the manuals give no rotation sense for off-plane arcs, so a native arc
would be a guess; the fan is exact to the output resolution.
CamCraft 0.10.0 (clean-room implementation)
A minor release: one new capability and two fixes (issues #15, #14, #16).
New
- Rotary Parallel and Swarf ramp in on their first entry (#15). Where a
straight plunge is refused, the first infeed now comes in on a sloped ramp,
each one proved clear of the part and the stock before it is kept.
Fixed
- A lead-in outside a round bore is seated inside it (#14): one descent
per level instead of a plunge into material beside the bore. - Rotary Offset is judged against the real round bar (#16). Its plunge
check now uses the true stock cylinder about the rotary axis instead of a
box around it, so moves in the air beside the bar are no longer refused.
CamCraft 0.9.0 (clean-room implementation)
A minor release: one new capability and one measurement fix (issues #11, #10).
New
- Adaptive arc output covers the growing spiral (#11). Where a single
arc could not follow the spiral's changing curvature, the path is now
fitted with pairs of tangent arcs (biarcs), each proved inside the area,
crossing-free and kink-free - about a third fewer moves: rectangle
18,372 → 12,730, L-pocket 51,788 → 34,582, slot 23,382 → 14,748.
Fixed
- The load reader reads chord paths at their true engagement (#10): it
faces the path's real direction at each corner, not the lagging chord, so
readings on straight-segment paths dropped (e.g. the L-pocket from 22.2 %
to 21.4 % of the tool diameter at the coarse grid).
CamCraft 0.8.4 (clean-room implementation)
A patch release: three fixes (issues #13, #36, #46).
Fixed
- 2D Adaptive no longer hangs on a long thin band (#13). A channel too
long and narrow for the adaptive spiral is refused in about a second with
its size named, and Offset rings cut it - instead of planning for minutes. - Finishing passes ride over mesh folds (#36). On coarse meshes the
rows no longer skip a strip at every fold, so the scallop stays within
tolerance on curved parts. - Raster passes reach the rim (#46). Each pass ends with a row where its
ground ends, so tilted and flat shelves are finished to the edge.
Also in this build
- The 2D Adaptive trochoid fallback is wired but still refused by name in
every case (its landings are #47); output is unchanged.
CamCraft 0.8.3 (clean-room implementation)
A patch release: four fixes, three of them safety (issues #12, #42, #43, #40).
Fixed
-
A whole-part Pocket or 2D Adaptive no longer cuts into the part (#12).
With the whole model as the source, it now clears only the stock around
the part; if the part fills the stock outline, it refuses and says so. -
The verifier catches a straight cut across a part's corner (#42).
Pocket-type operations are now checked along every move, not only at its
end - a 0.3 mm corner intrusion reads as a gouge and blocks the post. -
G41/G42 compensation refuses contours the controller cannot offset
(#40): inside fillets tighter than the tool, edges too short for the
offset, and necks narrower than the tool - each named with its position. -
Contour moves are checked against the part's walls along their whole
length (#43), so a straight cut across a convex corner of the wall is a
gouge; a Face's rows crossing its open rim stay legal. -
The pocket check from #42 now judges only the stretch of a move below the
stock top: a ramp crossing the wall line in the air is not a gouge.
CamCraft 0.8.2 (clean-room implementation)
A bug-fix release from hand-testing 0.8.0/0.8.1.
Fixed
- Closing an edge loop. In Edges mode, Shift+click takes the whole loop
an edge lies on, and Ctrl+click adds or removes one edge. The Selection
group shows the hint, and the "open run" error says how to close the loop. - The Bottom height after picking a face. Switching Bottom's From to
Selection kept the previous reference's offset (e.g. +18.7), which put the
floor above the picked face. It now starts at offset 0, so the floor is the
face. - Containment Outside on 2D Adaptive/Pocket. It no longer machines a
recess inside the part: only the outer edge is grown, holes stay protected,
and pockets the band past the outline does not reach are left alone. With
Outside alone the band is exactly one tool wide, so 2D Adaptive refuses it
by name ("no room for an entry") - add a Boundary extension. - Circular follows the selection. Pick a bore rim, a round pocket floor,
or a face around one round hole, and the rings are centred and sized from
it (shown as "From selection: Ø… at (x, y)"). A selection that is not round
is refused with where it deviates; with no selection the typed centre and
radius work as before.
Known
- 2D Adaptive on a wide Outside band can be slow to plan (minutes); 2D
Offset plans the same area quickly.
CamCraft 0.8.1 (clean-room implementation)
A packaging release on top of 0.8.0 - the program is unchanged.
- The repository and the release now carry the project's MIT
LICENSE. - New issue templates on GitHub: Toolpath / path planning bug and
UI / UX bug. - The repository no longer carries local tooling, agent settings or
research material.
The 0.8.0 notes below still describe everything in this build. Fixes for
the bugs reported against 0.8.0 (edge-loop picking, face heights and
Outside containment in 2D Adaptive, Circular following the selection) are
in progress for the next release.
CamCraft 0.8.0 (clean-room implementation)
Eighth public release, cut early (2026-11-06) to park a stable build. It
carries what was planned for three trains (0.8.0, 0.9.0 and most of 0.10.0),
every piece through the full gate, heavy lanes included. Everything a
generator cannot prove safe is still refused by name, never posted.
This is an independent, clean-room reimplementation of user-visible HSMWorks
behavior, specced from published documentation and general machining knowledge.
"HSMWorks" is a trademark of Autodesk; this project is unaffiliated (see
AGENTS.md). Third-party notices: assets/ui/LICENSES.md.
Please start with TESTING.md: a short hand-test list for what changed.
What's new since 0.7.0
Machining
- G41/G42 cutter compensation on Contour: Compensation: In control emits
the part contour withG41/G42 D<tool>/G40through the Fanuc post. It
needs a straight lead of at least the tool radius; anything else is refused
by name, and posts that cannot emit it refuse instead of writing a centre path. - Arc output for adaptive clearing: G2/G3 over the HSM passes, each arc
proven inside the area, crossing-free and kink-free (a bore went from 6,650
to 1,200 moves). - 3D Pocket uses the HSM planner per level (Strategy: Adaptive); a level
it cannot plan is cut with offset rings and the summary names its Z. - Facing goes around holes (Holes: Lift, the default); Cut across air
and Through (the old behaviour) are choices. - Contours across two models: picked edges that meet end to end ...
v0.11.0
CamCraft 0.11.0 (clean-room implementation)
A minor release, breaking first: Heidenhain NC output changes for every XY
arc (issues #49, #17, #18).
Breaking
- Heidenhain DIN/ISO arcs post their true centre (#49). The TNC reads
I/J as the absolute circle centre, entered in its own block before the
G02/G03 (TNC 640 ISO programming manual). The post wrote the centre
relative to the arc start, so a real control would cut around the wrong
centre. Every Heidenhain XY arc's output changes; an arc without a centre
is now refused by name.
Fixed
- Swarf links half as often and never tilts under level (#17): about
half the air links on the blade, the lowest pose level instead of 7-9
degrees under, and a ball tool's re-entry into the cut it just left is no
longer refused as a plunge.
Decided
- Heidenhain vertical arcs and oblique entries stay chord fans (#18):
the manuals give no rotation sense for off-plane arcs, so a native arc
would be a guess; the fan is exact to the output resolution.
CamCraft 0.10.0 (clean-room implementation)
A minor release: one new capability and two fixes (issues #15, #14, #16).
New
- Rotary Parallel and Swarf ramp in on their first entry (#15). Where a
straight plunge is refused, the first infeed now comes in on a sloped ramp,
each one proved clear of the part and the stock before it is kept.
Fixed
- A lead-in outside a round bore is seated inside it (#14): one descent
per level instead of a plunge into material beside the bore. - Rotary Offset is judged against the real round bar (#16). Its plunge
check now uses the true stock cylinder about the rotary axis instead of a
box around it, so moves in the air beside the bar are no longer refused.
CamCraft 0.9.0 (clean-room implementation)
A minor release: one new capability and one measurement fix (issues #11, #10).
New
- Adaptive arc output covers the growing spiral (#11). Where a single
arc could not follow the spiral's changing curvature, the path is now
fitted with pairs of tangent arcs (biarcs), each proved inside the area,
crossing-free and kink-free - about a third fewer moves: rectangle
18,372 → 12,730, L-pocket 51,788 → 34,582, slot 23,382 → 14,748.
Fixed
- The load reader reads chord paths at their true engagement (#10): it
faces the path's real direction at each corner, not the lagging chord, so
readings on straight-segment paths dropped (e.g. the L-pocket from 22.2 %
to 21.4 % of the tool diameter at the coarse grid).
CamCraft 0.8.4 (clean-room implementation)
A patch release: three fixes (issues #13, #36, #46).
Fixed
- 2D Adaptive no longer hangs on a long thin band (#13). A channel too
long and narrow for the adaptive spiral is refused in about a second with
its size named, and Offset rings cut it - instead of planning for minutes. - Finishing passes ride over mesh folds (#36). On coarse meshes the
rows no longer skip a strip at every fold, so the scallop stays within
tolerance on curved parts. - Raster passes reach the rim (#46). Each pass ends with a row where its
ground ends, so tilted and flat shelves are finished to the edge.
Also in this build
- The 2D Adaptive trochoid fallback is wired but still refused by name in
every case (its landings are #47); output is unchanged.
CamCraft 0.8.3 (clean-room implementation)
A patch release: four fixes, three of them safety (issues #12, #42, #43, #40).
Fixed
-
A whole-part Pocket or 2D Adaptive no longer cuts into the part (#12).
With the whole model as the source, it now clears only the stock around
the part; if the part fills the stock outline, it refuses and says so. -
The verifier catches a straight cut across a part's corner (#42).
Pocket-type operations are now checked along every move, not only at its
end - a 0.3 mm corner intrusion reads as a gouge and blocks the post. -
G41/G42 compensation refuses contours the controller cannot offset
(#40): inside fillets tighter than the tool, edges too short for the
offset, and necks narrower than the tool - each named with its position. -
Contour moves are checked against the part's walls along their whole
length (#43), so a straight cut across a convex corner of the wall is a
gouge; a Face's rows crossing its open rim stay legal. -
The pocket check from #42 now judges only the stretch of a move below the
stock top: a ramp crossing the wall line in the air is not a gouge.
CamCraft 0.8.2 (clean-room implementation)
A bug-fix release from hand-testing 0.8.0/0.8.1.
Fixed
- Closing an edge loop. In Edges mode, Shift+click takes the whole loop
an edge lies on, and Ctrl+click adds or removes one edge. The Selection
group shows the hint, and the "open run" error says how to close the loop. - The Bottom height after picking a face. Switching Bottom's From to
Selection kept the previous reference's offset (e.g. +18.7), which put the
floor above the picked face. It now starts at offset 0, so the floor is the
face. - Containment Outside on 2D Adaptive/Pocket. It no longer machines a
recess inside the part: only the outer edge is grown, holes stay protected,
and pockets the band past the outline does not reach are left alone. With
Outside alone the band is exactly one tool wide, so 2D Adaptive refuses it
by name ("no room for an entry") - add a Boundary extension. - Circular follows the selection. Pick a bore rim, a round pocket floor,
or a face around one round hole, and the rings are centred and sized from
it (shown as "From selection: Ø… at (x, y)"). A selection that is not round
is refused with where it deviates; with no selection the typed centre and
radius work as before.
Known
- 2D Adaptive on a wide Outside band can be slow to plan (minutes); 2D
Offset plans the same area quickly.
CamCraft 0.8.1 (clean-room implementation)
A packaging release on top of 0.8.0 - the program is unchanged.
- The repository and the release now carry the project's MIT
LICENSE. - New issue templates on GitHub: Toolpath / path planning bug and
UI / UX bug. - The repository no longer carries local tooling, agent settings or
research material.
The 0.8.0 notes below still describe everything in this build. Fixes for
the bugs reported against 0.8.0 (edge-loop picking, face heights and
Outside containment in 2D Adaptive, Circular following the selection) are
in progress for the next release.
CamCraft 0.8.0 (clean-room implementation)
Eighth public release, cut early (2026-11-06) to park a stable build. It
carries what was planned for three trains (0.8.0, 0.9.0 and most of 0.10.0),
every piece through the full gate, heavy lanes included. Everything a
generator cannot prove safe is still refused by name, never posted.
This is an independent, clean-room reimplementation of user-visible HSMWorks
behavior, specced from published documentation and general machining knowledge.
"HSMWorks" is a trademark of Autodesk; this project is unaffiliated (see
AGENTS.md). Third-party notices: assets/ui/LICENSES.md.
Please start with TESTING.md: a short hand-test list for what changed.
What's new since 0.7.0
Machining
- G41/G42 cutter compensation on Contour: Compensation: In control emits
the part contour withG41/G42 D<tool>/G40through the Fanuc post. It
needs a straight lead of at least the tool radius; anything else is refused
by name, and posts that cannot emit it refuse instead of writing a centre path. - Arc output for adaptive clearing: G2/G3 over the HSM passes, each arc
proven inside the area, crossing-free and kink-free (a bore went from 6,650
to 1,200 moves). - 3D Pocket uses the HSM planner per level (Strategy: Adaptive); a level
it cannot plan is cut with offset rings and the summary names its Z. - Facing goes around holes (Holes: Lift, the default); Cut across air
and Through (the old behaviour) are choices. - Contours across two models: picked edges that meet end to end across
bodies become one ring, and the depth ladder cuts every level of the union. - Waterline stepdown reads the slope, and the finishing march no longer
drops rows across mesh fold gaps - most scallop readings are now inside the
tolerance. - Boundaries everywhere they apply: on 3+2-indexed operations (read in the
tilted plane), on every 3D finish, and on Trace/Engrave; a clipped finish
ramps back in. - Lathe: axial drilling on the spindle axis, and the first lathe post
(Fanuc Lathe: diameter X, G96/G97/G50, G99, G83/G84/G85, G32). The Setup
pane offers the matching post when you mount a lathe; it never switches it
for you. C-axis live tooling is not in this release (refused by name).
Safety
- 5-axis swarf no longer drags the tool's flank through the part on its
in-air links (it retracts along the surface normal) and never falls back to
an upright pose inside a wall. - Fixtures are checked along the whole move, not just at its ends, for
every pose change. - Scallop is reported (a non-blocking note) where a finish leaves more
than its tolerance.
Simulation and display
- The machined stock is drawn in the viewport and can be picked; rotary
programs now show their stock too. - Playback jumps no longer stall, and the CPU fallback renders off the UI
thread.
Models and output
- Repair mesh (Model page): weld vertices and fill planar holes, one undo
step, never automatic. - The setup sheet says whether each fixture is fixed or turns with the part.
- Windows installer (preview) beside the zip, and an optional signing step;
this build is unsigned.
...
v0.10.0
CamCraft 0.10.0 (clean-room implementation)
A minor release: one new capability and two fixes (issues #15, #14, #16).
New
- Rotary Parallel and Swarf ramp in on their first entry (#15). Where a
straight plunge is refused, the first infeed now comes in on a sloped ramp,
each one proved clear of the part and the stock before it is kept.
Fixed
- A lead-in outside a round bore is seated inside it (#14): one descent
per level instead of a plunge into material beside the bore. - Rotary Offset is judged against the real round bar (#16). Its plunge
check now uses the true stock cylinder about the rotary axis instead of a
box around it, so moves in the air beside the bar are no longer refused.
CamCraft 0.9.0 (clean-room implementation)
A minor release: one new capability and one measurement fix (issues #11, #10).
New
- Adaptive arc output covers the growing spiral (#11). Where a single
arc could not follow the spiral's changing curvature, the path is now
fitted with pairs of tangent arcs (biarcs), each proved inside the area,
crossing-free and kink-free - about a third fewer moves: rectangle
18,372 → 12,730, L-pocket 51,788 → 34,582, slot 23,382 → 14,748.
Fixed
- The load reader reads chord paths at their true engagement (#10): it
faces the path's real direction at each corner, not the lagging chord, so
readings on straight-segment paths dropped (e.g. the L-pocket from 22.2 %
to 21.4 % of the tool diameter at the coarse grid).
CamCraft 0.8.4 (clean-room implementation)
A patch release: three fixes (issues #13, #36, #46).
Fixed
- 2D Adaptive no longer hangs on a long thin band (#13). A channel too
long and narrow for the adaptive spiral is refused in about a second with
its size named, and Offset rings cut it - instead of planning for minutes. - Finishing passes ride over mesh folds (#36). On coarse meshes the
rows no longer skip a strip at every fold, so the scallop stays within
tolerance on curved parts. - Raster passes reach the rim (#46). Each pass ends with a row where its
ground ends, so tilted and flat shelves are finished to the edge.
Also in this build
- The 2D Adaptive trochoid fallback is wired but still refused by name in
every case (its landings are #47); output is unchanged.
CamCraft 0.8.3 (clean-room implementation)
A patch release: four fixes, three of them safety (issues #12, #42, #43, #40).
Fixed
-
A whole-part Pocket or 2D Adaptive no longer cuts into the part (#12).
With the whole model as the source, it now clears only the stock around
the part; if the part fills the stock outline, it refuses and says so. -
The verifier catches a straight cut across a part's corner (#42).
Pocket-type operations are now checked along every move, not only at its
end - a 0.3 mm corner intrusion reads as a gouge and blocks the post. -
G41/G42 compensation refuses contours the controller cannot offset
(#40): inside fillets tighter than the tool, edges too short for the
offset, and necks narrower than the tool - each named with its position. -
Contour moves are checked against the part's walls along their whole
length (#43), so a straight cut across a convex corner of the wall is a
gouge; a Face's rows crossing its open rim stay legal. -
The pocket check from #42 now judges only the stretch of a move below the
stock top: a ramp crossing the wall line in the air is not a gouge.
CamCraft 0.8.2 (clean-room implementation)
A bug-fix release from hand-testing 0.8.0/0.8.1.
Fixed
- Closing an edge loop. In Edges mode, Shift+click takes the whole loop
an edge lies on, and Ctrl+click adds or removes one edge. The Selection
group shows the hint, and the "open run" error says how to close the loop. - The Bottom height after picking a face. Switching Bottom's From to
Selection kept the previous reference's offset (e.g. +18.7), which put the
floor above the picked face. It now starts at offset 0, so the floor is the
face. - Containment Outside on 2D Adaptive/Pocket. It no longer machines a
recess inside the part: only the outer edge is grown, holes stay protected,
and pockets the band past the outline does not reach are left alone. With
Outside alone the band is exactly one tool wide, so 2D Adaptive refuses it
by name ("no room for an entry") - add a Boundary extension. - Circular follows the selection. Pick a bore rim, a round pocket floor,
or a face around one round hole, and the rings are centred and sized from
it (shown as "From selection: Ø… at (x, y)"). A selection that is not round
is refused with where it deviates; with no selection the typed centre and
radius work as before.
Known
- 2D Adaptive on a wide Outside band can be slow to plan (minutes); 2D
Offset plans the same area quickly.
CamCraft 0.8.1 (clean-room implementation)
A packaging release on top of 0.8.0 - the program is unchanged.
- The repository and the release now carry the project's MIT
LICENSE. - New issue templates on GitHub: Toolpath / path planning bug and
UI / UX bug. - The repository no longer carries local tooling, agent settings or
research material.
The 0.8.0 notes below still describe everything in this build. Fixes for
the bugs reported against 0.8.0 (edge-loop picking, face heights and
Outside containment in 2D Adaptive, Circular following the selection) are
in progress for the next release.
CamCraft 0.8.0 (clean-room implementation)
Eighth public release, cut early (2026-11-06) to park a stable build. It
carries what was planned for three trains (0.8.0, 0.9.0 and most of 0.10.0),
every piece through the full gate, heavy lanes included. Everything a
generator cannot prove safe is still refused by name, never posted.
This is an independent, clean-room reimplementation of user-visible HSMWorks
behavior, specced from published documentation and general machining knowledge.
"HSMWorks" is a trademark of Autodesk; this project is unaffiliated (see
AGENTS.md). Third-party notices: assets/ui/LICENSES.md.
Please start with TESTING.md: a short hand-test list for what changed.
What's new since 0.7.0
Machining
- G41/G42 cutter compensation on Contour: Compensation: In control emits
the part contour withG41/G42 D<tool>/G40through the Fanuc post. It
needs a straight lead of at least the tool radius; anything else is refused
by name, and posts that cannot emit it refuse instead of writing a centre path. - Arc output for adaptive clearing: G2/G3 over the HSM passes, each arc
proven inside the area, crossing-free and kink-free (a bore went from 6,650
to 1,200 moves). - 3D Pocket uses the HSM planner per level (Strategy: Adaptive); a level
it cannot plan is cut with offset rings and the summary names its Z. - Facing goes around holes (Holes: Lift, the default); Cut across air
and Through (the old behaviour) are choices. - Contours across two models: picked edges that meet end to end across
bodies become one ring, and the depth ladder cuts every level of the union. - Waterline stepdown reads the slope, and the finishing march no longer
drops rows across mesh fold gaps - most scallop readings are now inside the
tolerance. - Boundaries everywhere they apply: on 3+2-indexed operations (read in the
tilted plane), on every 3D finish, and on Trace/Engrave; a clipped finish
ramps back in. - Lathe: axial drilling on the spindle axis, and the first lathe post
(Fanuc Lathe: diameter X, G96/G97/G50, G99, G83/G84/G85, G32). The Setup
pane offers the matching post when you mount a lathe; it never switches it
for you. C-axis live tooling is not in this release (refused by name).
Safety
- 5-axis swarf no longer drags the tool's flank through the part on its
in-air links (it retracts along the surface normal) and never falls back to
an upright pose inside a wall. - Fixtures are checked along the whole move, not just at its ends, for
every pose change. - Scallop is reported (a non-blocking note) where a finish leaves more
than its tolerance.
Simulation and display
- The machined stock is drawn in the viewport and can be picked; rotary
programs now show their stock too. - Playback jumps no longer stall, and the CPU fallback renders off the UI
thread.
Models and output
- Repair mesh (Model page): weld vertices and fill planar holes, one undo
step, never automatic. - The setup sheet says whether each fixture is fixed or turns with the part.
- Windows installer (preview) beside the zip, and an optional signing step;
this build is unsigned.
Known limits
- C-axis live tooling, G41/G42 wear mode, and comp on posts other than Fanuc.
- Lathe operations are not shown in the field stock simulation yet (refused
by name; the turning verdict at generation still applies). - The adaptive planner still falls back to offset rings on island pockets.
CamCraft 0.7.0 (clean-room implementation)
Seventh public release: the user-review release. Most of what is new came
straight from hand-testing 0.6.0:
- the operation dialog now reads like a CAM dialog;
- simulation playback no longer locks up;
- lead in / lead out is complete;
- adaptive clearing is a real HSM spiral;
- every boundary says what it does.
Under it, a run of safety work: wherever the verifier had a blind spot, it was
closed. Where a plan could not be made safe, it is refused by name instead of
posted.
This is an independent, clean-room reimplementation of user-visible HSMWorks
behavior, specced from published documentation and general machining knowledge.
"HSMWorks" is a trademark of Autodesk; this proje...
v0.9.0
CamCraft 0.9.0 (clean-room implementation)
A minor release: one new capability and one measurement fix (issues #11, #10).
New
- Adaptive arc output covers the growing spiral (#11). Where a single
arc could not follow the spiral's changing curvature, the path is now
fitted with pairs of tangent arcs (biarcs), each proved inside the area,
crossing-free and kink-free - about a third fewer moves: rectangle
18,372 → 12,730, L-pocket 51,788 → 34,582, slot 23,382 → 14,748.
Fixed
- The load reader reads chord paths at their true engagement (#10): it
faces the path's real direction at each corner, not the lagging chord, so
readings on straight-segment paths dropped (e.g. the L-pocket from 22.2 %
to 21.4 % of the tool diameter at the coarse grid).
CamCraft 0.8.4 (clean-room implementation)
A patch release: three fixes (issues #13, #36, #46).
Fixed
- 2D Adaptive no longer hangs on a long thin band (#13). A channel too
long and narrow for the adaptive spiral is refused in about a second with
its size named, and Offset rings cut it - instead of planning for minutes. - Finishing passes ride over mesh folds (#36). On coarse meshes the
rows no longer skip a strip at every fold, so the scallop stays within
tolerance on curved parts. - Raster passes reach the rim (#46). Each pass ends with a row where its
ground ends, so tilted and flat shelves are finished to the edge.
Also in this build
- The 2D Adaptive trochoid fallback is wired but still refused by name in
every case (its landings are #47); output is unchanged.
CamCraft 0.8.3 (clean-room implementation)
A patch release: four fixes, three of them safety (issues #12, #42, #43, #40).
Fixed
-
A whole-part Pocket or 2D Adaptive no longer cuts into the part (#12).
With the whole model as the source, it now clears only the stock around
the part; if the part fills the stock outline, it refuses and says so. -
The verifier catches a straight cut across a part's corner (#42).
Pocket-type operations are now checked along every move, not only at its
end - a 0.3 mm corner intrusion reads as a gouge and blocks the post. -
G41/G42 compensation refuses contours the controller cannot offset
(#40): inside fillets tighter than the tool, edges too short for the
offset, and necks narrower than the tool - each named with its position. -
Contour moves are checked against the part's walls along their whole
length (#43), so a straight cut across a convex corner of the wall is a
gouge; a Face's rows crossing its open rim stay legal. -
The pocket check from #42 now judges only the stretch of a move below the
stock top: a ramp crossing the wall line in the air is not a gouge.
CamCraft 0.8.2 (clean-room implementation)
A bug-fix release from hand-testing 0.8.0/0.8.1.
Fixed
- Closing an edge loop. In Edges mode, Shift+click takes the whole loop
an edge lies on, and Ctrl+click adds or removes one edge. The Selection
group shows the hint, and the "open run" error says how to close the loop. - The Bottom height after picking a face. Switching Bottom's From to
Selection kept the previous reference's offset (e.g. +18.7), which put the
floor above the picked face. It now starts at offset 0, so the floor is the
face. - Containment Outside on 2D Adaptive/Pocket. It no longer machines a
recess inside the part: only the outer edge is grown, holes stay protected,
and pockets the band past the outline does not reach are left alone. With
Outside alone the band is exactly one tool wide, so 2D Adaptive refuses it
by name ("no room for an entry") - add a Boundary extension. - Circular follows the selection. Pick a bore rim, a round pocket floor,
or a face around one round hole, and the rings are centred and sized from
it (shown as "From selection: Ø… at (x, y)"). A selection that is not round
is refused with where it deviates; with no selection the typed centre and
radius work as before.
Known
- 2D Adaptive on a wide Outside band can be slow to plan (minutes); 2D
Offset plans the same area quickly.
CamCraft 0.8.1 (clean-room implementation)
A packaging release on top of 0.8.0 - the program is unchanged.
- The repository and the release now carry the project's MIT
LICENSE. - New issue templates on GitHub: Toolpath / path planning bug and
UI / UX bug. - The repository no longer carries local tooling, agent settings or
research material.
The 0.8.0 notes below still describe everything in this build. Fixes for
the bugs reported against 0.8.0 (edge-loop picking, face heights and
Outside containment in 2D Adaptive, Circular following the selection) are
in progress for the next release.
CamCraft 0.8.0 (clean-room implementation)
Eighth public release, cut early (2026-11-06) to park a stable build. It
carries what was planned for three trains (0.8.0, 0.9.0 and most of 0.10.0),
every piece through the full gate, heavy lanes included. Everything a
generator cannot prove safe is still refused by name, never posted.
This is an independent, clean-room reimplementation of user-visible HSMWorks
behavior, specced from published documentation and general machining knowledge.
"HSMWorks" is a trademark of Autodesk; this project is unaffiliated (see
AGENTS.md). Third-party notices: assets/ui/LICENSES.md.
Please start with TESTING.md: a short hand-test list for what changed.
What's new since 0.7.0
Machining
- G41/G42 cutter compensation on Contour: Compensation: In control emits
the part contour withG41/G42 D<tool>/G40through the Fanuc post. It
needs a straight lead of at least the tool radius; anything else is refused
by name, and posts that cannot emit it refuse instead of writing a centre path. - Arc output for adaptive clearing: G2/G3 over the HSM passes, each arc
proven inside the area, crossing-free and kink-free (a bore went from 6,650
to 1,200 moves). - 3D Pocket uses the HSM planner per level (Strategy: Adaptive); a level
it cannot plan is cut with offset rings and the summary names its Z. - Facing goes around holes (Holes: Lift, the default); Cut across air
and Through (the old behaviour) are choices. - Contours across two models: picked edges that meet end to end across
bodies become one ring, and the depth ladder cuts every level of the union. - Waterline stepdown reads the slope, and the finishing march no longer
drops rows across mesh fold gaps - most scallop readings are now inside the
tolerance. - Boundaries everywhere they apply: on 3+2-indexed operations (read in the
tilted plane), on every 3D finish, and on Trace/Engrave; a clipped finish
ramps back in. - Lathe: axial drilling on the spindle axis, and the first lathe post
(Fanuc Lathe: diameter X, G96/G97/G50, G99, G83/G84/G85, G32). The Setup
pane offers the matching post when you mount a lathe; it never switches it
for you. C-axis live tooling is not in this release (refused by name).
Safety
- 5-axis swarf no longer drags the tool's flank through the part on its
in-air links (it retracts along the surface normal) and never falls back to
an upright pose inside a wall. - Fixtures are checked along the whole move, not just at its ends, for
every pose change. - Scallop is reported (a non-blocking note) where a finish leaves more
than its tolerance.
Simulation and display
- The machined stock is drawn in the viewport and can be picked; rotary
programs now show their stock too. - Playback jumps no longer stall, and the CPU fallback renders off the UI
thread.
Models and output
- Repair mesh (Model page): weld vertices and fill planar holes, one undo
step, never automatic. - The setup sheet says whether each fixture is fixed or turns with the part.
- Windows installer (preview) beside the zip, and an optional signing step;
this build is unsigned.
Known limits
- C-axis live tooling, G41/G42 wear mode, and comp on posts other than Fanuc.
- Lathe operations are not shown in the field stock simulation yet (refused
by name; the turning verdict at generation still applies). - The adaptive planner still falls back to offset rings on island pockets.
CamCraft 0.7.0 (clean-room implementation)
Seventh public release: the user-review release. Most of what is new came
straight from hand-testing 0.6.0:
- the operation dialog now reads like a CAM dialog;
- simulation playback no longer locks up;
- lead in / lead out is complete;
- adaptive clearing is a real HSM spiral;
- every boundary says what it does.
Under it, a run of safety work: wherever the verifier had a blind spot, it was
closed. Where a plan could not be made safe, it is refused by name instead of
posted.
This is an independent, clean-room reimplementation of user-visible HSMWorks
behavior, specced from published documentation and general machining knowledge.
"HSMWorks" is a trademark of Autodesk; this project is unaffiliated (see
AGENTS.md). Third-party notices: assets/ui/LICENSES.md.
Please start with TESTING.md: a short hand-test list for what changed.
What's new since 0.6.0
From your review
- The operation dialog, Fusion-style.
- Label and value share a row, units sit beside the value, and fields are
grouped in collapsible sections. - Only the fields the current choice uses are shown.
- "0 = auto" fields became explicit Auto toggles, and help moved to tooltips.
- A one-line status banner sits at the top; a fixed action bar at the bottom
has Generate as the primary action and Delete set apart. - The tabs stay.
- Label and value share a row, units sit beside the value, and fields are
- The boundary says what it does.
- One plain sentence per setting, a "Mac...