3D printing · No upload

3MF to STL

Turn a 3MF from your slicer into a binary STL that any tool will open. The archive is unpacked and checksummed by your browser, every build placement is applied, and the unit the file declares is converted with the factor printed beside it — never applied silently. Nothing is uploaded, nothing is downloaded, and the network meter below proves the zero live.

Statusidle Files File Declared unit Written as Objects merged Triangles Bounding box (mm) Output size Network since file read

How this converter works

A 3MF is a ZIP archive with an XML model inside it, and both halves are read here by first-party code. The archive is read from its central directory rather than by scanning local file headers, and that is not a stylistic choice: an entry written with the streaming flag carries zeros for its checksum and both sizes in the local header, so a local-header scan is how a reader silently produces empty parts. The model part is found through the archive's own relationships, decompressed by your browser's built-in inflater, and then verified against the checksum the archive recorded for it — a damaged file becomes a named refusal instead of a wrong model. The XML goes through your browser's own parser, and the result is checked for a parse error before anything is trusted, because that parser reports failure in the document rather than by throwing. Then every build item's and component's transform is applied, recursively, because ignoring them would stack every object at the origin and write a file that looks fine and is wrong.

What comes out is a binary STL. Each triangle is written as its three vertices plus a normal computed here from the winding and written unit-length — the source may not have carried usable normals, and a degenerate face gets a zero normal, which is what the format specifies when it cannot be known. The attribute byte count is written as zero. Binary rather than ASCII because an ASCII STL of the same mesh is roughly six times larger and every slicer reads binary, so the text form would cost size and gain nothing. The header is 80 bytes carrying this site's name and nothing else. The preview above the results is the same mesh you are about to download, labelled with the file it came from, so you can turn it over before you save it.

The honest limits. 3MF declares its unit inside the file; STL declares none. This page reads the declared unit, converts the coordinates to millimetres, and prints the factor it used — nothing is scaled silently. Real things are lost on the way across, and they are named rather than glossed: colour and materials, because STL carries neither; metadata and the embedded thumbnail; the declared unit itself; and per-object structure, because an STL has no concept of separate objects, so every object your 3MF builds is merged into one mesh, with each build item's placement applied first. What is refused is refused by name — ZIP64, an encrypted archive, a compression method this page doesn't implement, a missing model part, a beam lattice, a mismatched checksum — and a refusal always means no file was written. Input files above 256 MB and meshes above 500,000 triangles are declined with both numbers stated, because the whole mesh has to fit in your device's memory as raw floats.

Frequently asked questions

Is my 3MF uploaded anywhere?
No. Your browser opens the archive with its File API, unpacks it with its own decompression, and this page's own JavaScript does the rest inside the tab. Nothing is vendored here — no archive library, no mesh library, no rendering library — so unlike the converter pages that fetch an encoder once, this page has no one-time download to footnote and the network meter's zero has no exception at all. Switch your wifi off and it still converts.
What happens to the units?
3MF declares its unit inside the file; STL declares none. This page reads the declared unit, converts the coordinates to millimetres, and prints the factor it used — nothing is scaled silently. The readout shows both halves: the unit the file declared, and what was actually written. Most 3MFs declare millimetre, in which case the factor is one and nothing changes. If yours declares inch, writing the raw numbers would hand you a model a slicer opens far too small, which is exactly the failure this control exists to prevent — and if you want the raw numbers anyway, choose “keep the file's own numbers” and the readout says so.
What is lost converting 3MF to STL?
Real things, and they are worth knowing before you convert. Colour and materials are lost, because STL has no way to carry them. Per-object structure is lost: an STL has no concept of separate objects, so every object your 3MF builds is merged into one mesh, with each build item's placement applied first. Metadata and the embedded thumbnail are lost. And the declared unit itself is lost, because there is no field for it in an STL — which is why this page prints the factor it applied instead of leaving you to guess. What survives is the geometry, exactly: the same triangles, in the same places.
Why was my 3MF refused?
Every refusal starts with “this .3mf could not be read” and then names its reason rather than mangling the file. The named ones are: it is not a ZIP archive at all; it uses ZIP64, which this page doesn't implement; the archive is encrypted; it uses a compression method this page doesn't implement, with the method number; the archive's checksum doesn't match, meaning the file is damaged; it has no 3D model part; its model part is not valid XML or declares no triangles; it uses the beam lattice extension, whose geometry is not triangles; or it is a sliced model rather than a mesh. A refusal always means no file was written.
Is the output binary or ASCII STL, and why?
Binary, always. An ASCII STL of the same mesh is roughly six times larger and every slicer reads binary, so ASCII would cost you download size and gain nothing. The file is written the plain way: an 80-byte header carrying this site's name, the triangle count, then fifty bytes per triangle. The normals are computed here from each triangle's winding and written unit-length rather than copied, because the source may not have carried usable ones; a degenerate face gets a zero normal, which is what the format says to write when it cannot be known. The attribute byte count is written as zero.

Related tools