Prusa has no separate specification for SL1 files; the format is whatever
PrusaSlicer writes and the printer reads. This page follows PrusaSlicer 2.9.2’s
writer and reader (src/libslic3r/Format/SL1.cpp, SL1_SVG.cpp
and the print settings in PrintConfig.cpp). The SL1S uses exactly the
same layout with the extension .sl1s, and PrusaSlicer also accepts a
plain .zip.
Files in the archive
An SL1 file is an ordinary ZIP archive (see ZIP) with the entries in this order:
| Entry | Holds |
|---|---|
config.ini | The job settings the printer reads; see below |
prusaslicer.ini | Every PrusaSlicer setting used, one key = value line each, so the job can be reopened in PrusaSlicer. Left out: compatible_printers, compatible_prints, print_host, printhost_apikey, printhost_cafile, the tilt parameters, and empty values |
config.json | The config.ini values again as JSON, plus "version": 1 and the layer separation (exposure) profile |
job00000.png, job00001.png … | One image per layer, bottom first: the job name followed by a five-digit layer number from 0 |
thumbnail/thumbnailWxH.png | Preview images, such as thumbnail/thumbnail800x480.png; RGBA PNG |
The job name is the jobDir value: the project name, or the file name
without its extension.
config.ini
Lines of key = value, keys in alphabetical order, values written with
a full stop as decimal separator.
| Key | Meaning |
|---|---|
action | Always print |
expTime | Exposure time of normal layers, in seconds |
expTimeFirst | Exposure time of the first (initial) layers, in seconds |
expUserProfile | Layer separation speed: 0 fast, 1 slow, 2 high viscosity (from the material’s print speed setting) |
fileCreationTimestamp | When the file was made, in UTC, in the form 2025-01-31 at 12:00:00 UTC |
hollow | 1 if any object is hollowed, otherwise 0 |
jobDir | Job name, also the prefix of the layer images |
layerHeight | Layer height in mm |
materialName | Name of the material profile |
numFade | Number of faded layers: the layers over which exposure steps down from the first-layer time to the normal time |
numFast | Number of layers printed with fast separation |
numSlow | Number of layers printed with slow separation |
printProfile | Name of the print settings profile |
printTime | Estimated print time, in seconds |
printerModel | Printer model, such as SL1 or SL1S |
printerProfile | Name of the printer profile |
printerVariant | Printer variant from the profile |
prusaSlicerVersion | PrusaSlicer build that wrote the file |
usedMaterial | Resin used, in millilitres |
The printer’s firmware may read further optional keys that PrusaSlicer does not write, and decides how to treat a job sliced for another model; neither is documented publicly, so they are not listed here.
config.json and the exposure profile
config.json holds every config.ini key with the same
value, "version": 1, and an exposure_profile object
describing how the printer separates each layer from the tank film:
| Member | Meaning |
|---|---|
area_fill | Threshold, as a percentage of the exposed area: layers smaller than it use below_area_fill, others above_area_fill |
below_area_fill, above_area_fill | Objects with the parameters below |
| Parameter | Unit in the file | Meaning |
|---|---|---|
delay_before_exposure_ms | ms | Wait after the previous separation before exposing |
delay_after_exposure_ms | ms | Wait after exposing before separating |
tower_hop_height_nm | nm | How far the platform rises |
tower_profile | name | Platform speed for the rise: layer1, layer2, layer3, layer4, layer5, layer8, layer11, layer14, layer18, layer22 or layer24 |
use_tilt | boolean | Whether the tank tilts to separate the layer; if not, the tilt values are ignored |
tilt_down_initial_profile | name | Speed for the first part of the tilt down |
tilt_down_offset_steps | microsteps | Length of that first part, from the level position |
tilt_down_offset_delay_ms | ms | Wait after it |
tilt_down_finish_profile | name | Speed for the rest of the tilt down |
tilt_down_cycles | count | Number of steps the rest is split into |
tilt_down_delay_ms | ms | Wait between those steps |
tilt_up_initial_profile | name | Speed for the first part of the tilt up |
tilt_up_offset_steps | microsteps | Tilt up to the level position minus this |
tilt_up_offset_delay_ms | ms | Wait after it |
tilt_up_finish_profile | name | Speed for the rest of the tilt up |
tilt_up_cycles | count | Number of steps the rest is split into |
tilt_up_delay_ms | ms | Wait between those steps |
Tilt speed names are move120, layer200,
move300, layer400, layer600,
layer800, layer1000, layer1250,
layer1500, layer1750, layer2000,
layer2250, move5120 and move8000 (the
numbers are microsteps per second). In the slicer these times are set in seconds
and the height in millimetres; the file stores whole milliseconds and nanometres.
Layer images
- 8-bit greyscale PNG, one channel. White (255) is cured resin, black (0) is not; grey edge pixels come from antialiasing.
- The image size is the printer’s display resolution in pixels
(
display_pixels_x×display_pixels_yin the profile) covering the display’s physical size (display_width×display_height, in mm). Withdisplay_orientationset toportraitthe width and height are swapped, so the image is drawn rotated. display_mirror_xanddisplay_mirror_ymirror the image to match how the display is mounted.gamma_correctionsets the antialiasing: 0 gives a hard threshold (pure black and white), 1 linear antialiasing, and other values a power curve on the edge coverage.- PrusaSlicer’s reader turns the images back into outlines by marching squares,
using these display settings from
prusaslicer.ini; a file without them is rejected as “Invalid SL1 / SL1S file”.
SL1 SVG variant
PrusaSlicer also writes an SL1 SVG archive, extension .sl1_svg: the
same entries, but each layer is an SVG file instead of a PNG. Each SVG sets
width and height in mm to the display size and a
viewBox in pixels, has the style fill: white; stroke: none;
fill-rule: nonzero, and holds one path per outline or hole,
written as M x y l followed by relative
steps. This keeps the exact outlines for printers that rasterise themselves.
Worked example
action = print
expTime = 2.5
expTimeFirst = 35
expUserProfile = 0
fileCreationTimestamp = 2025-01-31 at 12:00:00 UTC
hollow = 0
jobDir = bracket
layerHeight = 0.05
materialName = Prusament Resin Tough Prusa Orange @0.05
numFade = 10
numFast = 412
numSlow = 0
printProfile = 0.05 Normal @SL1S
printTime = 2263.48
printerModel = SL1S
printerProfile = Original Prusa SL1S SPEED
printerVariant = default
prusaSlicerVersion = PrusaSlicer-2.9.2
usedMaterial = 8.41
config.ini for a 412-layer job; the layers are
bracket00000.png to bracket00411.png. Values
illustrative.