Changelog
Unreleased
[1.1.20] – 2026-09-29
Documentation
- Run the local code review before PR pushes to catch problems before GitHub Actions runs; retain GitHub Codex review and current-head CI as subsequent release gates.
Fixed
- Accept P2S jobs sliced in Bambu Studio 02.08. The project settings store
printer_extruder_idandprinter_extruder_variantas per-variant tables (["1","1","1"]beside threenozzle_typerows), while the plate G-code header records the selected single-extruder values (printer_extruder_id = 1), so every such job failed with "unknown or malformed printer extruder id metadata". Table rows come only from the project settings; header values must have one entry per physical extruder, name each extruder in order, and match the selected variant, and contradictory ids, variants, or nozzle types still reject. Validate supplied variants even when every row uses the same nozzle material (#33, by Izzy Mansurov (@sapoepsilon)). - Accept
M145 P0/M145 P1(airduct cooling/heating mode, no heater target) on the P2S, whose official start and end G-code emit it as the H2-series and X2D templates do. OtherM145forms and models without a switchable airduct still reject. Verified offline against four real Bambu Studio 02.08.02.61 P2S 0.6 mm jobs (PLA and PETG) and mutated copies with an over-limit nozzle or chamber target, a parameterizedM145, and contradictory extruder ids or nozzle types; no physical print was run for this change.
[1.1.19] – 2026-09-29
Documentation
- Make the local
code-reviewskill run before each PR the review gate, instead of requesting Codex reviews, and forbid AI or agent attribution in commits, PRs, comments, and release notes.
[1.1.18] – 2026-09-29
Fixed
- Add
nozzle_type(stainless_steel,hardened_steel,tungsten_carbide,brass; defaultBAMBU_NOZZLE_TYPE) toslice_stl,slice_with_template, andprint_3mfauto-slicing, and write it into the resolved machine preset. Bambu machine presets assume the stock nozzle (stainless steel on P1S/P1P/A1), and the print gate compares the job with the printer's report, so a P1S with a hardened-steel nozzle could never print a CLI-sliced job. Found on the maintainer's P1S; covered here by fake-CLI and mocked MCP regressions. Ported from mcp-3D-printer-server. - Report what the printer did after an MQTT print command instead of assuming success.
project_fileandgcode_filestarts (checked.3mf,.gcode.3mf, and raw G-code) listen to the reports the printer pushes for up toBAMBU_DISPATCH_CHECK_MS(default 15000, 0–60000, 0 skips), take at most one full report if nothing arrives (no pushall polling on P1-series boards), and returndispatch: "started"or"unconfirmed". A stop or heater-off during that window is reported instead of a started print. A new HMS 0500-0500-0001-0007 ("MQTT command verification failed" on firmware 01.08.05+ without LAN Only Mode and Developer Mode) fails the call with that explanation and says to clear the fatal entry (clear_hms_errorsor the printer's screen), which otherwise blocks later prints; blocking HMS refusals now name their code;print_3mfnow returns the adapter's result instead of a fixed "sent successfully" string. On the maintainer's P1S the firmware raised this HMS while the old code reported success; the regressions here use mocked MQTT reports, and no physical print was run for this change. The native X2D helper and FULU BambuNetwork bridge paths do not publish these MQTT commands and are unchanged. - Refusals and printer rejections (nozzle mismatch, ambiguous nozzle reports, rejected commands, and "nothing was sent" safety stops) now suggest fixing the reported cause instead of "try again".
[1.1.17] – 2026-09-29
Fixed
- Keep machine settings in the selected machine preset. The Bambu-compatible CLI applies every key in every
--load-settings/--load-filamentsfile, so a template 3MF'sproject_settings, a custom process JSON, or a custom filament JSON carrying another printer'smachine_start_gcode,printer_model, or nozzle/bed values replaced the selected preset's settings. Every key the resolved machine preset defines, except profile metadata such asname,inherits, andcompatible_printers, is now dropped from the process and filament files passed to the slicer, and the dropped keys are logged; the caller's files are not modified. OrcaSlicer applies its existing absolute-extrusion normalization (use_relative_e_distances = 0, no per-layerG92 E0) to the machine config as well, so the machine-owned extrusion mode and layer G-code stay absolute. With BambuStudio 02.01.01.52 on macOS, a P1S slice using a template whose start G-code carried a marker and whoseprinter_modelnamed the X1 Carbon previously emitted the marker twice inplate_1.gcodewith an X1 Carbon header; it now emits neither and keeps; printer_model = Bambu Lab P1S. None of the key sets of the installed stock BBL process and filament profiles overlaps a machine profile's, and all 32 installed stock model/nozzle presets load their default process and filament profiles unchanged. OrcaSlicer and FULU installations were not available for real-slicer verification, and no physical print was run. Ported from mcp-3D-printer-server. - Wait ten minutes by default (
BAMBU_CONFIRMATION_TIMEOUT_MS, 1000–3600000 ms; other values fall back to the default because Node clamps oversized timer delays to 1 ms) for human hardware confirmation and printer-model prompts instead of the MCP SDK's 60-second request limit, which a person walking to the printer to check the bed could exceed. An unanswered prompt is now reported as a timeout with nothing sent to the printer, instead of claiming the client lacks elicitation support and suggestingBAMBU_REQUIRE_CONFIRMATION=0; only a missing elicitation method or capability is reported as unsupported. Covered by MCP stdio regressions with delayed client answers and short configured timeouts; not exercised against a physical printer. - Name unreadable or malformed profile files in "profile not found" errors so a corrupt profile tree is diagnosable instead of reported as a misspelled name.
[1.1.16] – 2026-09-28
Documentation
- Restore the published 1.1.14 and 1.1.15 release boundaries on the source changelog and generated GitHub Pages site instead of leaving shipped changes under
Unreleased.
[1.1.15] – 2026-09-28
Fixed
- Keep printer file listings read-only and use the shared FTPS TLS-session options. Propagate connection and directory-listing failures instead of reporting empty or partial success; treat optional directories as absent only after a successful root listing (#26, by Vail (@VailElla)).
[1.1.14] – 2026-09-28
Fixed
- Revalidate positive heating, resume, and confirmed hardware-error clearing immediately before native command dispatch; keep stop and heater-off available without preflight.
- Reject fractional AMS unit/slot addresses rather than truncating them to another physical address.
- Require fresh shared printer-state authorization after native connection setup and again before certificate-retry print dispatch.
- Select raw native metadata controls by the requested printer instead of the global default model.
- Preserve unknown observed printer identities in status instead of substituting the configured model.
- Validate and forward native upload plate, bed, project, and preset metadata; explicitly reject unsupported print options instead of silently ignoring them.
- Keep heater-off on the selected printer transport after model elicitation, including an overridden non-X2D serial.
- Interrupt pending native helpers on MCP cancellation, stop, and heater-off; wait for process exit before releasing snapshots, with bounded SIGKILL escalation when SIGTERM is ignored.
- Route X2D controls from the selected serial when the print model was elicited, without applying the configured X2D transport to an overridden printer.
- Preserve unit-local filament metadata tray IDs and absolute calibration tray IDs across multiple AMS units and AMS-HT; reject contradictory unit/slot mappings.
- Restrict public raw native controls to validated AMS metadata and calibration queries/selection; exclude motion, loading, heating, and safety-setting mutations.
- Add a macOS native build/test CI job while preserving the existing Linux test check.
- Remove machine-specific launchers and unused GUI automation from the upstream change and release archives.
- Resolve the model before selecting the X2D native route, including MCP model elicitation, and pass that resolved model through dispatch.
- Reject raw
ams_mapping2overrides and missing/empty requested AMS mappings before dispatch; derive native mappings from checked structured tray assignments without silently selecting an external spool. - Cover macOS and Linux control routing explicitly, and restrict native helper execution tests to supported hosts.
- Integrate X2D native prints, uploads, heaters, resume, and error clearing with the current shared file/state/confirmation checks. Preserve existing model routes and reject raw-control bypasses.
- Include only native source and build scripts in npm and desktop distributions; locate the optional compiled helper relative to the installed package and test fresh local, global, and npm-exec installations. Keep proprietary plug-ins and local binaries out of release archives.
- Resolve include-based installed templates and substitute current filament/hotend macro names in optional syntax regressions; do not assume a particular installed G383 variant.
- Retain VailElla's prior X2D eMMC/certificate investigation and hardware evidence. This follow-up uses mocked printer regressions and clean-install/build checks; it does not claim a new physical print.
- Include the printer host in FTPS TLS options so data connections resume the control session. basic-ftp wraps each data socket without a host, so Node can bind its resumable session to
localhostinstead of the printer host and printers requiring TLS session reuse replied522 SSL connection failed: session reuse requiredto every LIST, STOR and RETR. The contributor verifies successful upload, size check, and deletion on physical X2D USB storage; internal eMMC still refuses FTPS writes with553. Printing remains a separate check.list_printer_filesstill uses bambu-js's own FTP client and is not covered by this change.
[1.1.13] – 2026-09-27
Added
- Add shared print safety checks for declared model, nozzle, material, selected plate, and every supported heating command in the final printable file.
- Require fresh MQTT identity, nozzle configuration, ready state, and error checks before upload and dispatch; compare declared material with available mapped-spool reports.
- Preserve complete mixed dual-nozzle diameter metadata and accept explicit per-nozzle diameter requirements for pre-sliced direct and bridge jobs.
- Preserve the selected plate's used filament slots during all-nozzle warmup checks; temperature candidates do not create extra AMS mapping requirements.
- Apply independent printer/component and material temperature ceilings, reject nonfinite values before connecting, and require declared material for manual nozzle heating. Keep heater-off commands available.
- Inspect private file snapshots and use unique remote print names. Download and inspect remote G-code before starting a verified copy.
- Check the currently loaded material for manual heating and G-code-file dispatch, bind resume to an inspected paused job, and let stop/heater-off requests cancel pending operations before dispatch.
- Reject G-code-file starts and resumes when fresh telemetry explicitly reports an unloaded nozzle; preserve declared-material manual heating for loading filament.
- Register successful inspected BambuNetwork jobs for the same verified resume path, using unique submitted task identities.
- Reject ambiguous ZIP entries and bind the dispatched plate and checksum to inspected bytes; bound archive inspection and check every printable plate on upload-only requests, refusing noncanonical plate names and unrecognized G-code entries.
- Preserve existing remote files with unique upload names and destination collision checks; verify uploaded job model/nozzles against fresh printer reports.
- Add human print/heating preflight through MCP elicitation, mandatory finished-bed clearance, and confirmed hardware-error clearing with acknowledgment on the next print.
- Preserve cleared-error acknowledgment across failed print attempts until a checked dispatch succeeds. Release rejected bridge snapshots immediately and retain only files handed to an asynchronous upload.
- Validate H2D probing, wipe, and tool-change thermal commands and normalize GUI nozzle-variant tables. Apply a 260°C normal PLA ceiling with one narrowly bounded X1E startup-purge sequence; refuse explicit non-FFF jobs and recognized laser-enabling commands.
- Apply the checks to the optional BambuNetwork print wrapper and restrict raw bridge calls to named read-only probes. Require LAN telemetry even when the bridge submits through a cloud session.
- Require a single external-spool plate for legacy
.gcode.3mfdispatch; use a.3mfproject export when verified AMS mappings or plate selection are needed. - Credit Boardy (@boardyai) for raising the nozzle-verification question and David Montgomery for the temperature and hardware-safety reports. Validation uses mocked printer boundaries; physical printer acceptance remains a separate check.
1.1.12 – 2026-09-27
Documentation
- Publish a searchable documentation site on GitHub Pages at https://dmontgomery40.github.io/bambu-printer-mcp/. Pages are generated from the README, setup, slicing, and FULU guides, changelog, and contributor credits at build time, so the repository Markdown remains the single source.
- Keep README deep links working on the site with GitHub-compatible heading anchors. The site build fails on broken links, unknown anchors, or README content that no page publishes; pull requests build it without deploying.
- Add a large-image social card and per-page link-preview titles, descriptions, and canonical URLs for the site.
- Replace the outdated example commands with outcome-first requests: adapting a MakerWorld model, printing from a photo, and checking on a print by messaging an always-on agent from anywhere. Clarify which abilities come from the agent and which from this server.
[1.1.11] – 2026-09-27
Fixed
- Require the exact model/nozzle machine preset for FULU and Orca CLI slicing, including aliases and automatic slicing before printing. Reject missing or malformed presets before launching the slicer; process overrides cannot bypass the gate.
- Resolve FULU/Orca BBL inheritance and include templates, validate model CLI configuration, and preserve custom process settings and complete filament-slot mappings through the same preparation path as BambuStudio.
- Resolve inherited machine defaults before selecting process and filament profiles, including FULU's P1S family defaults.
- Preserve configured user directories for custom process/filament dependencies while keeping machine inheritance confined to the selected installation.
- Discover matching Orca/FULU profile trees beside the active executable and prevent fallback to another installation's bundled presets. Keep Orca extrusion normalization after inheritance resolution.
- Update agent setup guidance for the shared safety gate. Regression checks cover preparation and side-effect prevention; live FULU/Orca slicing and physical printing remain separate validation.
1.1.10 – 2026-09-27
Documentation
- Restore prominent thanks to FULU Foundation, Louis Rossmann, and the OrcaSlicer-bambulab community, including the project's commitment to open-source software and cloud-free local printing.
- Add a dedicated FULU setup guide covering slicer/export and CLI use, Linux/WSL/macOS bridge configuration, cloud authentication, shared paths, probes, and validation limits.
- Replace manual README onboarding with one copy-and-paste agent setup request; move installation, environment variables, and LAN instructions into a linked setup reference. Treat code mode as optional.
- Document the existing FULU/Orca CLI missing-machine-preset safety limitation and direct users and setup agents to GUI-exported sliced projects until an equivalent validation gate ships.
- Make the README's major reference sections collapsible while keeping the FULU acknowledgment and agent setup request visible.
- Reorganize README navigation and correct stale client configuration, LAN/account requirements, firmware routing, AMS mapping, and bridge capability descriptions.
1.1.9 – 2026-09-27
Added
- Recognize X2D (
N6, serial prefix20P) for status, camera routing, and slicing with its own installed BambuStudio preset. Direct X2D printing remains deferred pending the native eMMC transport and stops before printer side effects. Contribution and hardware/status/slicing evidence: #18, by Sebastian (@sebas1986).
Fixed
- Give every CLI filament slot its own colour to address the multi-filament access violation reproduced by the contributor on Windows BambuStudio 02.08.02.60. Preserve explicit colours, input-project colours, and custom profile settings.
- Place an unset prime tower within the area shared by all nozzles, while retaining saved project positions and explicit process overrides.
- Apply required colour and tower overlays to standalone custom profiles without replacing unrelated settings.
- Correct the desktop-release workflow's Node setup cache option so extension packaging can run automatically.
1.1.8 – 2026-09-27
Changed
- Consolidate shared agent rules for local and GitHub review, retain public documentation, and keep scratch plans, progress logs, and handoff notes out of Git.
Added
- Connect to standard Blender MCP servers with tool discovery, schema-checked calls, timeouts/cancellation, and verified STL import/edit/export. Keep the custom-executable bridge available with explicit verification status.
- Package a Claude Desktop extension with prompted printer settings, safe staging, and synchronized release versions (#11).
Fixed
- Validate large Blender STL meshes without boxing coordinate arrays, keeping finite-geometry checks within a bounded JavaScript heap.
- Preserve the selected bundled process preset identity through generated settings, and remove automatically created temporary roots on shutdown while retaining explicitly configured TEMP_DIR contents.
- Stop before printer uploads when automatic slicing or required profile preparation fails, preserving the original diagnostic. Validate model CLI configuration before flattening and advertise the required output path for standard Blender MCP edits.
- Apply the required printer dependency patch to the resolved installed package, including hoisted npm installations, and fail installation if it cannot be applied.
- Resolve CLI profile dependencies automatically and stop before slicing on incomplete profiles. Preserve custom overrides and filament-slot order, replace every declared 3MF slot for a single-profile override, discover platform-specific profile trees, and isolate concurrent config files.
- Point installation examples at
bambu-printer-mcpand report the installed npm version in the MCP handshake. - Create a private temporary directory per server instance, so desktop-extension startup does not depend on a writable working directory and concurrent printers cannot overwrite each other's default outputs.
- Resolve Bambu profile include templates so CLI slicing retains machine-specific G-code (#16, reported in #12).
- Use the P2S project-file payload with its cache upload path while retaining legacy P1/X1 routes (#15).
- Start full-size A1 pre-sliced projects from the SD root via
project_file, preserving other models' routes and all project filament mapping positions (#14). - Keep H2C/H2D/H2S status connections alive when delayed OTA version messages arrive; recognize H2 serial prefixes, preserve unknown model identities, and accept unexpected status transitions without terminating the MQTT listener (#7).
Security
- Refresh compatible transitive dependencies to resolve the nine npm audit findings in the previous lockfile; retain the pinned printer dependency patch.
- Per-call
slicer_path,ffmpeg_path, andbridge_commandexecutable selectors are now rejected by default. Trusted server-side environment configuration remains available, includingFFMPEG_PATHfor RTSP camera snapshots; setMCP_ALLOW_EXECUTABLE_ARG=1only when intentional per-call overrides are required.MCP_ALLOW_BRIDGE_COMMAND_ARGremains a compatibility alias forbridge_commandonly.
Added
- X2D model support —
BAMBU_MODEL=x2dis accepted by validation, elicitation, tool schemas, BambuStudio preset mapping, filament profile resolution, RTSP camera routing, and the dual-nozzle H2-familyproject_file/ams_mapping2print path. The X2D model IDN6is recognized when reported by the printer.
1.1.3 – 2026-05-31
Added
- H2C model support —
BAMBU_MODEL=h2cis now accepted by validation, elicitation, tool schemas, BambuStudio preset mapping, filament profile resolution, and the H2 project-file print path. H2C should not useh2das a fallback; the explicit model is required for safe slicer preset selection and H2 AMS mapping behavior.
1.1.1 – 2026-04-29
Fixed
auto_match_amsnow handles same-SKU different-color filaments. Previously the matcher keyed only ontray_info_idx, so a 3MF needing two GFG02 (PETG HF) trays — one black, one white — would error out as "could not find loaded AMS trays for: GFG02, GFG02" even when both were present. The matcher now joins on(tray_info_idx, tray_color)(RGB-normalized; alpha bytes ignored) and tracks already-claimed slots so two requirements can't collapse onto the same physical slot. Falls back to SKU-only matching when the 3MF carries no color or only one tray of that SKU is loaded. Returns a structuredmissingreport with reasons (no_loaded_match/color_mismatch/exhausted/no_sku) when resolution fails.get_printer_filamentsretries when AMS data hasn't arrived yet. The first MQTT push from an idle printer is sparse (model/modules only); AMS data arrives on a second push that often misses the 500ms settle window inwaitForInitialReport(). Adds a 1.5s retry ingetResolvedPrinterFilamentInventory()when trays are empty, matching the same retry pattern already used by the HMS resource handler. Validated on Parker H2S (4 loaded trays, all profiles resolved) and Kingpin H2D (no AMS connected — accepted gracefully).- HMS resource retries when first status push has no HMS data. Same root cause — the first MQTT push is sparse (model/modules only); HMS/error fields arrive on a subsequent push. Added 1.5s settle-and-retry in the
printer://{host}/hmsresource handler. Validated on Parker H2S and Kingpin H2D: both returnedhms_errors: 1(code: 131099).
Added
set_ams_dryingtool — start or stop the AMS filament drying cycle on heated AMS units (AMS Pro / AMS-HT). Sendsprint.ams_controlMQTT command withstart_drying/stop_dryingparam. Includes input validation (action must be start/stop, ams_id must be 0-3) and 4 new unit tests covering validation and correct command payload shape.scripts/validate-printer.mjs— reusable MCP-over-stdio validation harness that tests HMS resource, set_light, set_fan_speed, set_airduct_mode, clear_hms_errors, get_printer_status, and get_printer_filaments against a live printer. Spawns the MCP server as a child process, sends JSON-RPC messages over stdin/stdout, reports pass/fail per test.PrinterFilamentInventorynow includessummary,profile_resolution,match_confidence, anddisplay_name. Each tray entry carries a resolution tier (exact-model-nozzle/model/generic/unresolved) and a human-readable display name combining sub-brand, type, and color. Top-levelsummaryobject reports loaded/resolved/empty slot counts and a recommended slot with a human-readable reason. Helps callers make informedauto_match_amsdecisions without reading raw MQTT status.scripts/build-charm-3mf.mjs— constructs a multi-object source.3mffrom two STLs (body + face/detail). Volume-based body/face detection (signed-tetrahedron sum, robust to OpenSCAD's uniform facet density). Inline meshes in3D/3dmodel.model, per-object<metadata key="extruder" value="N"/>inMetadata/model_settings.config, plate-levelfilament_mapsfor H2D dual-extruder routing. Carriesproject_settings.configfrom a known-good template 3MF. Output is a valid Bambu source project that the CLI parses cleanly; only the upstream slicer-setup SIGSEGV blocks it from being end-to-end useful today.
Changed
- Validation script now tests
get_printer_filaments.scripts/validate-printer.mjsadded as test 8 with live tray output. Also fixed the AMS inspection in theget_printer_statustest to read the correct raw structure (data.ams.amsarray) instead of the nonexistent.trayspath. Accepts "no AMS connected" as a valid printer state.
Known issues
- Multi-color CLI slicing is blocked upstream. BambuStudio CLI 02.06.00.51 SIGSEGVs in
load_nozzle_infos_with_compatibilityfor any H2D dual-extruder, multi-color project, regardless of input geometry. Verified via a two-cube minimal repro and filed as bambulab/BambuStudio#10408. Workaround until upstream ships a fix: pre-slice in Bambu Studio GUI and hand the resulting.gcode.3mftoprint_3mf. The dispatch path is fully functional.scripts/build-charm-3mf.mjsis ready to drive the CLI once #10408 lands.
1.1.0 – 2026-04-27
Added
- BambuStudio CLI auto-flatten (
BAMBU_CLI_FLATTEN=true): walks the BBL profileinheritschain and emits CLI-ready configs, working around upstream BambuStudio issues #9636 and #9968. Verified on H2S, H2D, X1C, P1S. - pause_print / resume_print tools — MQTT pause and resume alongside the existing cancel_print.
- AMS RFID slot resolution —
resolve_3mf_ams_slotsdry-run tool matches sliced 3MF filament requirements against live AMS inventory; opt-inauto_match_amsflag onprint_3mf. - HMS diagnostics resource —
printer://{host}/hmsMCP resource for read-only HMS error summary. - set_light / set_fan_speed — MQTT wrappers for chamber light and fan speed control.
- skip_objects — list object IDs from a sliced 3MF plate (
list_3mf_plate_objects) and skip them during a running print (skip_objects). - Utility controls —
set_print_speed,set_airduct_mode,clear_hms_errors,reread_ams_rfid. - Bed-aware slicing —
bed_typeparameter onslice_stlandprint_3mfmaps to BambuStudio CLI--bed-type. - Collar charm wrapper (
print_collar_charm) — fixed tray policy for two-colour dog collar charm projects. - delete_printer_file — destructive FTPS DELETE with
confirm:truegate, allowlist oncache/,timelapse/,logs/, and explicit rejection of..segments. - camera_snapshot — capture a single JPEG from the printer's chamber camera. Two transports wired in:
- TCP-on-6000 (per OpenBambuAPI
video.md) for A1, A1 mini, P1S, P1P. - RTSPS via ffmpeg (
rtsps://bblp:<token>@<host>:322/streaming/live/1) for X1, X1 Carbon, X1E, P2S and H2, H2S, H2D, H2C, H2D Pro. Verified live against Parker (H2S), Kingpin (H2D), and an X1C — all return real chamber JPEGs in ~1.5s. The H2 series was not documented upstream; local investigation established the RTSP path. - Response includes a
transportfield so callers can tell which path produced the frame. experimentalflag from interim work is now a no-op (kept on the schema for compatibility).- Requires
ffmpeginPATHfor the RTSP path;ffmpeg_pathargument allows override.
- TCP-on-6000 (per OpenBambuAPI
Fixed
- BambuStudio
--load-machineflag replaced with the correct flag; 3MF inputs now accepted byget_stl_info. - H2/H2D mapping safety —
print_3mfnow fails fast on H2 series pre-sliced jobs with declared filaments unless one ofams_slots, rawams_mapping, orauto_match_ams: trueis provided. Avoids sending an under-specifiedproject_filethat the printer accepts but does not visibly start. For H2/H2D, the embeddedslicerConfig.ams_mappingparsed from the 3MF is no longer trusted (stale-metadata risk). Regression test locks in the recovered working H2 mapping shape. - SuperTack on CLI slicing —
supertack_plateis accepted on the pre-sliced print path (the only verified case) but rejected fast on the BambuStudio CLI auto-slice path because the CLI bed identifier is unverified and earlier attempts produced gcode that fell back to Cool Plate.
1.0.5 – prior release
Initial public release with core print, upload, slice, and status tooling.