Blog

Bambu Studio CLI Reference: Headless Slicing from the Command Line

April 19, 2026

Bambu Studio has the same headless CLI as Orca Slicer — because Orca Slicer is a fork of Bambu Studio. Complete flag reference, how it compares to Orca Slicer, and when to use each for automated print farm slicing.

Bambu Studio has a command-line interface for headless slicing that almost nobody knows about. It works nearly identically to Orca Slicer's CLI — which makes sense, because Orca Slicer is a fork of Bambu Studio. If you've read our Orca Slicer CLI reference, most of this will look familiar. This article covers what's the same, what's different, and when to reach for one over the other.

The Fork Relationship

Bambu Lab open-sourced Bambu Studio on GitHub in late 2022, built on top of PrusaSlicer's foundation. The community took it and ran: Orca Slicer forked Bambu Studio's codebase, added features, and became the dominant community slicer for Bambu printers.

The CLI architecture was in Bambu Studio first. Orca Slicer inherited it. That's why --slice, --load-settings, --load-filaments, --export-3mf, and --pipe are identical between the two binaries — they trace to the same original code.

The practical consequence: if you have a headless slicing pipeline written for Orca Slicer, swapping to Bambu Studio requires changing the binary name and nothing else for most workflows. The flags, the JSON progress format on --pipe, the output .gcode.3mf structure — all the same.

The differences are at the edges: a handful of flags that one has and the other doesn't, and meaningfully different profile ecosystems.

How Printago Uses Both

Printago lets users choose which slicer engine runs their jobs — Bambu Studio or Orca Slicer — since both are supported. The fork relationship means either works for Bambu hardware. That said, Bambu Lab updates Bambu Studio first: when a new printer ships or firmware changes slicing behavior, Bambu Studio gets the profile update before Orca Slicer does. For pipelines where profile accuracy is critical, Bambu Studio is the lower-risk choice for Bambu hardware specifically.

The core invocation is identical to Orca Slicer — just swap the binary name:

bambu-studio \
  --slice 1 \
  --load-settings "machine.json;process.json" \
  --load-filaments "filament.json" \
  --allow-newer-file \
  --export-3mf output.gcode.3mf \
  --pipe /tmp/progress_pipe \
  model.3mf

The Complete CLI Reference

Output of BambuStudio --help on Bambu Studio 2.6.0, organized by category:

BambuStudio-02.06.00.51:
Usage: bambu-studio [ OPTIONS ] [ file.3mf/file.stl ... ]

Input & Configuration

Flag Description
--load-settings "setting1.json;setting2.json" Load process and machine settings. Semicolon-separated. Machine first, then process.
--load-filaments "filament1.json;filament2.json;..." Load filament settings, one file per slot. Semicolon-separated.
--load-filament-ids "1,2,3,1" Map objects to filament slots by index.
--load-assemble-list <assemble_list.json> Load an object assembly list for multi-object plates without a project 3MF.
--load-custom-gcodes <custom_gcode_toolchange.json> Load custom G-code tool change events from a JSON file.
--load-slicedata <directory> Load cached slicing data from a previous run to avoid re-slicing.
--allow-newer-file Allow slicing a 3MF created with a newer Bambu Studio version. Without this, newer 3MFs are rejected.
--allow-mix-temp Allow filaments with incompatible temperature ranges to be printed together.
--skip-modified-gcodes Skip modified G-codes embedded in the 3MF from printer or filament presets.
--load-defaultfila Load the first filament profile as the default for any object without an explicit filament assignment.
--uptodate Update config values in the 3MF to the latest.
--uptodate-settings "setting1.json;setting2.json" Load updated machine/process settings when using --uptodate.
--uptodate-filaments "filament1.json;filament2.json;..." Load updated filament settings when using --uptodate.

Slicing Actions

Flag Description
--slice <option> Slice the plates. 0 = all plates, i = plate number i.
--no-check Skip validity checks including G-code path conflict detection.
--skip-objects "3,5,10,77" Skip specific objects by index.
--mstpp <seconds> Maximum slicing time per plate in seconds. Kills the slice if it exceeds this limit.
--mtcpp <count> Maximum triangle count per plate. Rejects plates that exceed this geometry budget.
--enable-timelapse Mark the slicing job as using timelapse mode.
--normative-check Run normative compliance checks on the output.

