Immutable 3D print pipeline: arrange, slice, and print
Project description
fabprint
Reproducible 3D print pipeline: define parts, slicer settings, and printer targets in a TOML file — arrange, slice, and print from the command line.
Why fabprint?
Code-CAD tools like build123d, OpenSCAD and cadquery let you define parts in code — parametric, testable, version-controlled. But the moment you print, that breaks: open a slicer GUI, drag in files, fiddle with settings. No diffs, no reproducibility.
fabprint closes the gap:
- Everything is text — TOML config, git-friendly, diffable
- Pinned profiles — lock exact slicer, filament, and process profiles in your repo
- Slicer overrides — tweak support, bed type, wall count without touching profile files
- Versioned Docker slicing — pin OrcaSlicer version for identical gcode across machines
- One command —
fabprint rungoes from STL files to a running print
Quick start
pip install fabprint # STL + 3MF support, LAN + cloud printing
pip install "fabprint[step]" # add STEP file support (build123d)
Create fabprint.toml (see full config reference):
[pipeline]
stages = ["load", "arrange", "plate", "slice", "print"]
[printer]
mode = "cloud-bridge"
name = "workshop" # references ~/.config/fabprint/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]
enable_support = 1
curr_bed_type = "Textured PEI Plate"
[[parts]]
file = "frame.stl"
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):
fabprint run # arrange, slice and send to printer
fabprint run --until plate # stop after plating
fabprint run --until slice # stop after slicing
fabprint run --dry-run # full pipeline without sending to printer
The 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:
fabprint 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.
CLI overview
fabprint run # full pipeline
fabprint run --until plate # stop after plating
fabprint run --only slice # run just one stage
fabprint run --dry-run # everything except sending to printer
fabprint login # log in to Bambu Cloud
fabprint watch # live printer dashboard
fabprint status # query printer status
fabprint profiles list # list available slicer profiles
fabprint profiles pin # pin profiles for reproducible builds
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 fabprint-0.1.41.tar.gz.
File metadata
- Download URL: fabprint-0.1.41.tar.gz
- Upload date:
- Size: 6.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
354628037eedbe774fa9a9ca86340ffb719f8ff09f6b91e23142c4be183e717b
|
|
| MD5 |
f89fc466c77fae5de4a7e5475988bce6
|
|
| BLAKE2b-256 |
bec9f1a45280ea1361a5bde0dae96d455aff3c3e199eb7cfe0788bdfa7331c7e
|
Provenance
The following attestation bundles were made for fabprint-0.1.41.tar.gz:
Publisher:
publish-cloud-bridge.yml on pzfreo/fabprint
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fabprint-0.1.41.tar.gz -
Subject digest:
354628037eedbe774fa9a9ca86340ffb719f8ff09f6b91e23142c4be183e717b - Sigstore transparency entry: 1114691987
- Sigstore integration time:
-
Permalink:
pzfreo/fabprint@e1c016642c64cc15c26c8e00f3d8dee666d1ee7d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/pzfreo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-cloud-bridge.yml@e1c016642c64cc15c26c8e00f3d8dee666d1ee7d -
Trigger Event:
push
-
Statement type:
File details
Details for the file fabprint-0.1.41-py3-none-any.whl.
File metadata
- Download URL: fabprint-0.1.41-py3-none-any.whl
- Upload date:
- Size: 65.3 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 |
d36303fd1a4ab860ef420174e355f50b8c05c35d30e0879c77af3afcfa565619
|
|
| MD5 |
e81d86b91d859d51423b7ca2bb725b87
|
|
| BLAKE2b-256 |
bd0de8f4452c3c8554bbef3732eed655e789b35088d4e169de1633eb73fbce43
|
Provenance
The following attestation bundles were made for fabprint-0.1.41-py3-none-any.whl:
Publisher:
publish-cloud-bridge.yml on pzfreo/fabprint
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fabprint-0.1.41-py3-none-any.whl -
Subject digest:
d36303fd1a4ab860ef420174e355f50b8c05c35d30e0879c77af3afcfa565619 - Sigstore transparency entry: 1114691995
- Sigstore integration time:
-
Permalink:
pzfreo/fabprint@e1c016642c64cc15c26c8e00f3d8dee666d1ee7d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/pzfreo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-cloud-bridge.yml@e1c016642c64cc15c26c8e00f3d8dee666d1ee7d -
Trigger Event:
push
-
Statement type: