What Is STL?
STL stands for STereoLithography (also retroactively interpreted as Standard Tessellation Language or Standard Triangle Language), a 3D file format developed by 3D Systems in 1987 for their stereolithography 3D printing machines. STL describes a 3D surface as a mesh of triangles — a technique called tessellation — and has become the universal standard format for 3D printing and rapid prototyping.
Despite its age and simplicity (STL stores only geometry with no colour, texture, materials, or scene hierarchy), STL remains the dominant format for sending models to FDM (Fused Deposition Modeling) printers, SLA (Stereolithography) printers, SLS (Selective Laser Sintering) machines, and CNC milling operations. Every major slicer software (Cura, PrusaSlicer, Bambu Studio, Simplify3D, Meshmixer) reads STL natively.
Triangle Mesh: The Foundation
STL represents 3D geometry as a set of triangular facets. Each triangle is defined by:
- Three vertices (corner points in 3D space, as X,Y,Z coordinates)
- One normal vector (a unit vector perpendicular to the triangle face, indicating which side is "outward")
The normal vector encodes the orientation of the surface — essential for 3D printing to know which direction is "outside" the model (where material exists) and which is "inside" (void space).
A sphere represented in STL is not mathematically smooth — it is an approximation composed of many flat triangles. The more triangles used, the smoother the approximation and the larger the file. This is the fundamental STL trade-off: resolution vs. file size.
ASCII STL Format
The ASCII version of STL is human-readable:
solid MyModel
facet normal 0.0 0.0 1.0
outer loop
vertex 0.0 0.0 1.0
vertex 1.0 0.0 1.0
vertex 0.5 1.0 1.0
endloop
endfacet
facet normal 0.0 -1.0 0.0
outer loop
vertex 0.0 0.0 0.0
vertex 1.0 0.0 0.0
vertex 0.0 0.0 1.0
endloop
endfacet
...
endsolid MyModel
Syntax:
solid <name>— opening marker with optional namefacet normal nx ny nz— normal vector for the following triangleouter loop/endloop— contains exactly threevertex x y zlinesendfacet— ends the facetendsolid <name>— closing marker
ASCII STL is easy to generate programmatically but produces files roughly 5× larger than binary STL. Modern tools almost exclusively produce binary STL.
Binary STL Format
Binary STL is more compact. The structure is:
Bytes 0-79: Header (80 bytes) — arbitrary text, often file info
Bytes 80-83: Triangle count (uint32, little-endian)
Bytes 84-...: Triangle data, repeated for each triangle:
Bytes 0-11: Normal vector (3 × float32, little-endian) = 12 bytes
Bytes 12-23: Vertex 1 (3 × float32) = 12 bytes
Bytes 24-35: Vertex 2 (3 × float32) = 12 bytes
Bytes 36-47: Vertex 3 (3 × float32) = 12 bytes
Bytes 48-49: Attribute byte count (uint16) = 2 bytes
(Usually 0; some software uses this for colour)
Total bytes per triangle: 50 bytes. Total file size: 84 + (triangle_count × 50) bytes.
A 100,000-triangle model produces a binary STL of approximately 4.9 MB.
The header cannot start with the text "solid" (case-insensitive) because parsers use that string to detect ASCII vs. binary format.
The Right-Hand Rule and Winding Order
The winding order of a triangle's vertices (clockwise or counter-clockwise when viewed from outside) must be consistent with the normal vector according to the right-hand rule: if you curl the fingers of your right hand in the direction of vertex winding, your thumb points in the normal direction.
Inconsistent winding (flipped normals) causes slicers to misidentify interior and exterior surfaces, producing hollow models, missing walls, or incorrect infill. This is one of the most common STL errors.
Watertight (Manifold) Meshes
For 3D printing, the STL mesh must be watertight (also called manifold or solid):
- Every edge is shared by exactly two triangles (no open boundaries)
- No self-intersections — triangles don't pass through each other
- No holes — no missing faces leaving the interior exposed
- Consistent orientation — all normals point outward
A non-watertight mesh confuses slicers about what is "inside" and "outside" the model. Common slicers (Cura, PrusaSlicer) have automatic repair functions, but complex topology errors may require manual repair in tools like Meshmixer, Netfabb, or Windows 3D Builder.
STL Limitations
| Limitation | Description |
|---|---|
| No colour or texture | Only pure geometry; colours must be added in slicer or printer settings |
| No material properties | No concept of material, hardness, transparency |
| No object hierarchy | All triangles are one flat list; no grouping or naming within the file |
| Float32 precision | Coordinates are stored as 32-bit floats; ~7 decimal digits of precision |
| No units declaration | STL has no unit system; millimetres are the community convention |
| Large files | High-resolution models can be hundreds of MB |
| No metadata | No author, date, print settings, or other metadata |
STL vs. OBJ vs. 3MF vs. AMF
| Format | Year | Colour | Texture | Materials | Scene hierarchy | Primary use |
|---|---|---|---|---|---|---|
| STL | 1987 | No | No | No | No | 3D printing universal |
| OBJ | 1989 | Via MTL | Yes | Via MTL | No | 3D graphics/CG |
| AMF | 2011 | Yes (XML) | Yes | Yes | Yes | 3D printing replacement for STL |
| 3MF | 2015 | Yes | Yes | Yes | Yes | 3D printing modern standard |
| STEP | 1994 | No | No | Yes | Yes | Engineering CAD |
| PLY | 1994 | Yes | Yes | No | No | 3D scanning |
3MF (3D Manufacturing Format), developed by the 3MF Consortium (Microsoft, Autodesk, HP, Stratasys, etc.), is the modern replacement for STL in professional 3D printing. 3MF is a ZIP archive containing XML, supports full colour, multiple materials, support structures, and print settings — everything STL lacks. Major slicer software already supports 3MF; the industry is gradually transitioning away from STL.
Slicer Workflow
- Load STL into slicer (Cura, PrusaSlicer, Bambu Studio)
- Position model on the print bed — orientation matters for strength and supports
- Configure settings — layer height, infill %, speed, temperature, supports, brim/raft
- Slice — the slicer converts the 3D mesh into 2D layers, then generates toolpaths
- Preview — inspect layers for issues
- Export G-code — machine-specific instructions for the printer
- Print — printer executes G-code layer by layer
The slicer never writes back to the STL file — it reads the geometry and produces G-code as output.
Converting STL
STL → OBJ: Opens in Meshmixer, Blender, or trimesh (Python) → export as OBJ. OBJ preserves geometry; add an MTL file for material definitions.
STL → STEP: For engineering CAD workflows. Use FreeCAD (Mesh → Part → Convert to Solid → Export STEP). Quality depends on mesh resolution.
STL → 3MF: Most slicers can save as 3MF. In Cura: load STL, save as project (3MF) or File → Save Model → 3MF.
OBJ → STL: Blender: import OBJ → File → Export → STL. FreeCAD handles it too.
STL Repair: Meshmixer (Analyze → Inspector), Netfabb Online, Microsoft 3D Builder (auto-repairs on open), FreeCAD's Mesh module.
Summary
STL is 3D printing's universal language — 36 years old, technically limited, and irreplaceable in practice. Its simplicity is its strength: any 3D modeling software can export STL, every slicer reads it, and every 3D printer workflow accepts it. Its limitations (no colour, no materials, no metadata, float32 precision, no units) are known and worked around by convention. 3MF is the technically superior successor and is gaining adoption, but STL's installed base and ubiquity ensure it will remain the go-to format for desktop 3D printing for the foreseeable future.
Related conversions
Frequent conversions across the catalogue: