Stop guessing what "web-ready" means
Every 3D model that ends up on a website has to fit inside a budget, but almost nobody writes the budget down. The result is the familiar loop: export, upload, watch a phone choke, export again with slightly smaller textures, repeat. This tool inverts that. You choose where the model is going — desktop, mobile or WebXR — and it tells you, before you change anything, exactly which limits you are over and by how much.
The budgets, in the open
| Metric | Desktop | Mobile | WebXR |
|---|---|---|---|
| File size | 15 MB | 5 MB | 3 MB |
| Triangles | 1,500,000 | 300,000 | 150,000 |
| Draw calls | 200 | 50 | 30 |
| Texture memory | 512 MB | 128 MB | 96 MB |
| Max texture size | 4096 | 2048 | 2048 |
| Materials | 100 | 25 | 15 |
WebXR is the harshest column on purpose. A headset renders the whole scene twice per frame, at high resolution, against a 72–90 Hz deadline. Half the mobile triangle budget is not pessimism, it is arithmetic.
Texture memory is the metric people miss
A 4096 × 4096 texture is about 67 MB of RGBA on the GPU, and roughly 89 MB once the mip chain exists — from a file that may have shipped as a 2 MB JPEG. Eight of those and a mid-range phone runs out of memory no matter how small the GLB was. That is why this tool grades GPU texture memory separately from file size, and why halving a texture from 2048 to 1024 saves four times more memory than it saves bytes.
What the plan actually does
Up to five actions, each recommended only when the analysis found a reason for it, each with that reason written out:
- Clean —
dedup,prune,weld. Always worth it, always lossless. - Simplify — quadric decimation down to the triangle budget, when you are over it.
- Batch —
instance,palette,join, to collapse draw calls and materials. - Textures — resize to a computed target and re-encode as WebP.
- Compress — quantisation plus Draco or Meshopt.
The order is fixed because it matters: welding before simplification, instancing before joining, encoding last. Toggle any action off if you disagree.
Honest limits
Meeting every budget does not guarantee 60 fps. Overdraw, transparency and shader cost are invisible to a static file. And join only merges meshes that share a material. Everything runs locally — your assets never leave the browser.
Tiny Online Tools







