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.

Statusidle Files— File— Declared unit— Written as— Mesh instances merged— Triangles— Bounding box (output units)— Output size— Network since file read—

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.

Frequently asked questions

Is my 3MF uploaded anywhere?
No. Your browser reads the archive and decompresses it with its built-in decompression, and this site’s own code does the parsing and the writing in this tab. There is no archive, mesh or rendering library to download. Once the page and code have loaded, conversion can run offline. The meter counts resource-timing entries from the first file read; it does not see earlier page downloads or every network channel, such as WebSocket traffic.
What happens to the units?
By default they are converted to millimetres, and the factor is printed, so nothing is scaled silently. The readout shows both the unit the file declared and what was written. A millimetre source has factor 1, and a file that declares no unit is read with 3MF’s millimetre default. If you keep the file’s own numbers from an inch file, a slicer that reads STL as millimetres will open the model far too small, so set the receiving slicer’s unit to match.
What is lost converting 3MF to STL?
Colour and materials, because STL carries neither; metadata and the embedded thumbnail; the declared unit; and the separate objects, which become one mesh. What survives is the placed triangle geometry, with each coordinate written as a 32-bit float, so a value that needs more than about seven significant digits is rounded to fit. Keep the 3MF, or use a 3MF-aware editor, when you need the richer structure.
Why was my 3MF refused?
Archive/XML refusals use “this .3mf could not be read” and name the reason. Unsupported compression methods, ZIP64, encryption, damage, sliced or beam-lattice content are refused. Exceeding the pre-read input-file-size or maximum triangle-count limit produces a message naming the observed value and applicable limit. Archive-part and inflation size refusals keep the archive prefix and do not always report an observed size. Extension and file-read failures use other messages. A component or build item pointing into another model part through p:path is also refused with the archive prefix; this page does not follow it. No output is written for a refused file; other files in a batch can still convert.
Is the output binary or ASCII STL, and why?
Binary. An ASCII STL can be roughly six times larger for an equivalent mesh, though the ratio varies. Binary STL is widely supported by slicers, but check that your intended slicer accepts binary STL.

Related tools