Skip to main content

Reproducible 3D print builds. Define parts, slicer settings, and printer targets in code.

Project description

fabprint

PyPI version CI Python 3.11+ License: Apache 2.0 codecov

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.

# fabprint.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"
fabprint run        # arrange → slice → print, one command
  Output → fabprint_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 fabprint does

fabprint demo

  1. Define parts + settings in fabprint.toml
  2. Arrange — bin-packs models onto the build plate
  3. Slice — using a pinned OrcaSlicer version (via Docker) for identical G-code across machines
  4. 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.

fabprint pipeline

Why not just use OrcaSlicer CLI?

OrcaSlicer CLI is great for slicing a prepared plate. fabprint 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 plate to inspect layout, --only slice to re-slice, --dry-run to 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

fabprint 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 fabprint.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 fabprint — 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 fabprint
# or, to install as an isolated CLI tool:
pipx install fabprint

Generate a config with the interactive wizard, or dump a commented template:

fabprint setup                      # configures printer targets
fabprint init                       # interactive wizard — discovers profiles and CAD files, creates TOML
fabprint init --template            # dump a commented template

Or create fabprint.toml by hand (see full config reference):

[pipeline]
stages = ["load", "arrange", "plate", "slice", "print"]

[printer]
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]      # 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):

fabprint run                   # arrange, slice and send to printer
fabprint run --until slice     # stop after slicing
fabprint 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:

plate preview

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.

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@v4
      - uses: pzfreo/fabprint@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

fabprint init                        # interactive config wizard
fabprint init --template             # dump commented TOML template
fabprint validate                    # check config for issues
fabprint setup                       # set up a printer (credentials + connection type)
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 watch                       # re-run pipeline when input files change
fabprint status                      # query printer status
fabprint status -w                   # live printer dashboard
fabprint profiles list               # list available slicer profiles
fabprint profiles pin                # pin profiles for reproducible builds

fabprint status --watch

Credentials

Printer credentials are stored in ~/.config/fabprint/credentials.toml, created by fabprint 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 fabprint.toml. Credentials can also be supplied via environment variables (BAMBU_PRINTER_IP, BAMBU_ACCESS_CODE, BAMBU_SERIAL) for CI or shared environments.

Documentation

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

fabprint-0.1.131.tar.gz (8.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fabprint-0.1.131-py3-none-any.whl (89.5 kB view details)

Uploaded Python 3

File details

Details for the file fabprint-0.1.131.tar.gz.

File metadata

  • Download URL: fabprint-0.1.131.tar.gz
  • Upload date:
  • Size: 8.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fabprint-0.1.131.tar.gz
Algorithm Hash digest
SHA256 5eb955aba50818f37ea32392d0a1d002d8435cca9465c3f4854ad319327590d8
MD5 8db28cdb23a23c90e86053b4800f2d6b
BLAKE2b-256 d2b823d1f92e6a761afd9bbaec82a980387b46726ac061f4732b030247460648

See more details on using hashes here.

Provenance

The following attestation bundles were made for fabprint-0.1.131.tar.gz:

Publisher: publish-cloud-bridge.yml on pzfreo/fabprint

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fabprint-0.1.131-py3-none-any.whl.

File metadata

  • Download URL: fabprint-0.1.131-py3-none-any.whl
  • Upload date:
  • Size: 89.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fabprint-0.1.131-py3-none-any.whl
Algorithm Hash digest
SHA256 6df9cb76726d7631e9f4c147a60bc9e85e35a46b748141723612d2ee66f360b1
MD5 fe6a76eacb7cc76c9877fd5205d730c9
BLAKE2b-256 093c882623e4c875ae733cd6e4f002dc88fc5f8b86ef28c16a9ee2736959c8a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for fabprint-0.1.131-py3-none-any.whl:

Publisher: publish-cloud-bridge.yml on pzfreo/fabprint

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page