Object Arrangement & Transformation

Flag Description
--arrange <option> Arrangement behavior: 0 = disable, 1 = enable, other = auto.
--allow-rotations Allow object rotation during arrange.
--allow-multicolor-oneplate Allow multiple colors on a single plate during arrange.
--avoid-extrusion-cali-region Avoid the extrusion calibration region when placing objects.
--assemble Arrange supplied models on a plate and merge them into a single model.
--ensure-on-bed Lift objects above the bed when partially below it. Disabled by default.
--orient <option> Orient options: 0 = disable, 1 = enable, other = auto.
--rotate <degrees> Rotation angle around the Z axis.
--rotate-x <degrees> Rotation angle around the X axis.
--rotate-y <degrees> Rotation angle around the Y axis.
--scale <factor> Scale the model by a float factor (e.g. 1.5 = 150%).
--clone-objects "1,3,1,10" Clone objects from the load list.
--repetitions <count> Repetition count of the whole model.
--convert-unit Convert model units.

Output

Flag Description
--export-3mf <filename.3mf> Export the sliced project as a .gcode.3mf. Primary output for headless slicing.
--export-slicedata <directory> Export slicing data for reuse with --load-slicedata.
--export-settings <settings.json> Export current settings to JSON.
--export-png <option> Export PNG thumbnails. 0 = all plates, i = plate i.
--export-stl Export objects as a single merged STL.
--export-stls Export objects as multiple individual STLs.
--outputdir <dir> Output directory for exported files.
--min-save Export the 3MF with minimum file size. Recommended for production pipelines.
--skip-useless-pick Skip generating pick/top images that aren't referenced. Saves time in headless pipelines.

Progress & Debugging

Flag Description
--pipe <pipename> Send slicing progress as JSON to a named pipe. Same format as Orca Slicer: plate_index, plate_count, plate_percent, total_percent, message, warning.
--debug <level> Log level: 0=fatal, 1=error, 2=warning, 3=info, 4=debug, 5=trace.
--info Output model information without slicing.
--help, -h Show help.

Metadata Embedding

Flag Description
--metadata-name "name1;name2;..." Metadata keys to embed in the output 3MF. Paired with --metadata-value.
--metadata-value "value1;value2;..." Metadata values corresponding to --metadata-name.
--makerlab-name <name> MakerLab name to embed in the 3MF.
--makerlab-version <version> MakerLab version to embed in the 3MF.

Downward Compatibility

Flag Description
--downward-check Check whether the current machine is downward compatible with machines in the list.
--downward-settings "machine1.json;machine2.json;..." Machine settings list for downward compatibility checking.

Setting Priority

Bambu Studio resolves settings in this order (highest to lowest):

  1. Command-line flag values
  2. Values from --load-settings and --load-filaments
  3. Values embedded in the 3MF file

Practical Examples

Basic headless slice

bambu-studio \
  --slice 1 \
  --load-settings "machine.json;process.json" \
  --load-filaments "filament.json" \
  --allow-newer-file \
  --export-3mf output.gcode.3mf \
  model.3mf

Multi-filament slice with progress streaming

mkfifo /tmp/bslicer_pipe

# Read from the pipe in the background
cat /tmp/bslicer_pipe | while IFS= read -r line; do
  echo "Progress: $line"
done &

bambu-studio \
  --slice 1 \
  --load-settings "machine.json;process.json" \
  --load-filaments "pla_red.json;pla_white.json;pla_blue.json" \
  --allow-newer-file \
  --export-3mf output.gcode.3mf \
  --pipe /tmp/bslicer_pipe \
  model.3mf

rm /tmp/bslicer_pipe

Progress lines look like:

{"plate_index":1,"plate_count":1,"plate_percent":42,"total_percent":42,"message":"Generating support","warning":""}

Using --mstpp for safety limits

In a cloud pipeline where you can't afford runaway slicing jobs, set a time limit:

bambu-studio \
  --slice 0 \
  --load-settings "machine.json;process.json" \
  --load-filaments "filament.json" \
  --mstpp 300 \
  --export-3mf output.gcode.3mf \
  model.3mf

--mstpp 300 kills any plate that takes longer than 5 minutes to slice. Without this flag, a pathological model can run indefinitely — there's no built-in timeout in Bambu Studio's CLI.

Skip thumbnail generation

