Lockstep API
One JSON request per line; virtual time moves only when you say so. A standard-library Python package wraps it, with batch runs and parameter sweeps over processes.
Studio is deterministic to the bit and documented down to the sources of its model parameters. Use it for control, machining, metrology, education or AI research — and reproduce every result.
One JSON request per line; virtual time moves only when you say so. A standard-library Python package wraps it, with batch runs and parameter sweeps over processes.
Variables, get/set and doStep with FMPy’s names, to couple the twin with models in Modelica, Simulink or Python.
An SHDR adapter with 35 data items and a device file, for dashboards and data pipelines.
MCAP for Foxglove and PlotJuggler, VCD with every step pulse for GTKWave and logic-analyser comparisons, CSV curves.
Mechanistic force model with kc(h, vc), time-domain regenerative chatter and a semi-discretization check, static deflection from the frame FEA.
Geometric error model (lead, periodic, straightness, angular, squareness, backlash, thermal) with ISO 230-2 and 230-4 test scripts.
Twenty-three tools, deterministic replay hashes and an audit log of every call make experiments with language models reproducible and checkable.
Time per program line that sums exactly to the run, and the reason each feed was not reached, from grblHAL's own planner arithmetic.
Feed, speed and path optimization with explicit acceptance rules, verified on fresh twins; a benchmark over the fifteen example parts.
What the twin does not do well yet. We publish these so that results are read with them in mind.
Running real firmware in a deterministic simulator exposes rare timing paths. These reports went to the grblHAL projects with reproductions and patches:
| grblHAL/core #1023 | a resumed block can lose a step on a minor axis after a feed hold |
| grblHAL/core #1024 | the rest of a planner block is discarded during a hold and runs with the next motion |
| grblHAL/core #1026 | on 64-bit hosts an 8-bit offset in the settings sync loses G54 and other data at power-up |
| grblHAL/core #1027 | a refused G93/G95 block zeroes the feed rate |
| grblHAL/Simulator #27 | the validator build hangs and crashes on program end |
@software{twinwright_studio_2026,
title = {Twinwright Studio: a deterministic digital twin of the MC-1 desktop CNC mill},
author = {{Twinwright}},
year = {2026},
url = {https://twinwright.com/research/}
}