Build1 publisher3 min readPublished
The audit that mattered was a per-URL byte share, and it pointed at one asset instead of the usual list of image, CSS and JavaScript fixes. The result is lab-measured, and the author says his LCP target is still missed.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
Component-level lazy loading is where this kind of work usually fails, and the author names the failure directly: code-splitting the React component is not enough if another import pulls the viewer runtime into the initial route [12]. A static import is resolved when the bundle is built, not when the component renders, so one sibling module importing the viewer package puts the runtime in the initial chunk no matter how carefully the stage is deferred [12]. The fix was deletion. Direct `@google/model-viewer` imports came out of the homepage and generation-output components [13], and a shared loader now injects a self-hosted `/vendor/model-viewer.min.js` as a module script only when a 3D component mounts [14].
That loader is the best-engineered part of the writeup. It returns early if `customElements.get("model-viewer")` is already defined, caches its promise in a module-level variable, reuses an existing script element rather than appending a second one, and resolves through `customElements.whenDefined` so callers wait for the element definition and not merely for the network [15]. The stage import uses the same trick, a module-level `stagePromise` assigned once, so repeated taps and re-renders reuse one in-flight import [9]. Two dedupe layers, and one loading contract for every 3D surface [16].
The first screen is a load-path decision rather than an asset decision. The mobile cover is a 19 KB AVIF served at 768 by 576 with `fetchPriority="high"` and `loading="eager"` [10], sharing the interactive stage's 4:3 geometry so the swap does not move surrounding content [8]. That is a deliberate election of the LCP candidate: the cheapest element on the page gets priority, and the slot that used to cost 7,833,440 bytes now costs roughly 410 times less [24].
The headline result travels less well than the method. It rests on three mobile Lighthouse runs, labelled by the author as lab-tested rather than field data, with INP unavailable because Chrome UX Report did not hold enough real-user data for the site [17][18]. He also says the final LCP missed his stricter target of under 2 seconds, and calls the work a large improvement rather than finished [19]. So the part that transfers is the share arithmetic, not the 370 KB, and it transfers where one asset dominates and the hero is genuinely optional. At 40 percent share the same audit produces a different decision, and nobody has ever tuned 30 KB of CSS into a 7.8 MB win [7].
One gap remains in the account. By the stated totals, deferring the GLB still leaves about 1.27 MB of initial resources, so reaching 370 KB means roughly another 900 KB left the initial path [26]. The author says the walkable Three.js world was heavier still than the GLB [20], and the published account breaks off before showing how that one was handled. The reusable output here is the measurement order: get the byte share per URL first, then decide whether you are tuning assets or redesigning the load path [21].
Ranked by verification strength, evidence, and original report placement.
The model was a 7,833,440-byte GLB displayed in the hero of World Models Watch, served from /generation-models/anisotropy-barn-lamp.glb.
Every mobile visitor downloaded the model before deciding whether to interact with it.
The author reports cutting the 3D homepage from 9.1 MB to 370 KB without removing the 3D; the final page still has the interactive model and simply does not load it until the visitor asks for it.
The first audit could have led to a long list of generic fixes: compress images, reduce JavaScript, minify CSS, add caching.
The author states that optimizing several 30 KB assets while continuing to load a 7.8 MB model would not materially change the experience.
On mobile the homepage now starts with a 19 KB AVIF cover that has the same 4:3 geometry as the interactive stage, so switching from one to the other does not move surrounding content.
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Readable code, uncheckable numbers
The two listings are the sturdiest thing in this reporting. A reader can inspect the module-scope promise and the runtime injector and decide for themselves whether they do what the author says. The byte figures allow no such test: 9.1 MB, 7,833,440 bytes, 370 KB and 83.7% all come from one developer's Lighthouse session, and they do not quite reconcile with each other, since that byte count is 86.1% of 9.1 MB rather than 83.7%.
One site, its owner reporting
Adoption amounts to a single homepage described by the person who changed it. World Models Watch now gates the model behind a tap and the Three.js world lives on its own route, and there is no second site, no team, and no user reaction anywhere in this reporting. The absence of Chrome UX Report data means not even the author's own visitors are numerous enough to register.
Flattering framing, disclosed limits
The headline pairs a 24-fold byte cut with 'without removing the 3D', which is the most generous accurate framing on offer: the model survives, but a mobile visitor now has to ask for it. Working against the overstatement, the author volunteers the two facts that would embarrass him, namely that the numbers are lab-only and that his own sub-2-second LCP target is still missed. What is left is a scope problem rather than an accuracy problem.
Case study for the author's own product
The site being tuned is the author's own, complete with an image-to-3D generator, ads, auth and a task centre in the root layout, so the write-up doubles as a shop window for it. dev.to publishes as submitted, with no editor asking to see the Lighthouse output. None of that implies invented figures; it does mean nothing sits between the figure and the reader.
Mechanism solid, magnitude single-sourced
Our confidence splits along the same seam the material does. High on how the deferral works, because the deferred import and the runtime loader are reproduced in full and behave as described. Low on how much it saved, because one unrepeatable lab session supplies every headline figure and the single internal check available lands 2.4 points off.
build
The INP bill goes to the wrong department: ad script, not RAM1 publisher
build
canvas.toBlob hands you a PNG and calls it WebP: check blob.type, not the user agent1 publisher
build
Tailwind v4 moves your tokens into CSS. The token name is now the API.1 publisher
build
244 kB, 500 a minute, 5 percent: three ceilings that fail for the same reason1 publisher
Publishers with included, body-backed reporting in this cluster.
1 article · September 7, 2026