Why Your 3D Model Won't Open on iPhone — and the No-Install GLB → USDZ Fix
If you have ever sent a .glb file to someone with an iPhone and watched Safari shrug, you already know the wall: Apple's AR ecosystem does not speak glTF. iOS AR Quick Look, Safari previews, and Vision Pro all want one format: USDZ.
This is the story of that wall, why the usual tools don't help half of us, and how I ended up shipping a browser-only converter at renderivo.com/convert (first conversion free, no account) — with the technical details of what actually happens inside the conversion.
The wall, precisely
-
glTF/GLB is the web standard. Three.js,
<model-viewer>, Shopify 3D, WebXR — they all eat GLB happily. - USDZ is Apple's AR format — a zip archive containing USDA (text scene description) plus textures. AR Quick Look on iOS literally refuses anything else for AR previews.
- So any pipeline that touches an iPhone — "scan this QR code to see the product in your living room" — needs a USDZ sitting at a URL. On Android the same link works with GLB (Scene Viewer). On iPhone: USDZ or nothing.
Why the usual answers don't help
The internet's standard advice for GLB → USDZ is:
- Apple's Reality Converter — macOS only. If you are on Windows or Linux, this tool does not exist for you.
- Blender — can import glTF, and with the right USD plugin can export USD. Expect an afternoon of plugin archaeology, and check your materials afterwards; the glTF PBR → USD conversion path is exactly where things silently break.
- Cloud converters — upload your model to somebody else's server. Fine for a sketchfab freebie; a different conversation when the model is a client deliverable under NDA.
If you have a Mac, open Reality Converter, done, happy for you. The rest of this post is for everyone else.
What a conversion actually has to do
I shipped a converter that runs the whole pipeline in the browser (the first post covers the internals). The short version:
-
Read the GLB with
@gltf-transform(WebAssembly, in-browser — the file never leaves the machine). -
Clean the geometry:
weld()merges duplicate vertices,dedup()removes duplicated accessors,prune()strips unused nodes and extensions,resample()compresses animation keyframes. This is where a surprising amount of dead weight lives in marketplace assets. -
Watch the textures. Two things bit me here and are worth knowing even if you never touch my tool:
- Never re-encode a texture into a different container than its declared mime type (WebP textures declared as WebP must stay WebP bytes, or viewers start guessing).
- Some Chromium builds default canvas WebP encoding to lossless — a "downsized" texture can come out 3× bigger than the original. Always pass an explicit
quality, and keep the original bytes if the re-encode came out larger.
-
Emit USDZ with three.js
USDZExporter— it builds the USDA text scene, rasterizes textures, and zips everything into a valid.usdz.
The result: one file in, two files out — the AR-ready USDZ, plus the cleaned-up GLB for the web side — with before/after sizes shown so you know what actually happened.
When you actually need this
-
Custom storefronts and headless commerce wiring up
<model-viewer>yourself: the GLB goes insrc, the USDZ goes inios-src, and Android/iOS AR both work. - Product demos via link or QR — USDZ hosted anywhere opens straight into AR Quick Look on any modern iPhone.
- Vision Pro content previews — same USDZ surface.
- Client handoffs — "we need the web version and the Apple version" stops meaning installing a DCC tool.
The honest limits
Draco-compressed inputs are not supported in the current version (re-export without Draco). Morph targets don't survive the USDZ hop yet. And a 150 MB monster GLB will still make your browser fan spin — the ceiling is your RAM, not a queue.
The converter is at renderivo.com/convert — drop a file, watch it convert, download both formats. The first conversion is free and no account touches it; a one-time license unlocks unlimited conversions with no subscription.
Top comments (0)