GLB Optimizer
Make a GLB or glTF file smaller and cheaper to render. Drop one in and pick what to do: strip data nothing references, weld and simplify the geometry, merge meshes to cut draw calls, resize and re-encode textures, and compress the whole thing with Meshopt. You get a size figure after every step, a preview of the result before you commit, and nothing is uploaded. Optimizing and previewing is free; downloading the result is part of the Standard and Pro plans.
Ship a fraction of the bytes.
Strip what nothing references, weld and simplify the geometry, re-encode the textures, then pack the lot with Meshopt. You get a size figure after every step and a preview of the result before you commit to it.
84% smaller. Our sample character with 10 clips baked in.
Meshopt, quantize, and why there's no Draco here
Meshopt (EXT_meshopt_compression) is the default and the right choice for anything running in a browser. It reaches sizes comparable to Draco and decodes several times faster, which matters because decoding happens while your player is staring at a loading screen. three.js, Babylon.js and PlayCanvas all read it, and the decoder is small enough to be an afterthought.
Quantize needs no extension at all. It stores positions, normals and UVs in smaller number types, which every glTF loader reads without any decoder. The saving is more modest, but the file stays plain glTF, which is the safest thing to hand to a pipeline you don't control.
Draco files open here fine, so you can decompress one or switch it to Meshopt. Writing Draco is a different matter, and this tool doesn't. The only Draco encoder that runs in a browser is an asm.js build that takes minutes to even initialise, and the maintained packages ship Node-only builds. Shipping a button that freezes your tab would be worse than not having it. If you specifically need Draco output, the glTF-Transform CLI does it in one command on your machine:
npx @gltf-transform/cli draco input.glb output.glbWhat each step actually does
Remove unused data runs prune and dedup. Exporters routinely leave behind materials nothing uses, duplicate textures under two names, and empty nodes. On a file that has been through two or three tools this alone often takes a noticeable slice off, and it can't change how the model looks.
Weld vertices merges vertices that share a position and normal, converting a triangle soup into an indexed mesh. Most exporters already do this; the ones that don't leave you paying for three copies of every shared corner.
Join meshes by material is the draw call fix. If your model is two hundred separate objects that all use one material, the GPU is doing two hundred things instead of one. Joining them flattens the hierarchy, which is why it's off by default: if your game moves individual parts, or the model is rigged, you need that hierarchy.
Simplify geometry decimates the mesh with the Meshopt simplifier, targeting the triangle percentage you set. It's the right lever for scanned or CAD models that arrive with hundreds of thousands of triangles nobody asked for. Below about 40% it starts to show on organic shapes, less so on hard surfaces.
Trim animation keyframes resamples animation tracks and drops keyframes that sit on a straight line between their neighbours. On a clip exported at 60fps from a tool that baked every frame, this can be most of the file.
Textures resizes and re-encodes. WebP is roughly a third the size of the equivalent PNG and every current browser reads it. Capping at 1024 is usually invisible on a game model and is often the single biggest download win available.
Download size is not the same as memory
Compression shrinks the file. It does nothing for the video memory the textures take once they're uploaded, because JPEG, PNG and WebP all get expanded to raw pixels on the GPU. A 2048×2048 texture is about 22 MB in VRAM whether it downloaded as 4 MB or 200 KB.
If the GLB viewer tells you texture memory is your problem rather than file size, the fix is KTX2, which stays GPU-compressed all the way into memory. The two are complementary: KTX2 for what the GPU holds, Meshopt for what the network carries.
Common questions
How do I compress a GLB file?
Drop it above, leave the defaults, and click Optimize. The defaults clean up unused data, weld vertices and apply Meshopt compression, which is the safe combination for a web game. The per-step list shows where the saving came from.
How much smaller will my file get?
It depends entirely on what's in it. A mesh-heavy model with no compression often drops 60 to 80 percent with Meshopt. A file that's mostly PNG textures barely moves until you convert those to WebP. A file that's mostly animation data responds to keyframe trimming and nothing else. The step breakdown tells you which case you're in.
Does optimizing damage the model?
Removing unused data, welding, keyframe trimming and Meshopt compression are all lossless in appearance. Simplification is not: it removes triangles, and that's visible at aggressive settings. Texture resizing and JPEG conversion are lossy too. The preview shows the actual output so you can look before downloading.
Will Unity or Godot open the result?
Meshopt support depends on the importer and its version, so if the file has to go into an engine rather than a browser, pick Quantize, which needs no extension and works everywhere. Meshopt is the better pick when the destination is a web page.
Can it open a file that's already compressed?
Yes. Draco and Meshopt compressed input both decode on load, so you can decompress a Draco file, switch it to Meshopt, or recompress with different settings.
Is my model uploaded?
No. The whole pipeline runs in a Web Worker in your browser, encoders included. Once the page has loaded it works offline.