The build system for
reproducible 3D prints

Slicer settings get lost. Printer configs drift. There's no way to version or diff a print job. estampo fixes this — define parts, slicer settings, and printer targets in a single TOML file and generate identical G-code locally or in CI.

estampo.toml
# estampo.toml — a multi-part print with slicer overrides

[[parts]]
file = "enclosure_base.step"
orient = "flat"
material = "structural"          # PETG-CF

[[parts]]
file = "enclosure_lid.step"
orient = "upright"
material = "structural"

[[parts]]
file = "button_cap.stl"
copies = 4
material = "accent"              # PLA

[filaments]
structural = "Generic PETG-CF @base"
accent = "Generic PLA @base"

[slicer]
engine = "orca"
version = "2.3.1"               # pinned for reproducibility

[slicer.orca]
printer = "Bambu Lab P1S 0.4 nozzle"
process = "0.20mm Standard @BBL X1C"

[slicer.orca.overrides]
sparse_infill_density = "25%"
enable_support = 1

[pack]
command = "bambox repack {sliced_3mf}"

How it works

From TOML config to printed part — estampo orchestrates the full pipeline through a single command.

01

Define

Parts, slicer settings, and printer targets in a single estampo.toml file — git-friendly and diffable.

Config reference →
02

Arrange

Bin-packs multiple STL and STEP files onto the build plate with configurable padding and orientation.

03

Slice

Pinned OrcaSlicer (for Bambu Lab printers) or CuraEngine (for everything else) in Docker produces identical G-code on any machine — no GUI needed.

04

Print

Post-process via command stages — pack for Bambu Lab with bambox, upload to Klipper via Moonraker, or any CLI tool that takes G-code.

Deterministic slicing

Pin slicer version + lock profiles into your repo = identical G-code on any machine. No unexpected profile drift.

Everything is text

TOML config, git-friendly, diffable. Pin exact slicer profiles and override settings without touching JSON files.

Config reference →

Flexible pipeline

--until plate to inspect layout, --only slice to re-slice, --dry-run to test without printing.

CLI reference →

Multi-part arrangement

Bin-packs multiple parts onto the build plate with per-part filament slot assignment and orientation control.

Code-CAD friendly

Works with STL, STEP, and 3MF files. Pairs naturally with build123d, OpenSCAD, and CadQuery.

Headless Docker slicing

No GUI, no display server. Runs in CI, on servers, or on a Raspberry Pi with a pinned slicer version (OrcaSlicer or CuraEngine).

AI-friendly

Plain-text TOML config and documented conventions mean Claude, ChatGPT, and other coding assistants can add parts, tune overrides, or wire up CI — review the diff before committing.

Copy-paste AI setup prompt → Installable Claude Code skill →

Slice in GitHub Actions

No slicer installed, no GUI, no manual steps. Push a commit and get G-code as a build artifact — with print time and filament stats posted as a PR comment. The same pipeline that runs on your laptop runs in CI.

.github/workflows/slice.yml
# .github/workflows/slice.yml
name: Slice
on: [push, pull_request]
jobs:
  slice:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: estampo/estampo/action@v0

Get started

Install estampo and generate your first config with the interactive wizard.

$ pip install estampo