3D printing · No upload
Convert 3MF to STL on your device
Turn a 3MF from your slicer into a binary STL, with build placements applied and the units shown.
Colour, materials and metadata are not carried; built objects are merged into one mesh. The unit is converted to millimetres by default, factor printed. Coordinates become 32-bit floats. Refused by name, no file is written: ZIP64, encrypted, damaged, sliced, a beam lattice, a component or build item pointing at another model part (p:path), over 256 MB or 500,000 triangles. Takes .3mf.
How this converter works
A 3MF is a ZIP archive with an XML model inside, and this site’s own code reads both. It reads the archive from its central directory, because an entry written in streaming mode can carry zeros for its checksum and sizes in the local header, and a reader that trusts those headers can produce empty parts. The archive’s relationships point to the model part; your browser decompresses it, and the reader checks it against the checksum the archive recorded before parsing the XML. A failed checksum produces a named refusal. The browser’s XML parser reports errors inside the document it returns, so the reader checks the document before using it. Then each build item’s and component’s transform is applied, recursively, so each object keeps the placement the 3MF gave it.
The download is a binary STL: an 80-byte header carrying the site's name, the triangle count, then 50 bytes per triangle. Each triangle is written as its three vertices and a unit-length normal computed from their winding, so the writer does not depend on usable source normals; a degenerate face gets a zero normal. The attribute byte count is zero. The preview above the results shows the mesh you are about to download, labelled with its source file, so you can turn it over before you save it.
3MF declares its unit inside the file; STL declares none. That is why the default converts coordinates to millimetres and prints the factor; choose “keep the file’s own numbers” to write the raw coordinates instead. Colour, materials and metadata do not carry over. Placed objects are merged into one mesh after their build transforms are applied. Explicit build items select the placed objects. With no build items, unreferenced root objects are placed at the origin; the readout counts nonempty mesh instances, not unique object IDs. Named refusals cover ZIP64, encrypted archives, unsupported compression, a missing model part, beam lattices, sliced models, checksum mismatches and non-model objects, and a refusal produces no file. The reader refuses a component or build item that points at another model part inside the archive (p:path); it does not fetch that part. Inputs above 256 MB and meshes above 500,000 triangles are refused with the observed value and the limit, because the whole mesh has to fit in your device’s memory. After a read or parse failure, the readout names that file and clears its measurements and preview. Extension and size refusals happen before reading: they appear in result rows and can leave the previous readout and preview in place. Files that did convert stay downloadable in their rows.