For headless pipelines where you don't need the preview images:

bambu-studio \
  --slice 1 \
  --load-settings "machine.json;process.json" \
  --load-filaments "filament.json" \
  --skip-useless-pick \
  --export-3mf output.gcode.3mf \
  model.3mf

--skip-useless-pick skips the pick and top-view thumbnail generation, which can meaningfully speed up batch slicing when you're discarding the images anyway.

Multi-object plate without a project 3MF

The assemble list format is identical to Orca Slicer (it originated here). The top level is an object with a plates array — not a flat array of objects:

{
  "plates": [
    {
      "plate_name": "plate_1",
      "need_arrange": true,
      "objects": [
        { "path": "/tmp/body.stl",  "count": 1, "filaments": [1], "assemble_index": [1] },
        { "path": "/tmp/insert.stl","count": 1, "filaments": [2], "assemble_index": [1] }
      ]
    }
  ]
}
bambu-studio \
  --slice 1 \
  --load-settings "machine.json;process.json" \
  --load-filaments "pla_white.json;pla_red.json" \
  --load-assemble-list assemble.json \
  --export-3mf output.gcode.3mf

Key fields:

Field Notes
path Absolute path to the file.
count Copies of this object to place.
filaments 1-based slot indices. Length 1 (all copies) or equal to count (one per copy).
assemble_index Objects sharing the same index are merged into a single composed model — how you build multi-part prints from separate STL files.
need_arrange true = auto-arrange. false = use pos_x/pos_y for explicit placement.
pos_x, pos_y, pos_z Explicit positions in mm when need_arrange: false. Arrays, one per copy or a single value applied to all.
print_params Key-value string map of per-object setting overrides.
plate_params Key-value string map of plate-level setting overrides.
height_ranges Array of {min_z, max_z, range_params} for per-height-range overrides.

See the Orca Slicer CLI reference for the full field descriptions — the schema is the same.


Bambu Studio vs Orca Slicer: Which to Use

Bambu Studio Orca Slicer
Maintained by Bambu Lab (official) Community fork
Profile updates First to get new Bambu profiles Follows Bambu Studio, usually within days
--datadir flag Not supported Supported — useful for profile isolation
--mstpp / --mtcpp Supported Supported (inherited from Bambu Studio)
--skip-useless-pick Supported Supported (inherited)
Non-Bambu printer support Bambu printers only Broader printer ecosystem
Core slicing output Identical Identical

Use Bambu Studio when: you're slicing for Bambu printers and need guaranteed profile parity with the official firmware. New X1 or A1 models? Bambu Studio's profiles will be correct the day the printer ships. Orca Slicer may lag a few days.

Use Orca Slicer when: you need --datadir for profile isolation across jobs, you're supporting non-Bambu hardware, or you prefer the community release cadence.

For Bambu-only production pipelines, Bambu Studio is the lower-risk choice. The CLI is identical for everything that matters.


Gotchas

Profile format is Bambu's, not Orca Slicer's

Bambu Studio and Orca Slicer both use JSON profile files, and the schema is very similar — but they're not drop-in compatible. Orca Slicer profiles include keys and structures that Bambu Studio doesn't recognize, and vice versa. Export profiles from the slicer you intend to use headlessly.

The output is a .gcode.3mf, not .gcode

--export-3mf produces a 3MF archive containing G-code, not a raw .gcode file. Bambu printers accept .gcode.3mf natively — in fact they prefer it. If you need raw G-code, unzip the archive and extract Metadata/plate_N.gcode.

Temp files accumulate — always clean up

Each Bambu Studio slice generates hundreds of megabytes of temp files in the working directory. In a long-running service, this fills disk fast. Always run slices in an isolated temp directory and delete the entire directory when done:

const sandboxDir = await fs.mkdtemp(path.join(os.tmpdir(), 'bslicer-'));
try {
  // run bambu-studio here
} finally {
  await fs.rm(sandboxDir, { recursive: true, force: true });
}

--skip-useless-pick is worth enabling

Unlike Orca Slicer (which doesn't have this flag), Bambu Studio generates pick and top-view thumbnails by default even in headless mode. These images are unused in most pipelines. --skip-useless-pick skips them and reduces both runtime and output file size.

Sign up for free today

No credit card required. Connect unlimited printers and get production automation running in minutes.