Changelog¶
This changelog records changes to the LightBurn / MillMage REST API documentation and specification. Dates use ISO 8601.
Unreleased¶
Cut settings coverage. GET /api/cuts previously reported 16 of the roughly
75 settings the application's cut-settings editors write; this release closes
that gap and restructures the payload so clients can tell which settings apply
to the attached machine. LightBurn only — MillMage is unchanged.
The API is still pre-stable (see docs/versioning.md), so the breaking
changes below ship without a version bump.
Added¶
profileon every LightBurn cut entry:galvo,gantryorunknown. Derived from the selected device profile, so it is correct with no machine physically connected.params.galvo— 14 galvo-only settings: the timing constants (laser_on_tc,laser_off_tc,end_tc,polygon_tc) and theiroverride_timingsgate, jump settings, dot delays, and wobble.params.gantry— 23 gantry-only settings: air assist, cut-through, lead in/out, PPI, dot mode, constant power, overcut and U-axis offset.- Roughly 20 further
LaserCutParamsfields that apply to both machines, includingz_per_pass,angle_per_pass,scan_opt,angle,interval,ramp_length,perforate/perf_len/perf_skip,overscan,flood_fill,auto_rotateand thedefault_*flags. override_frequency— the gate that decides whetherfrequencyis applied at all.- Cut-level fields:
negative,pass_through,enable_cleanup,sort_within_layer, atabsobject, andglobal_passeson galvo. in_useandshape_counton every LightBurn cut entry. Counted per cut setting across every page, so a normal and an image cut sharing a layer are reported separately — which the per-layer count inGET /api/layerscannot do. MillMage entries already carriedshape_count.cells_per_inch,halftone_angleandlink_dpi_to_intervalon image cuts.
Changed (breaking)¶
LaserCutParamsnow nests a machine-specific block. Exactly one ofparams.galvo/params.gantryis present, matching the entry'sprofile; the other machine's values remain stored in the project but are not reported. Clients reading machine-specific settings must look inside the block.POST /api/cuts/{index}rejects the machine block that doesn't matchprofilewith400, rather than ignoring it. Sendingglobal_passesto a gantry device is likewise a400.start_delayandend_delaymoved into the machine blocks. They share storage but mean different things — dot delays on a galvo, pauses on a gantry — so they are now named per block rather than appearing once with an ambiguous meaning.
Fixed¶
frequencywas reported withoutoverride_frequency, so a client could not tell whether a layer applied its frequency or inherited the device default, andPOSTingfrequencycould silently have no effect because the gate stayed false.global_passeswas not reported at all. On a galvo it repeats the entire sub-layer stack, so a client computing total passes from the response was low by that factor.
Unreleased¶
Specification synchronised with the current LightBurn / MillMage
implementation. The API is still pre-stable (see docs/versioning.md), so the
breaking changes below ship without a version bump.
Added¶
GET /api/overlay— the camera overlay drawn on the workspace, as a PNG — andGET /api/overlay/metadatafor its size, workspace placement and arevisionchange token. LightBurn only; MillMage returns404. Reading either endpoint never causes the application to capture a new frame; both return only what is already in memory.distance_units(mm/in) onGET /api/units,GET /api/jog/settingsand thesettingsevent, alongsideunits.in/sadded to theunitsenum.- Multiple instances section describing which running copy serves the port and
what that means for a paired secret (
docs/overview.md, spec description). project_writecapability, requested throughPOST /api/connect.POST /api/cuts/{index}— partial update of one cut setting (LightBurn) or operation (MillMage). Validated as a whole, applied as a single undo step, and returns409while the cut settings / operation editor is open.LaserCutParamsschema shared by a cut's base layer and its sub-layers, adding dual-source (min_power_2,max_power_2,laser1_enabled,laser2_enabled),alt_source,q_pulse_widthandfiber_pulse_width. Image cuts gain the source and pulse fields too.- Full sub-layer entries in
LaserCut.sub_layers:index,name,enabled,modeandparams. device.laseronGET /api/project(LightBurn): controller, galvo, flying galvo, UV, source count, MOPA and fiber flags.CncCut.shape_count,CncCut.settings(every stored operation property) andCncCut.shared_fields.vcarveandvcarve_clearvalues forCncCut.operation.
Fixed¶
unitsreportedmm/swhenever the application's control units were set toin/secor to either mixed mode (inch distances with metric speeds). A client converting on the reported unit was wrong by a factor of 25.4 — the same class of error corrected in the Inkscape examples last release.unitsis now strictly the speed unit and always accurate; the distance unit moved to the newdistance_unitsfield.cut.indexonGET /api/material-libraryentries was0, which looked like a valid/api/cutsposition. Library entries have no position in the cut list, soindexandlayer_indexare now both-1.POST /api/cuts/{index}returned409instead of404for an out-of-range index while the cut editor was open.- The state endpoints (
/api/status,/api/position,/api/jog/settings,/api/units,/api/events/poll) returned empty objects when no machine was attached, and for a moment after the application started. They now always answer:connectedisfalse, and settings and units report real values.
Changed (breaking)¶
- The
projectcapability now also grants the camera overlay endpoints. Existing tokens holdingprojectgain access to camera imagery without re-pairing, so a token issued before this release can read a picture of the user's machine area. Integrators requestingprojectshould say so in their own documentation. CncCutno longer haslayer_indexorpriority— operations attach to shapes and run in list order (index).CncCutno longer has top-levelvacuumandcoolant; they are now keys inCncCut.settings.LaserCut.sub_layersitems no longer have the top-levelspeed,max_powerandz_offsetfields; these are now in each item'sparams.
Clarified¶
- Units: positions and the
/api/projectworkspaceare always in mm; MillMage operationsettingsare always mm and mm/s. LightBurn cut values and the MillMagetoolblock use display units, read fromunitsanddistance_units./api/projectunits.distanceis a translated UI label for display only, not for conversion. GET /api/statusanswers withconnected: falserather than failing when no machine is attached.connectedreports whether a device link is open at that moment, not whether the laser is available. Ruida and some other non-GCode controllers open the link just in time and close it afterwards, soconnectedisfalseat rest for a healthy machine and toggles around activity. How long a link is held open varies by controller and by how the device is connected. It is not a presence or health check (GET /api/status, theconnectionevent,docs/api-reference.md).POST /api/file/openis served by the application's own API surface only.- The Show Secret… button appears only while network access is enabled,
and the dialog is Manage API Security (
docs/authentication.md). - Connection refused and
401mean different things; the authentication failure table now distinguishes them. The API reference's auth convention had kept listing an off-machine request as a401cause — verified against a running instance: with network access off the connection is refused at the TCP layer and no HTTP response is produced. profileon a LightBurn cut entry implies aparams.galvo/params.gantryblock only onkind: "normal"entries. Image cuts carry aprofiletoo but never a machine block, so the previous wording was wrong for half a default 63-entry list (docs/cut-settings.md,docs/api-reference.md,GET /api/cuts,LaserCut.profile).JobState.progressis optional — absent while idle and on controllers that can't report progress.- On Ruida controllers
JobState.stateis alwaysidleandprogressis never present — while the job file is sent and while the machine cuts. The controller runs the job on its own once it has the file, and the application doesn't track it. The previous wording said Ruida reported file-transfer progress; that never reaches the API (JobState,docs/api-reference.md). Positionomits any axis the controller doesn't report.GET /api/projectreturns onlyfilename,modifiedandshape_countwhen no project is loaded.GET /api/cutson LightBurn is a fixed-size list (30 cut layers, 2 tool layers, 1 internal cut, 30 image cuts); on MillMage it is the operation list in order.GET /api/eventsopens with a:connectedcomment; "on change" events aren't replayed to new subscribers, so poll once after connecting. The event table now names each event'sdataschema. A401has an empty body.POST /api/file/openreports its result through thefile_importedevent.- That result is reliable only for native project files (
.lbrn/.lbrn2,.mage). Opening a template or any other format — SVG, DXF, images — reportssuccess: falseeven when the file opened correctly, verified against a running instance. Confirm those opens withGET /api/projectinstead (POST /api/file/open,docs/uploading.md,docs/api-reference.md).
Documentation¶
- New cut settings guide (
docs/cut-settings.md). - Capabilities, API reference, overview, README, getting started and
uploading guides updated for
project_write, units and event behaviour.
Safety & policy¶
- Clarified operator responsibility for reviewing and verifying API-modified
job settings and operational parameters before machine operation
(
SAFETY.md,API-EULA.md,POLICY.md,docs/overview.md). - Renamed the README's scope section to Intended Use and linked safety guidance.
- Expanded responsible-disclosure coverage for unauthorized access, capability
bypasses/escalation, secret or token exposure, and unexpected parameter changes
(
DISCLOSURE.md). - Named a reporting channel for documentation feedback, which the policy
invited without saying where to send it. Ordinary documentation errors,
ambiguities and API questions go to repository issues; security concerns and
documentation errors affecting safe machine operation stay private
(
README.md,POLICY.md,DISCLOSURE.md). - Simplified the examples' GPL-3.0 licensing explanation without changing the
MIT default or per-subdirectory licenses (
examples/README.md).
Examples¶
- Inkscape extensions: read the
/api/projectworkspace size as mm. They previously converted it from the display units, which produced a workspace 25.4× too large when LightBurn / MillMage was set to inches.
1.0 — Initial public release¶
First public release of the API specification and documentation.
Specification¶
- Published the OpenAPI specification (
docs/openapi.yaml) covering thestate,project, anduploadcapabilities. - Added a rendered API reference viewer (
docs/index.html, Redoc).
Documentation¶
- API overview and conceptual model (
docs/overview.md). - Getting started guide — pairing, token derivation, first call
(
docs/getting-started.md). - Authentication reference — pairing and the HMAC-SHA256 token scheme
(
docs/authentication.md). - Capabilities reference — scopes and the endpoints each grants
(
docs/capabilities.md). - File upload and placement guide (
docs/uploading.md). - Human-readable API reference index (
docs/api-reference.md). - Versioning model (
docs/versioning.md). Describes the planned versioning approach; a version negotiation mechanism is not yet implemented. - Deprecation policy (
docs/deprecations.md). No deprecations at this time.
Legal & policy¶
- API End User License Agreement (
API-EULA.md). - Project policy, goals, and support boundaries (
POLICY.md). - Safety guidance (
SAFETY.md). - Security reporting policy (
SECURITY.md). - Responsible disclosure process (
DISCLOSURE.md). - Certification and compatibility-claims policy (
CERTIFICATION.md). - Copyright, ownership, and licensing notice (
NOTICE.md).
Examples¶
- FreeCAD workbench reference client — generate gear profiles and send them
(
examples/spurline/, GPL-3.0). - Inkscape extensions reference client — draw the workspace, de-duplicate
shared edges, size the document, and send drawings (
examples/inkscape/, GPL-3.0). - Examples licensing: MIT by default, with per-subdirectory licenses where a
LICENSE file is present (
examples/README.md).