
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.3mfThe 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):
- Command-line flag values
- Values from
--load-settingsand--load-filaments - 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.3mfMulti-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_pipeProgress 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.3mfKey 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.