Safari 27 ships the model element: when a native 3D embed is worth it
Safari 27 lets you embed a 3D model with a plain HTML tag, no JavaScript required. Here is what changed, which browsers actually support it, and the three-layer framework we use to decide whether 3D helps a page or quietly destroys its Core Web Vitals.
Safari 27 ships the model element: when a native 3D embed is worth it
Safari 27 (September 17, 2026) brings the <model> element to iOS, iPadOS and macOS: for the first time you can drop a 3D model into a page with a plain HTML tag — no JavaScript, the same way you drop in a video. But there is a catch: it only works in Safari, the spec is still a draft, and a badly packaged 3D asset quietly destroys exactly the metrics that bring you traffic in the first place. The real question in 2026 isn't "3D or no 3D" — it's "which layer of the page does the 3D live in, and what do everyone else's browsers see?"
Until now, putting 3D on a page meant loading a library (Three.js, or Google's <model-viewer> web component), wiring up a canvas, managing the scene by hand, and hoping you didn't block the main thread. Apple has shipped the element on visionOS for a year and is now spreading it across its platform: you declare <model src="chair.usdz">, or nest <source> tags for USDZ and GLB, and the browser owns rendering, lighting and interaction.
What actually changed (and what didn't)
The model element joins img, video and audio as replaced content: it occupies a slot in the layout, obeys CSS, and exposes a JavaScript API (await model.ready, animation playback, stagemode="orbit" for the turntable spin). Safari 27 also lets you apply dynamic-range-limit to control HDR tone mapping on 3D content.
What didn't change: browsers without support ignore the tag and render whatever is inside — the same fallback pattern as <video>:
<model stagemode="orbit" alt="Brown leather office chair"> <source src="chair.usdz" type="model/vnd.usdz+zip"> <source src="chair.glb" type="model/gltf-binary"> <img src="chair-preview.jpg" alt="Brown leather office chair"> </model>
Chrome and Firefox don't implement it. The specification lives in the W3C Immersive Web Community Group with no Baseline status. In practice: your Chrome visitors see the fallback image, your iPhone visitors get the interactive 3D. That is pure progressive enhancement — and it's also the trap, because the temptation is to treat the 3D as the main experience when today it's a layer over part of your traffic.
The business case: the numbers that exist
The commercial appeal isn't new. 3D pipeline vendors report that Amazon listings with interactive 3D convert around 9% higher than the same listings in 2D, that organic shopping traffic sees roughly 6% higher CTR with 3D content, and that product pages with interactive 3D produce 5–15% conversion lifts across retail verticals (data from VNTANA — treat it as vendor-reported, not audited studies). We've seen the same pattern with appropriate skepticism in client work: 3D pays off when the product is bought with the eyes — furniture, apparel, equipment — and barely moves the needle when the decision is price or compatibility.
The performance tax: why badly packaged 3D is expensive
This is where almost everyone gets it wrong. An uncompressed GLB ships tens of megabytes, 4096px textures, and spare triangles. Shopify recommends under 4 MB per model and treats 15 MB as an absolute ceiling; the practical budget sits around 100,000 triangles and 2048px textures. For perspective: on real 4G, 4 MB is roughly 1–2 seconds of download before the viewer even starts decoding — and decoding plus texture upload to the GPU competes with the main thread exactly when the user is trying to scroll.
The video parallel is direct: in our video and LCP work the pattern repeats — heavy media never belongs in the critical load path. The same applies here, and it's why our field-data LCP/INP audits keep showing the same story: whatever you download early, you pay for later.
The framework: three layers, not one decision
After reviewing real cases and the state of the ecosystem, this is the matrix we use:
| Layer | When to use it | Cost | Coverage |
|---|---|---|---|
| Static image + zoom + AR Quick Look | The default. If you can't justify layer 2, stay here | Almost zero | 100% |
<model-viewer> (Google's web component) | When you want 3D in every browser and accept ~60–100 KB of JS plus the GLB | Medium | Total |
Native <model> element | As progressive enhancement on top of one of the above, or on products where you already invest in 3D assets | Just the GLB (in Safari) | Safari only, until Chrome and Firefox follow |
Three rules we don't negotiate:
- 3D never blocks LCP. The GLB loads on demand (IntersectionObserver or the equivalent lazy trigger in whichever layer you choose), after first paint. The poster or the image always comes first.
- Hard budget per asset. If a model exceeds 4 MB or 100k triangles, send it back to the artist before you touch the code. The optimization pipeline (Draco/Meshopt for geometry, KTX2 for textures) is part of the deliverable, not an add-on.
- Measure per layer. "3D converts 9% better" tells you nothing if 92% of your traffic on Chrome never sees it. Instrument viewer interaction per browser before you declare victory.
Where to start today
If you already own 3D assets (product CAD, scans, Blender models), the <model> element is the cheapest layer you can add: one tag, one fallback, zero JS. If you don't own them, don't start here — the model production pipeline is the actual job, and a well-shot photo with zoom beats a slow 3D viewer in most catalogs.
What I would do today: get the markup right with the correct fallback pattern. When Chrome and Firefox join — and the spec is already an advanced draft — the change will be swapping layers, not rewriting the product page. That's the real savings of the native tag: the day 3D goes Baseline, your markup is already ready.
You don't have to wait to see native 3D in action: open any page with <model> on an iPhone running Safari 27. And if what interests you is the QA side of this same Safari release, Safari's MCP server for AI agents lets you test this kind of rendering without leaving your editor.
FAQ
Does the model element replace model-viewer? Not yet. model-viewer remains the only path to 3D in Chrome and Firefox, and it adds AR on Android. The native element is the top layer of the stack, not the replacement: the correct sequence is image first, then model-viewer or native model depending on the browser — never the model tag as the only path.
Can native 3D hurt SEO or Core Web Vitals? Only if you put it in the initial load path. A 10 MB GLB downloaded eagerly competes with LCP and with the main thread during decoding. Loaded on demand, outside the first render, it doesn't touch LCP — and late interaction doesn't hurt INP either if the viewer initializes during idle time.
Which formats does the model element accept? USDZ (model/vnd.usdz+zip), Apple's AR format, and GLB (model/gltf-binary), the de facto glTF standard for the web. The multi-<source> pattern lets the browser choose, with <img> last as the universal fallback.
Frequently Asked Questions
What is the HTML model element?
It is a new tag that embeds a 3D model in the page the same way <video> embeds video: the browser renders the 3D content with no JavaScript and no library like Three.js. You declare it with <model src="product.glb"> or with nested <source> elements (USDZ, GLB) plus an <img> fallback for browsers that do not support it.
Do Chrome and Firefox support the model element?
No. As of October 2026 the model element ships only in Safari — visionOS since Safari 26, and iOS, iPadOS and macOS since Safari 27. The specification is still a W3C Immersive Web Community Group draft, so native 3D behaves as progressive enhancement today: other browsers render whatever fallback content sits inside the tag.
How large should a web 3D model file be?
As a practical target, under 4 MB per GLB (Shopify's own recommendation), with a 15 MB hard ceiling the platform already considers excessive, textures capped at 2048px, and roughly 100,000 triangles. An uncompressed GLB can weigh tens of megabytes and ruin the experience on a real 4G connection.



