Every format, tested against a real file
Claiming to read 75 formats is easy. This is the evidence: one real file per format, loaded through the viewer on this site, in a browser, against the build that is published. Last run 2026-09-08.
How this was measured
Not one sample was written here. Each is a real file taken from the project that owns the format, from a published model library, or from a piece of open hardware whose CAD is on the internet. That distinction matters: a fixture written next to its own reader only proves that the two agree with each other, and it is exactly the test that passes while real files fail.
Every file is dropped into the viewer in headless Chromium with software rendering, against the static export, and the numbers below are the ones the page itself reports. Where a format is refused, the message is the one a user would see. The script is scripts/sweep-formats.mjs in the repository, and it prints exactly this table.
74 of 75 formats read their sample, totalling 2,041,960 triangles across 47.3 MB of input.
Formats that read their sample
| Format | Sample | Size | Triangles | Meshes | Materials | Load |
|---|---|---|---|---|---|---|
| OBJ | spider.obj | 103.3 KB | 1,368 | 19 | 4 | 2.4s |
| FBX | spider.fbx | 120.4 KB | 1,368 | 19 | 4 | 1.9s |
| glTF | BoxTextured.gltf | 3.6 KB | 12 | 1 | 1 | 2.0s |
| GLB | BoxTextured.glb | 4.6 KB | 12 | 1 | 1 | 1.9s |
| STL | sphereWithHole.stl | 50.7 KB | 285 | 1 | 1 | 1.8s |
| PLY | bunny.ply | 2.9 MB | 69,451 | 1 | 1 | 2.0s |
| DAE | duck.dae | 277.7 KB | 4,212 | 1 | 1 | 1.9s |
| 3DS | Granate.3DS | 8.8 KB | 376 | 2 | 2 | 1.9s |
| 3MF | cube_gears.3mf | 223.1 KB | 25,692 | 17 | 17 | 2.0s |
| AMF | test5.amf | 1.4 KB | 4 | 1 | 1 | 1.9s |
| VRML | Wuson.wrl | 217.2 KB | 3,732 | 1 | 1 | 2.0s |
| USDZ | saeukkang.usdz | 3.7 MB | 25,000 | 1 | 1 | 2.2s |
| VOX | monu10.vox | 617.7 KB | 11,048 | 1 | 1 | 2.9s |
| PCD | Zaghetto.pcd | 704.2 KB | 0 | 0 | 1 | 1.8s |
| XYZ | helix_201.xyz | 9.0 KB | 0 | 0 | 1 | 1.9s |
| LWO | earth_cylindrical_x.lwo | 8.8 KB | 528 | 1 | 1 | 1.9s |
| VTK | bunny.vtk | 2.4 MB | 69,451 | 1 | 1 | 2.2s |
| KMZ | Box.kmz | 2.4 KB | 12 | 1 | 1 | 1.9s |
| DRC | bunny.drc | 45.7 KB | 69,451 | 1 | 1 | 2.1s |
| USD | MotionCaptureROM.usd | 130.0 KB | 2,000 | 24 | 24 | 2.0s |
| USDA | simple-skin-test.usda | 5.9 KB | 32 | 1 | 1 | 2.1s |
| USDC | suzanne.usdc | 47.6 KB | 968 | 1 | 1 | 1.9s |
| G-code | benchy.gcode | 1.9 MB | 0 | 0 | 2 | 2.0s |
| NC | benchy.nc | 1.9 MB | 0 | 0 | 2 | 2.0s |
| X | Testwuson.X | 819.0 KB | 3,732 | 1 | 1 | 2.9s |
| OFF | Wuson.off | 146.1 KB | 3,732 | 1 | 1 | 2.0s |
| ASE | ThreeCubesGreen.ASE | 8.5 KB | 36 | 3 | 3 | 2.0s |
| AC3D | SphereWithLight.ac | 17.7 KB | 17,664 | 1 | 1 | 2.5s |
| MS3D | jeep1.ms3d | 160.9 KB | 2,032 | 7 | 1 | 2.2s |
| MD2 | dolphin.md2 | 93.0 KB | 500 | 1 | 1 | 2.2s |
| MD3 | watercan.md3 | 2.7 KB | 78 | 1 | 1 | 2.3s |
| MD5 | Bob.md5mesh | 127.9 KB | 1,027 | 6 | 6 | 2.5s |
| MDC | spider.mdc | 963.1 KB | 1,368 | 19 | 19 | 2.2s |
| MDL | minigun.MDL | 2.7 MB | 576 | 1 | 1 | 2.8s |
| NFF | spheres.nff | 295 B | 15,380 | 4 | 4 | 2.6s |
| BLEND | scene_42.blend | 431.7 KB | 329 | 5 | 3 | 2.2s |
| DXF | rifle.dxf | 88.1 KB | 572 | 1 | 1 | 2.1s |
| LWS | move_x.lws | 7.1 KB | 36 | 1 | 1 | 2.3s |
| LXO | CrazyEngine.lxo | 59.3 KB | 2,460 | 1 | 1 | 2.4s |
| SMD | holy_grailref.smd | 256.4 KB | 896 | 1 | 1 | 2.3s |
| COB | spider_4_3.cob | 175.8 KB | 1,368 | 4 | 4 | 2.4s |
| B3D | WusonBlitz.b3d | 85.2 KB | 3,732 | 1 | 1 | 2.0s |
| IQM | mrfixit.iqm | 251.8 KB | 2,988 | 2 | 2 | 2.5s |
| OpenGEX | Example.ogex | 4.1 KB | 24 | 2 | 1 | 2.1s |
| PMX | Alicia_blade.pmx | 312.2 KB | 8,672 | 7 | 7 | 2.6s |
| BVH | Boxing_Toes.bvh | 2.5 MB | 140 | 1 | 1 | 2.8s |
| CSM | ThomasFechten.csm | 3.5 MB | 352 | 1 | 1 | 3.4s |
| SIB | heffalump.sib | 54.4 KB | 724 | 14 | 5 | 2.2s |
| Q3O | WusonOrange.q3o | 140.8 KB | 3,732 | 1 | 1 | 2.2s |
| XGL | sample_official.xgl | 3.1 KB | 24 | 2 | 1 | 2.0s |
| HMP | terrain.hmp | 4.4 KB | 2,048 | 1 | 1 | 2.1s |
| UC | box.uc | 634 B | 12 | 1 | 1 | 2.2s |
| Ogre XML | ninja.mesh | 130.0 KB | 1,008 | 2 | 2 | 3.0s |
| 3DM | Rhino_Logo.3dm | 5.4 MB | 131,948 | 12 | 8 | 4.0s |
| STEP | rounded-cube.step | 20.6 KB | 84 | 1 | 1 | 3.5s |
| STP | Cube 10x10.stp | 9.2 KB | 12 | 1 | 1 | 3.3s |
| IGES | Cube 10x10.igs | 11.3 KB | 12 | 1 | 1 | 2.8s |
| IGS | Cube 10x10.igs | 11.3 KB | 12 | 1 | 1 | 2.8s |
| BREP | as1_pe_203.brep | 41.2 KB | 3,848 | 18 | 18 | 2.9s |
| IFC | AC14-FZK-Haus.ifc | 3.9 MB | 35,792 | 385 | 13 | 3.6s |
| SKP | capilla_quiroz_v17.skp | 212.5 KB | 939 | 21 | 13 | 1.9s |
| DWG | example_2000.dwg | 568.9 KB | 6 | 1 | 2 | 3.3s |
| MAX | MiniHouse.max | 944.0 KB | 2,568 | 27 | 9 | 2.7s |
| RAW | WithTexture.raw | 353 B | 7 | 3 | 3 | 1.9s |
| TER | RealisticTerrain.ter | 129.1 KB | 131,072 | 1 | 1 | 2.1s |
| X3D | ComputerKeyboard.x3d | 9.5 KB | 2,020 | 100 | 100 | 1.9s |
| IRRMESH | spider.irrmesh | 141.5 KB | 1,368 | 4 | 4 | 2.0s |
| IRR | scenegraphAnim.irr | 22.7 KB | 272 | 2 | 2 | 2.0s |
| M3D | suzanne.m3d | 11.4 KB | 968 | 1 | 1 | 1.9s |
| SLDPRT | top-piece.SLDPRT | 86.8 KB | 864 | 12 | 1 | 2.0s |
| SLDASM | top-piece.SLDASM | 55.1 KB | 1,302 | 26 | 1 | 1.9s |
| SLDDRW | top-piece.SLDDRW | 96.6 KB | 1,302 | 26 | 1 | 2.1s |
| RBXM | parts-1000.rbxm | 4.2 KB | 12,000 | 1,000 | 1 | 2.4s |
| RBXL | miners-haven.rbxl | 7.6 MB | 1,355,320 | 40,114 | 1,017 | 5.4s |
What the sample set did not cover
Listed rather than quietly omitted, because a test suite that only reports its passes is not evidence of anything.
| Format | Sample | What happened |
|---|---|---|
| NDO | none found | The only Nendo file published anywhere is Assimp's deliberately malformed one. |
Where the samples came from
What this does and does not prove
It proves the readers work on files somebody else wrote, in a browser, on the published build. It does not prove every file of a given format will read: formats drift, exporters disagree, and FBX in particular is a moving target. Nor does a triangle count prove the geometry is right, which is a separate question and needs a picture: for the trickier readers that check is described on the blog.
If a file of yours fails, that is worth knowing about, and the error the page gives you is written to say what it actually found rather than to be reassuring. You can also try it yourself: the viewer and converter run entirely on your machine, so there is nothing to upload and nothing to sign up for.