Skip to main content

Headless 3D print pipeline: arrange, orient, slice, and send to printer from a TOML config

Project description

fabprint

PyPI version CI Python 3.11+ License: Apache 2.0

3D prints are hard to reproduce:

  • Slicer settings get lost between sessions
  • Printer configs drift across machines
  • There's no easy way to version or diff a print job

fabprint makes 3D printing reproducible. Define your models, slicer settings, and printer config once in a TOML file, then arrange, slice, and print from the command line — identically on any machine. It works with STL, STEP, and 3MF files, and pairs naturally with code-CAD tools like build123d, OpenSCAD, and cadquery.

# fabprint.toml
[[parts]]
file = "benchy.stl"

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

[printer]
name = "workshop"
fabprint run        # arrange → slice → print, one command

fabprint pipeline

How it works

  • Everything is text — one TOML config per project, git-friendly and 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 G-code across machines
  • One commandfabprint run goes from STL/STEP files to a running print

How is this different from OrcaSlicer CLI?

This builds on OrcaSlicer CLI, but is designed to allow other slicers like Cura to plugin.

OrcaSlicer CLI slices one plate of pre-arranged models. fabprint is a 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. PrusaLink and OctoPrint support is on the roadmap
  • Headless Docker slicing — no GUI, no display server, works in CI

Quick start

Prerequisites: Python 3.11+ and either Docker or a local OrcaSlicer install. Docker is recommended for reproducible slicing — it lets you pin the exact OrcaSlicer version so every machine produces identical G-code.

pip install fabprint                # STL + 3MF support, LAN + cloud printing
pip install "fabprint[step]"        # add STEP file support (build123d)

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

fabprint init                       # interactive wizard — discovers profiles and CAD files
fabprint init --template            # dump a commented template to stdout
fabprint init --template > fabprint.toml   # save template and edit manually

fabprint init --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]
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

fabprint run --until plate

The 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:

# .github/workflows/slice.yml
name: Slice
on: [push]
jobs:
  slice:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: astral-sh/setup-uv@v5
      - run: uv tool install fabprint
      - run: fabprint run --until slice
      - uses: actions/upload-artifact@v4
        with:
          name: gcode
          path: output/*.3mf

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 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

fabprint 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.58.tar.gz (6.1 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.58-py3-none-any.whl (78.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: fabprint-0.1.58.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

Hashes for fabprint-0.1.58.tar.gz
Algorithm Hash digest
SHA256 7d970f3d6fa3b4a13b0f1eb67868b7ba7bdf7b4a4540d5f2a88241327d45d69c
MD5 e17334c1f4543d109fa5bc128b0e1b97
BLAKE2b-256 babd4ef5c9c7dd0d0d2b1ebe834b062d2a75aa5200f658f887665b8973caa40a

See more details on using hashes here.

Provenance

The following attestation bundles were made for fabprint-0.1.58.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.58-py3-none-any.whl.

File metadata

  • Download URL: fabprint-0.1.58-py3-none-any.whl
  • Upload date:
  • Size: 78.1 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.58-py3-none-any.whl
Algorithm Hash digest
SHA256 4e23073782106f5af6955260c728b3a7103266aa99fa22633f6673d61162a6de
MD5 8f48fba6cffe2d00cc118a26e0a37114
BLAKE2b-256 4cddceb3ea0daf0e9b8f4b0e4f29bfdf295bc234a0a4fd4823d37c7a626d38db

See more details on using hashes here.

Provenance

The following attestation bundles were made for fabprint-0.1.58-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