Reproducible 3D print builds. Define parts, slicer settings, and printer targets in code.
Project description
estampo
Reproducible 3D print builds.
Define parts, slicer settings, and printer targets in code and generate reproducible print artifacts locally or in CI.
Works with STL, STEP, and 3MF files, and pairs naturally with code-CAD tools like build123d, OpenSCAD, and cadquery.
# estampo.toml — a multi-part print with slicer overrides
[[parts]]
file = "enclosure_base.step"
orient = "flat"
filament = 1 # AMS slot 1: PETG-CF
[[parts]]
file = "enclosure_lid.step"
orient = "upright"
filament = 1
[[parts]]
file = "button_cap.stl"
copies = 4
filament = 2 # AMS slot 2: PLA
[slicer]
engine = "orca"
version = "2.3.1" # pinned for reproducibility
printer = "Bambu Lab P1S 0.4 nozzle"
process = "0.20mm Standard @BBL X1C"
filaments = ["Generic PETG-CF @base", "Generic PLA @base"]
[slicer.overrides]
sparse_infill_density = "25%"
enable_support = 1
brim_type = "auto_brim"
[printer]
name = "workshop"
estampo run # arrange → slice → print, one command
Output → estampo_output/enclosure
✔ Loaded 3 parts
✔ Arranged 3 parts onto plate (256×256mm)
✔ Plate exported → plate.3mf
✔ Preview exported → plate_preview.3mf
✔ Sliced with OrcaSlicer 2.3.1 in 48s
✔ Print time: 3h 42m, 24.6g filament
✔ Sent to printer "workshop"
What estampo does
- Define parts + settings in
estampo.toml - Arrange — bin-packs models onto the build plate
- Slice — using a pinned OrcaSlicer version (via Docker) for identical G-code across machines
- Print — sends the result to your printer
Everything is declared in a single TOML file — git-friendly, diffable, and committable alongside your CAD files. Lock the slicer version, pin the profiles, and the output is reproducible on any machine or in CI.
Why not just use OrcaSlicer CLI?
OrcaSlicer CLI is great for slicing a prepared plate. estampo builds a reproducible pipeline around it:
- Arrangement — bin-packs multiple STLs onto the build plate (OrcaSlicer CLI has no arrange step)
- Multi-part filament mapping — per-part filament slot assignment and paint color preservation, injected into the 3MF metadata
- Reproducible builds — pin slicer profiles into your repo + lock OrcaSlicer version in Docker = identical gcode on any machine
- Partial execution —
--until plateto inspect layout,--only sliceto re-slice,--dry-runto test everything - Send to printer — Bambu LAN, Bambu Cloud, and Moonraker/Klipper (experimental), with live status monitoring
- Headless Docker slicing — no GUI, no display server, works in CI, uses a specific OrcaSlicer version
Best fit
estampo is best suited to:
- Hardware teams keeping CAD and manufacturing inputs in Git
- Engineers who want deterministic slicing in CI
- Makers who want a declarative print workflow instead of slicer click-ops
If you mostly want interactive print setup in a GUI, use OrcaSlicer directly.
Status
Stable
- Declarative print config in
estampo.toml - Multi-part arrangement
- Docker-based slicing with pinned OrcaSlicer versions
- Slicing for any printer supported by OrcaSlicer
- Profile pinning into your repository
- CI slicing and artifact generation
- Network print initiation via Bambu Cloud
Experimental
- Bambu LAN printing
- Moonraker printing
Quick start
Prerequisites: Python 3.11+ and Docker. Docker is central to estampo — it runs OrcaSlicer in a container with a pinned version so every machine produces identical G-code, and it powers cloud printing via the Bambu Connect bridge. A local OrcaSlicer install can be used as an alternative but is not recommended.
pip install estampo
# or, to install as an isolated CLI tool:
pipx install estampo
Generate a config with the interactive wizard, or dump a commented template:
estampo setup # configures printer targets
estampo init # interactive wizard — discovers profiles and CAD files, creates TOML
estampo init --template # dump a commented template
Or create estampo.toml by hand (see full config reference):
[pipeline]
stages = ["load", "arrange", "plate", "slice", "print"]
[printer]
name = "workshop" # references ~/.config/estampo/credentials.toml
[plate]
size = [256, 256] # build plate dimensions in mm
padding = 5.0
[slicer]
engine = "orca"
version = "2.3.1" # pin OrcaSlicer version for reproducibility
printer = "Bambu Lab P1S 0.4 nozzle"
process = "0.20mm Standard @BBL X1C"
[slicer.overrides] # simple way to define print settings without editing JSON
sparse_infill_density = "30%" # stronger infill
wall_loops = 3 # extra wall strength
enable_support = 1
brim_type = "auto_brim" # help adhesion
curr_bed_type = "Textured PEI Plate"
[[parts]] # define multiple parts using STEP, STL or 3MF inputs
file = "frame.step"
rotate = [180, 0, 0] # flip so mounting plate faces down
filament = "Generic PETG-CF @base"
[[parts]]
file = "wheel.stl"
copies = 5
orient = "upright"
filament = "Generic PETG-CF @base"
Run it (see full CLI reference):
estampo run # arrange, slice and send to printer
estampo run --until slice # stop after slicing
estampo run --dry-run # full pipeline without sending to printer
The arrangement (plate) stage generates a plate_preview.3mf — open it in any 3MF viewer to check placement:
Reproducibility
Pin profiles into your repo so builds are identical across machines:
estampo profiles pin # copies slicer profiles into ./profiles/
git add profiles/ # commit to lock them
Combined with version = "2.3.1" in [slicer] (which pins the Docker image), the same config always produces the same gcode.
CI/CD example
Automate slicing in GitHub Actions — push a commit, get G-code as a build artifact with print metrics on your PR:
# .github/workflows/slice.yml
name: Slice
on: [push, pull_request]
jobs:
slice:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: estampo/estampo@main
with:
orca-version: "2.3.1"
The action slices your model, uploads G-code as an artifact, and posts print time / filament stats as a PR comment. See action/README.md for all options.
CLI overview
estampo init # interactive config wizard
estampo init --template # dump commented TOML template
estampo validate # check config for issues
estampo setup # set up a printer (credentials + connection type)
estampo run # full pipeline
estampo run --until plate # stop after plating
estampo run --only slice # run just one stage
estampo run --dry-run # everything except sending to printer
estampo watch # re-run pipeline when input files change
estampo status # query printer status
estampo status -w # live printer dashboard
estampo profiles list # list available slicer profiles
estampo profiles pin # pin profiles for reproducible builds
Credentials
Printer credentials are stored in ~/.config/estampo/credentials.toml, created by estampo setup. The file is set to 600 permissions (owner read/write only) and is never committed to your repo — only the printer name appears in estampo.toml. Credentials can also be supplied via environment variables (BAMBU_PRINTER_IP, BAMBU_ACCESS_CODE, BAMBU_SERIAL) for CI or shared environments.
Documentation
- CLI reference — all commands, flags, and pipeline stages
- Config reference — complete TOML format
- Developing — setup, testing, architecture
License
Apache 2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file estampo-0.2.1.tar.gz.
File metadata
- Download URL: estampo-0.2.1.tar.gz
- Upload date:
- Size: 8.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aff3211b665431ddb4076e78556de369d9a9bc27b0fe97097df9a642dd2e6467
|
|
| MD5 |
252f5e94b9f4c54a01eb95d4526ea269
|
|
| BLAKE2b-256 |
11ccfe7a340b1800819910816ef701e96eabb97e8475952ec6495dcf4f807f86
|
Provenance
The following attestation bundles were made for estampo-0.2.1.tar.gz:
Publisher:
publish-cloud-bridge.yml on estampo/estampo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
estampo-0.2.1.tar.gz -
Subject digest:
aff3211b665431ddb4076e78556de369d9a9bc27b0fe97097df9a642dd2e6467 - Sigstore transparency entry: 1195202765
- Sigstore integration time:
-
Permalink:
estampo/estampo@52235fc17d67995c85437e09639ba7bf848b6790 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/estampo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-cloud-bridge.yml@52235fc17d67995c85437e09639ba7bf848b6790 -
Trigger Event:
push
-
Statement type:
File details
Details for the file estampo-0.2.1-py3-none-any.whl.
File metadata
- Download URL: estampo-0.2.1-py3-none-any.whl
- Upload date:
- Size: 93.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ed0ca6dda160b781e416c4a5126c05ec69d5282d4395638e1d924e98500903b1
|
|
| MD5 |
562be441479962fdbb56f888c7781a80
|
|
| BLAKE2b-256 |
43e744744e4bf4bf06c8fcb31eafa25015cd4902e3013ad370d6676b6c7af4e1
|
Provenance
The following attestation bundles were made for estampo-0.2.1-py3-none-any.whl:
Publisher:
publish-cloud-bridge.yml on estampo/estampo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
estampo-0.2.1-py3-none-any.whl -
Subject digest:
ed0ca6dda160b781e416c4a5126c05ec69d5282d4395638e1d924e98500903b1 - Sigstore transparency entry: 1195202788
- Sigstore integration time:
-
Permalink:
estampo/estampo@52235fc17d67995c85437e09639ba7bf848b6790 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/estampo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-cloud-bridge.yml@52235fc17d67995c85437e09639ba7bf848b6790 -
Trigger Event:
push
-
Statement type: