⬢ prusa-profile-tuning

Phase 3 · Ship it · L17

Profile structure and naming

Measurements that live in your head are lost. This is how they become named, machine-scoped presets that can't end up on the wrong printer.

⏱ ~20 minutes in PrusaSlicer• 💾 No printing required• Phase 3
◎ Why this lesson

You run three printers with two firmware families. The specific way that goes wrong is not dramatic: it's selecting eSun PETG on the Core One when the numbers in it were measured on the MK3S, and the print coming out nearly right. Slightly bulged corners, slightly wrong dimensions, no error message. A profile that cannot physically appear on the wrong machine is the only reliable fix, and PrusaSlicer gives you the mechanism. This lesson wires it up.

Four decisions, and they compound. Get them right once and the fleet stays sane for years; get them wrong and you'll be renaming presets in three months trying to work out which number came from where.

1One profile per printer family — not per spool

The temptation is a profile per spool, since extrusion multiplier genuinely varies between colours. Resist it. You will have forty presets by Christmas and no idea which are current.

The unit that earns a preset is vendor + material + printer family + nozzle:

The naming convention
# <Vendor> <Material> @<PRINTER> <nozzle>

eSun PETG @MK3S 0.4
eSun PETG @MK4S 0.4
eSun PETG @COREONE 0.4

Per-spool variation goes in the notes field, not in a new preset — that's Lesson 19. The reason the printer belongs in the name and not just in the metadata is that the name is what you read in a dropdown at 11 pm.

▲ Why "family", not "printer"

An EM and a temperature transfer between two machines of the same family. A Pressure Advance value does not transfer from an MK3S — different firmware, different feature, different scale. Your MK4S and Core One share an MK4S-class hotend, so their filament profiles will end up close; their print profiles won't, because one is a bedslinger and the other is CoreXY. Keep them as separate presets anyway — you want to be able to change one without touching the other.

2Save as. Never overwrite a system profile

The workflow, every time:

That last step is your only backup. PrusaSlicer's user presets are not in your repo and are not in version control; a reinstall or a profile-update collision loses them silently.

3The compatibility condition — the part that keeps a fleet honest

Filament Settings → Dependencies → Compatible printers condition takes an expression. If it evaluates false for the selected printer, the profile does not appear. That is the mechanism that makes a mis-selection impossible rather than merely unlikely.2

Open your machine. The pattern and the advance command both differ.

MK3S · Marlin, Linear Advance
; Filament Settings → Dependencies → Compatible printers condition
printer_model=~/.*MK3.*/ and nozzle_diameter[0]==0.4
; Filament Settings → Custom G-code → Start G-code
M900 K0.07 ; eSun PETG — measured L12, MK3S only

M900 K is Marlin's Linear Advance.3 Putting an M572 here does nothing on this machine.

MK4S · Buddy, Pressure Advance
; Filament Settings → Dependencies → Compatible printers condition
printer_model=~/.*MK4.*/ and nozzle_diameter[0]==0.4
; Filament Settings → Custom G-code → Start G-code
M572 S0.05 ; eSun PETG — measured L12, MK4S only

Note that /.*MK4.*/ matches an MK4 and an MK4S. That is deliberately loose. If you want it strict, read your machine's actual model string first — see the callout below — and change it to /.*MK4S.*/. Don't tighten a pattern you haven't verified: an over-strict condition makes the profile vanish with no error, which looks exactly like having lost it.

Core One · Buddy, Pressure Advance, enclosed
; Filament Settings → Dependencies → Compatible printers condition
printer_model=~/.*COREONE.*/ and nozzle_diameter[0]==0.4
; Filament Settings → Custom G-code → Start G-code
M572 S0.05 ; eSun PETG — measured L12, Core One only

Same command family as the MK4S, different measured value — measure it on this machine. And if you own more than one Core One variant, note that Core One, Core One+ and Core One L are distinct models with distinct strings; verify before assuming /.*COREONE.*/ catches yours.

⚠ Verify the model string, don't guess it

Select the printer, slice anything, and open the G-code in a text editor. PrusaSlicer writes its configuration as comments at the end of the file — search for printer_model and read the literal value. That is the string your regex has to match. Guessing and getting it wrong produces the quietest possible failure: the profile simply isn't in the dropdown, and nothing tells you why.

A related quiet failure worth knowing: when a printer change makes a filament profile incompatible, PrusaSlicer flags it red rather than hiding it, and there's a preference to show incompatible profiles at all times.2 If you've enabled that preference, a red-flagged profile is selectable — and selecting one is exactly the mistake this section exists to prevent.

⌁ Scope-and-advance builder — condition and start line, ready to paste

