Features
- Add CuraEngine slicer backend (
engine = "cura") as alternative to OrcaSlicer (#282) - Build CuraEngine from source instead of extracting from AppImage, eliminating placeholder G-code header issue (#299)
- Add Bambu Lab P1S machine definition for CuraEngine with proper start/end G-code (#301)
- Add OrcaSlicer 2.3.2 Docker image builds alongside 2.3.1
- Add
--engine curasupport to profile extraction script and CI workflow for automated CuraEngine printer definition discovery - Add
EngineConfigbase class,SlicerConfig.activeproperty, top-level[filaments]table for material aliases, andPartConfig.materialfield; remove facade fields fromSlicerConfig - Add
[slicer.filament_overrides]to patch all filament profiles (e.g.required_nozzle_HRC) - Add
[slicer.machine_overrides]for overriding machine profile settings (e.g.nozzle_type = "hardened_steel"for carbon-fiber filaments). - Add
bed_typeconfig option to set plate type for filament compatibility - CuraEngine machine definitions are now stored as JSON files (bundled
Bambu Lab P1S 0.4 nozzle.json); add custom printers viaestampo profiles add;profiles pinandprofiles addno longer misroute Cura profiles; override values from config are now coerced to the correct type. - CuraEngine printer definitions: discoverable selection during
estampo init, configurable via[slicer.cura] printer, and dynamic definition resolution at slice time - Engine-namespaced TOML config:
[slicer.orca]and[slicer.cura]sections for per-engine settings with backward-compatible legacy format support - Engine-namespaced profile directories:
profiles/<engine>/<category>/with backward-compatible legacy path fallback - Extract Bambu Connect 3MF fixup into a
packaged_outputpipeline stage so printer-specific packaging is explicit and only runs for Bambu printers - Show animated status spinners during slow Docker operations (image pull, profile extraction)
- Support CuraEngine in local slicer discovery (
find_slicer) for all platforms estampo initwizard now prompts for slicer engine (OrcaSlicer or CuraEngine) and adapts version detection and profile discovery accordingly.
Bugfixes
- Fix CuraEngine Docker image breaking Python by isolating bundled libssl/libcrypto (#283)
- Fix CuraEngine Docker image Python access for unprivileged estampo user (#286)
- Show CuraEngine error output instead of suppressing stderr (#288)
- Show rich UI output (checkmarks, print summary) alongside debug logs in verbose mode (#300)
- Fix
ValueErrorwhen CuraEngine override values include a%suffix (e.g.sparse_infill_density = "35%"). (#310) - Fix
profiles pinfailing for CuraEngine when printer name includes nozzle suffix or different casing (#340) - Fix CuraEngine slice failing when no separate machine profile JSON exists for the printer (#345)
- Fix CuraEngine squashed definitions preserving
inheritsfor unresolved base definitions likefdmprinter(#347) - Fix profile extraction push failure when bot-managed branch already exists (#363)
- Remove Bambu-specific AMS auto-detect from
estampo initwizard (#367) - Skip printer setup and print stage for CuraEngine in
estampo init(#380) - Broadcast scalar machine overrides to arrays when profile has per-extruder fields
- Error when pinned profiles don't match the target slicer version instead of silently crashing
- Fix CuraEngine binary "not found" by patching ELF interpreter and replace missing
bambu_3mfdependency with inline G-code generation - Fix CuraEngine reporting zero filament usage — CuraEngine CLI writes placeholder G-code header values that are not updated after slicing; patch with real values from stderr and fall back to E-value analysis.
- Fix CuraEngine slicing by converting 3MF model data to STL before passing to the engine
- Fix CuraEngine slicing: place mesh on bed, resolve G-code template variables, fix header patching
- Fix CuraEngine: disable default brim, center mesh on build plate
- Fix OrcaSlicer 2.3.2 segfault in Docker on Colima by preventing Wayland GL init
- Fix TestPyPI dev version collisions by using git commit count instead of workflow run number.
- Fix filament weight reporting: correct multi-value regex, M83 relative extrusion support, newest-file selection, and layer count in output summary.
- Fix profile extraction push failure when branch already exists from earlier run
- Fix release workflow checkout ref that prevented manual release dispatch
- Fix release workflow job skip cascade on manual dispatch
- Fix release workflow tag-check that used curl flags with
gh api - Narrow bare
except Exceptionhandlers to specific exception types for better debuggability. - Pass
--allow-mix-tempfor multi-filament AMS configurations on OrcaSlicer 2.3.2 - Pass
--allow-mix-tempunconditionally on OrcaSlicer 2.3.2+ to fix grouping errors; gate the flag off for older versions. - Replace unsafe
eval()in CuraEngine G-code template substitution with AST-based safe evaluators. - Revert
xvfb-runwrapping that caused OrcaSlicer 2.3.2 to segfault on GL init. - Set
infill_line_distancedirectly so CuraEngine respects infill density overrides - Stage Docker slicer input inside output directory and preserve file extension to fix bind-mount issues
Misc
- Run e2e slice test from host to match real user flow (Docker-based slicing). (#275)
- Fix lint errors in
scripts/bambu_cloud_login.pyandscripts/test_cloud_print.py(#331) - Populate bundled CuraEngine 5.12.0 printer definition manifest with full machine list extracted from Docker image (#354)
- Add ADR-006 defining the slicer plugin protocol: each engine is a self-contained module; top-level files are pure dispatch layers; clear contract for adding new slicers
- Add Architecture Decision Records, ROADMAP.md, and module ownership table to CLAUDE.md for long-term architectural coherence
- Add GitHub issue templates, labels, and milestones for structured backlog tracking
- Add
scripts/compare_engines.pyutility to compare OrcaSlicer vs CuraEngine G-code output - Add automatic Claude PR review workflow — checks ADR compliance, exception handling, eval() usage, and missing changelog fragments on every PR
- Add slicer engine research doc: Bambu P1S multi-material support across CuraEngine, PrusaSlicer, and Kiri:Moto.
- Consolidate
bambu-3mf+bambu-cloudinto singlebamboxpackage in docs and ADR-005 - Disable OrcaSlicer 2.3.2 builds (segfaults on slice); re-enable when upstream fixes it
- Extract OrcaSlicer-specific logic from
slicer.py,profiles.py, andinit.pyinto neworca.pyengine module per ADR-006. - Extract shared magic numbers into
constants.pyand migrate example configs to engine-namespaced[slicer.orca]/[slicer.cura]format - Fix Claude PR review workflow: add missing id-token: write permission for OIDC authentication
- Fix Claude PR review workflow: raise max-turns to 8 and add continue-on-error so turn limit never blocks a merge
- Fix release-readiness jobs skipping on manual dispatch and nightly schedule
- Improve CuraEngine error reporting to include both stdout and stderr
- Mark all
todo-slicer.mditems as resolved — slicer-agnostic work is complete. - Move CuraEngine definition pinning and profile logic from
profiles.pyintocura.pyengine module. - Profile system now handles CuraEngine gracefully —
profiles list --engine curaexplains that CuraEngine uses inline settings instead of showing empty results. - Remove Claude PR review workflow — not working reliably
- Remove legacy flat
[slicer]config format,fabprint.tomlalias,FABPRINT_*env vars, and~/.config/fabprintmigration. - Replace hardcoded OrcaSlicer references with engine-agnostic text in CLI help, error messages, and 3MF metadata
- Speed up CI with uv dependency caching, concurrency groups, and conditional bridge builds
- Update docs and README to use engine-namespaced
[slicer.orca]/[slicer.cura]config format and document[filaments]table - Use
RELEASE_PATin prepare-release workflow so CI triggers on release PRs automatically