This is what Claude says about the build currently.
KinetiCAD
The stack
React 19 with Vite 8 and TypeScript 6 in strict mode for the front end. Three.js r184 running on WebGPU for rendering (no WebGL2 fallback, intentionally cutting-edge target). OpenCascade.js handling B-rep modelling in a Web Worker via Comlink. Rapier3D 0.12.0 doing physics in a separate Web Worker. Zustand for state. Tailwind for styling. WASM modules loaded from CDN for production reliability.
The two-worker architecture matters: CAD compilation and physics solving stay off the main thread, so the UI never stutters while the engine grinds.
What it does
Parametric modelling end to end. Sketch on global planes, extrude with Add / Cut / New Body operations, boolean Union / Subtract / Intersect on within-part features, multi-feature parts with full feature trees, edge and face picking with topology metadata, joint creation (Revolute with motor, Fixed), live physics simulation with step diagnostics.
All in the browser. No server-side computation. No installs.
The hard problem we cracked
Mate pivot points were being stored in world coordinates and passed to Rapier, which expects part-local frame. Rapier's constraint formula is anchor = bodyPosition bodyRotation × pivotLocal. When you feed it world coordinates as local, the anchor swings in an arc as the body rotates and the whole part orbits instead of spinning in place.
Fix: a worldToLocalPoint conversion at mate creation time, converting the captured pivot from world space to each part's local frame before storing. Three line change to the pivot validation function. Anchors now coincide at sim start so no jump, and the local-frame Z-component stays invariant under Z-axis rotation so no drift.
The maths (the receipts)
Target: 30 RPM = π rad/s = 3.141592653589793
Measured on the deployed build, windmill rotor with 4 blades and inner hub:
bodyBangvelMag: 3.14159270 to 3.14159298 (sample range) bodyBangvel.x: 3.24e-16 bodyBangvel.y: -3.78e-10 bodyBangvel.z: 3.14159
Error from π: 3e-7 rad/s. Stability: ±5e-7 across 23 seconds of simulated time. Off-axis components at the floating-point precision floor.
Better than 1 part in 10 million accuracy, with zero drift over a long run. Industrial CNC machine tolerances aim for 1e-3 to 1e-5. This is two orders of magnitude tighter.
What's NOT tested
I'm being upfront. We've verified the Revolute mate path and the basic modeller flow that produced the windmill. I have NOT this weekend re-verified: boolean operations across edge cases, mate types other than Revolute and Fixed, multi-mate kinematic chains, the hole feature, save/load (which doesn't exist yet), multi-loop sketch profiles, sketch on a selected face. The README documents the known issues honestly.
Anyone forking this gets a working demo and a clear list of what to build next. Pull requests welcome.