The two lines every shipped filament preset needs, generated together so they can't disagree. Defaults reproduce the MK3S panel above. The condition uses the loose family pattern — verify printer_model from a sliced file's config comments before tightening it.

Paste each bare line into the pane its label names. The condition field takes only the expression — no label line; the start line's trailing comment is safe to keep.

4Inherit, or stand alone?

A PrusaSlicer preset can inherit from a system profile — carrying only your changes, and picking up Prusa's updates to everything else. Or it can be self-contained, listing every value explicitly. Your existing bundle is deliberately self-contained.

Inherits — the cost
# upside
picks up Prusa's fixes
smaller, easier to read
tracks new settings

# downside
a system update can
move a value you never
measured, silently
Self-contained — the trade
# upside
survives system updates
imports on any version
what you measured is
what you print

# downside
misses Prusa's fixes
you own every value

For a tuning baseline, self-contained is the right call and your bundle already makes it. The point of this whole course is that the numbers are yours, measured, attributable. A value that can change under you because a vendor bundle updated is a value you can't reason about. The price is that you must periodically diff your profile against the current system one and decide, deliberately, whether to adopt anything — which is a Lesson 19 habit.

One more structural rule, from your own conventions and worth restating because it is easy to get backwards: the advance command lives in the filament profile's start G-code, never in the printer's. PrusaSlicer is unusual in offering per-filament custom G-code, and that is precisely what makes the K or S value change automatically when you switch material.4 Put it in the printer profile and every filament on that machine gets one material's value.

5Find the fault

Click each. Each one is a real way a three-printer fleet goes wrong.

What breaks, and when will you notice?

6Check yourself

From memory. Question 2 reaches back to Phase 0.

Question 1 of 3
Your new PETG profile doesn't appear in the dropdown at all. Most likely cause?
Question 2 of 3
Which measured value is safe to copy from your MK4S profile to your Core One profile?
Question 3 of 3
Why does this course prefer self-contained profiles over ones that inherit?
✎ Your task · do this with your tutor

Audit and scope your existing bundle

Your reference/source-material/esun-starter-profiles-bundle.ini already follows most of this. Verify it against a real machine rather than against the file:

  1. For each of your three printers: select it, slice anything, export the G-code, and read the literal printer_model value out of the config comments at the end. Write all three down.
  2. Compare each against the regex in the bundle. Does /.*MK4.*/ match your MK4S's actual string? Does /.*COREONE.*/ match your Core One's? Decide — with the evidence in front of you — whether to tighten /.*MK4.*/ to /.*MK4S.*/.
  3. Import the bundle and confirm each profile appears on exactly one machine — with the matching nozzle selected, since the conditions scope by nozzle too — and disappears on the other two. That's the test that matters; the file being correct is not the same as it working.
  4. Export your own config bundle and save it into this repo. Note what it contains that the starter bundle doesn't.

→ Paste me the three model strings and your tighten-or-not decision with its reason. If you tightened without step 1, I'll ask you to undo it.

What you can now say

  1. One profile per vendor + material + printer family + nozzle — per-spool variation goes in notes, not in new presets.
  2. Save as, never over a system profile, or you lose its conditionals and its update path.
  3. The compatibility condition makes mis-selection impossible, which is stronger than making it unlikely.
  4. Verify the model string from sliced G-code before tightening a regex — an over-strict condition fails silently.
  5. Advance lives in the filament profile's start G-code, which is what lets the value follow the material.
📖
Primary source · read this next
Short, and it distinguishes the three export options clearly — Export Config, Export Config Bundle, and Export Config Bundle with Physical Printers. Only the second is your backup; knowing which is which saves an unpleasant discovery later.
💬 I'm your tutor — ask me anything. Paste me a condition expression and the model string you read off the machine, and I'll tell you whether it matches before you find out the hard way. Regexes that almost work are the worst kind. Confused beats stuck.

§References

  1. Prusa Research. How to import and export custom profiles in PrusaSlicer. The File → Import and File → Export paths, and that a config bundle contains all custom settings saved in the current PrusaSlicer version. Link.
  2. Prusa Research. Configuration and profiles. The Dependencies → Compatible printers condition setting, that profiles made incompatible by a printer or nozzle change are flagged red, and the preference that shows incompatible profiles anyway. Link.
  3. Prusa Research. Linear Advance. M900 K on Marlin-firmware MK3-family machines. Link.
  4. This course. Master tuning guide, §2.3 — PrusaSlicer is the only slicer with per-filament custom G-code, which is what makes the advance value change automatically per filament preset. Link.

Lesson L17 of the prusa-profile-tuning course · all lessons · The Calibration Card · glossary