Skip to the live analyzer
Apple Quick Look · Safari <model> · Shopify AR

Will your 3D survive the iPhone?

Drop a .glb. SpatialPack tells you exactly what breaks in Apple Quick Look, Safari’s <model> element and Shopify AR, repairs it, and hands the file back a fraction of the size — with the renders that show what that cost.

DamagedHelmet.glb · web-mobile preset
3.60 MB0.37 MB89.6% smaller
  • orbit-45-65 view of the optimized file, ΔE94 mean 1.12
  • front view of the optimized file, ΔE94 mean 1.01
  • back view of the optimized file, ΔE94 mean 0.65
  • left view of the optimized file, ΔE94 mean 1.01
  • top view of the optimized file, ΔE94 mean 0.88
  • three-quarter view of the optimized file, ΔE94 mean 0.77

The optimized file, rendered from 6 angles. Worst-angle colour shift ΔE94 1.12 — our gate for this cohort fails at 3. See the whole run →

AR‑ready AI models
64/64
readiness warnings cleared
25/25
median size cut, gzipped
81%
best free tool (gltfpack -tc)
68%
DamagedHelmet.glb
3.60 MB·15,452 tris
as supplied · before the pass
Try a sample

Every surface we verify against

  • Apple Quick LookUSDZ on iOS
  • Safari <model>HTML 3D element
  • Shopify ARproduct viewers
  • Khronos glTF2.0 + extensions
  • Pixar USDround-trip
  • GitHub ActionsCI gate
Live demo

What the check actually tells you.

Every sample is a license-verified Khronos reference model. Switch tabs to swap the model and the readout in lockstep — the same verdict, budgets and delivery numbers you’d get from spatialpack analyze on your own file.

DamagedHelmet.glb
3.60 MB·15,452 tris
drag · scroll · double-tap to resetdownload source ↓
spatialpack analyzeDamagedHelmet.glb
core@0.1.0
web-mobile preset
89.6%smaller(3.60 MB381.7 KB)
saves 3.23 MB per request
triangles
15,452
draw calls
1
predicted frame
10.60 ms
predicted GPU mem
11.55 MB
texture pipeline
webp + meshopt
cohort
textured · medium-poly
extensions
KHR_materials_unlit
license
CC-BY 4.0
analyze: passed·7/7 conformance · 0 USDZ warnings
The reference asset every WebGL engine ships against. Heavy PBR maps; ideal stress test for texture pipelines.
Surface

Verify first. Fix second. Ship third.

Everything below ships in the same CLI, embeds in the same GitHub Action, and exports via the same MCP server — so the check that runs in your browser is the check that runs in code review. No picking and choosing, no proprietary lock-in.

Verify

One verdict — ready / warnings / not-ready — for Apple Quick Look, Safari <model> and Shopify AR, plus triangle, draw-call and GPU-memory budgets. Free, no sign-up.

Run a free check →

Apple-AR parity

14 Apple-AR breaking checks that usdchecker misses — metersPerUnit, progressive JPEG, palette PNG, iridescence drop-on-export.

Validator catalog →

Fix, then deliver

autocorrect repairs the blockers and re-scores; web-mobile / web-desktop / quality-max then ship it small. Median 81% gzipped cut on a 103-asset public benchmark.

See the leaderboard →

6-view visual diff

Proof the repair didn’t change how it looks. ΔE94, SSIM, per-view tiles — runs on your machine via the CLI and on your own runner via the GitHub Action, and threshold-fails the build.

How the gate works →

Texture dedup

Content-hashed image dedup across glTF / USD bundles. The single fastest path to a “why is my catalog 400 MB” fix.

Read the spec →

Embedding search

Drop one asset, find the 5 closest in your library. CLIP-style retrieval over geometry + textures, no proprietary index.

Try it on a sample →

AI-3D readiness bench

64 models from 8 open generator families — TRELLIS, Hunyuan3D-2, TripoSR, SF3D and more — scored before and after one autocorrect pass. Every asset published.

See the corpus →

MCP server

Analyze, optimize and score assets from inside your agent. Published to npm as @spatialpack/mcp and listed in the official MCP registry.

Wire it up →

Quick-View gallery

Your analyzed-asset history with filters, favorites and saved views. This one is a Pro surface — signing in with a Pro plan is required to open it.

Open the gallery — Pro →
Evidence

Once it passes, delivery is the easy part.

Median 81% gzipped-size reduction across a 103-asset public benchmark. The strongest free tool on that corpus is gltfpack -cc -tc, which compresses textures to KTX2/BasisU and lands at 68% — SpatialPack is smaller on 80 of the 103 assets, larger on 21, level on 2, under one identical render harness with every loss published.

gltf-transform at its defaults scores 21% on the same corpus, but its texture step re-encodes each image in the original format instead of compressing it — so that figure is a mesh-compression comparison, not a texture one, and we do not lead with it. Every tool, configuration and per-asset result at /benchmark.

Rows below are the largest per-asset cuts in that same Khronos corpus, measured as raw GLB bytes (not gzip) against the original input file — not against a rival tool. The last column is the separate figure the corpus records for each asset against an in-process gltf-transform library baseline at the same package version; negative means SpatialPack's output is the smaller of the two. Both are a different measurement from the leaderboard's gzip-vs-CLI numbers above, which is why the medians differ. Full table, both metrics explained, at /3dassetbench.

  • Avocado682 tris · 7.730.05 MB-22.1% vs gltf-transform
    99.4%vs original
  • WaterBottle4,510 tris · 8.550.06 MB-43.7% vs gltf-transform
    99.3%vs original
  • BoomBox6,036 tris · 10.120.11 MB-45.4% vs gltf-transform
    98.9%vs original
  • BarramundiFish3,864 tris · 11.910.18 MB-34.8% vs gltf-transform
    98.5%vs original
  • GlassHurricaneCandleHolder4,126 tris · 2.580.04 MB-40.5% vs gltf-transform
    98.3%vs original
  • Lantern5,394 tris · 9.120.21 MB-29.1% vs gltf-transform
    97.7%vs original
  • Corset18,324 tris · 12.870.31 MB-32.4% vs gltf-transform
    97.6%vs original
  • AntiqueCamera20,066 tris · 16.730.46 MB-31.8% vs gltf-transform
    97.3%vs original
  • AnisotropyBarnLamp10,203 tris · 7.470.21 MB-22.7% vs gltf-transform
    97.1%vs original
CI

The same check runs on every PR.

Add the CLI to your workflow; every PR that touches a .glb gets this comment with a fidelity badge from a 6-view perceptual diff. Threshold breach fails the build.

The comment below is not a mock-up: it is a real run of corpus/DamagedHelmet/DamagedHelmet.glb through the web-mobile preset, and the six thumbnails are the actual post-optimize renders the diff scored. Reproduce it with spatialpack optimize then spatialpack visual-diff --views 6.

your-store/storefront·pull request·optimize DamagedHelmet.glb
github-actionsbotcommented·just now
spatialpack@0.1.0
spatialpackreadyΔE941.12SSIM0.9687size−89.6%AR paritypassconformance7/7 pass
fileDamagedHelmet.glb · CC-BY 4.0, Khronos glTF-Sample-Assets
size3.60 MB → 0.37 MB (−89.6%)
ΔE94 mean1.12 (worst view: orbit-45-65)
SSIM min0.9687
frame est.10.6 ms (target ≤ 16.7 ms, low-end-mobile-2024)
GPU mem11.55 MB (target ≤ 64 MB)
conformance7/7 passed · 0 blockers · 0 warnings
visual diff · 6 viewsall under threshold
orbit-45-65 view of the optimized model, ΔE94 mean 1.12
orbit-45-65ΔE 1.12
front view of the optimized model, ΔE94 mean 1.01
frontΔE 1.01
back view of the optimized model, ΔE94 mean 0.65
backΔE 0.65
left view of the optimized model, ΔE94 mean 1.01
leftΔE 1.01
top view of the optimized model, ΔE94 mean 0.88
topΔE 0.88
three-quarter view of the optimized model, ΔE94 mean 0.77
three-quarterΔE 0.77

Post-optimize renders from the run above · model-viewer in headless Chromium (Playwright) · threshold ΔE94 mean ≤ 3 for this cohort.

Conformance

The failures nobody sees until an iPhone opens it.

Apple's usdchecker covers the spec. We cover the spec and the long list of silent failures that ship to a customer's iPhone anyway — each one named, explained, and fixable in one pass.

  • usdz_no_default_stageUSDZFAIL
    First archive entry isn't a .usd/.usda/.usdc — Quick Look refuses to open the file.
  • usdz_entry_compressedUSDZFAIL
    Entry uses DEFLATE; USDZ requires STORE (0). Apple's loader won't read it.
  • usdz_entry_unalignedUSDZFAIL
    Entry data isn't 64-byte aligned; required for memory-mapped reads on iOS.
  • usdz_file_size_budget_exceededARWARN
    Over Apple's ~25 MB Quick Look budget. iOS will start, but stutter on cellular.
  • usdz_meters_per_unit_not_oneUSDZWARN
    metersPerUnit ≠ 1.0 → AR scale wrong on placement. usdchecker is silent on this.
  • usdz_up_axis_not_yUSDZWARN
    Z-up stage → asset lands on its side in Quick Look. Reality Composer assumes Y-up.
  • usdz_png_palette_detectedUSDZWARN
    Palette PNG (color type 3) — Quick Look skips it silently. Convert to truecolor.
  • usdz_png_bit_depth_unsupportedUSDZWARN
    >8 bpc PNG — re-encode at 8-bit per channel; iOS caps depth here.
  • usdz_png_invalid_headerUSDZFAIL
    File is named .png but lacks the PNG signature / IHDR chunk.
  • usdz_jpeg_progressiveUSDZWARN
    Progressive JPEG (SOF2) — Quick Look prefers baseline DCT. Re-encode without progressive.
  • usdz_jpeg_invalid_headerUSDZFAIL
    JPEG missing the SOI (FF D8) start marker.
  • material_may_not_roundtrip_to_usdzARWARN
    Uses iridescence / volume / clearcoat / sheen — drops on USDZ export. Test on-device.
  • missing_texture_assetglTFFAIL
    Stage references an image that isn't in the archive. Quick Look renders white.
  • wrong_extensionglTFFAIL
    File extension misrepresents the contents.
14 of 14 checks in the catalog shown · glTF / USDZ / AR Quick Look. A single asset’s report lists only the checks that apply to it — DamagedHelmet on web-mobile reports 7. Catalog sourced from packages/core/src/usdz.ts and conformance.ts
Receipts

Certainty, not adjectives.

Readiness numbers come from the 64-asset AI-3D corpus at /ai3dbench; size numbers from the 103-asset Khronos leaderboard at /benchmark. Two different corpora answering two different questions — both published in full, per asset, losses included.

64/64
AI models made AR-ready

one autocorrect pass, 8 generator families

25/25
Initially-failing rescued

all 25 were warnings — zero were blockers

71–90%
Size cut on AI models

per-family medians, all 8 generators

81%
Median gzipped cut

103-asset public benchmark, losses published

68%
gltfpack -cc -tc, same corpus

strongest free rival, KTX2 textures — not our score

14
Apple-AR checks

beyond what usdchecker catches

Try it

Test your own .glb.

No sign-up to check, and no proprietary container: a read-only check is never stored; a hosted optimize job is stored, then deleted automatically within 7 days (see our Privacy Policy). Downloading the repaired .glb takes a free sign-in. 25 MB max in the public surface.

.glb · .gltf · 25 MB max
Drop a .glb here, or click to choose
runs the same pipeline as spatialpack optimize --preset web-mobile
or — install on CI:npm i -g @spatialpack/clinpx -y @spatialpack/cli analyze model.glb
Pricing

Free to try. Pay when you scale.

Checking is free and needs no account. To take the repaired GLB you sign in — also free, with the monthly allowance below. Upgrade when you’re shipping a catalog and need every preset, unlimited jobs, and the advanced passes.

See full comparison
[01] Free
$0forever

Check any asset and take the repaired file. CLI + MCP server included.

  • 3 optimized GLB downloads every month
  • Unlimited analyze + visual check
  • web-mobile preset
  • CLI + MCP server
Use the analyzer
[02] Pro
$39/ month

For teams shipping a catalog. Unlimited optimize jobs, every preset, and the advanced passes the optimizer runs in production.

  • Unlimited optimize + downloads once the subscription starts
  • web-desktop + quality-max presets
  • Cohort-recipe auto-tune
  • LOD bundles + saliency decimation
Start a 14-day trial
Most popular
Two free offers, two separate counts
Catalog Rescue
first 3 models of the batch you send, freedone for you · does not renew
Free plan
3 optimized GLB downloads every monthyou run it · back to 3 on the 1st

Separate counts — using one does not spend the other.

[05] · GET STARTED

Find out in 30 seconds.

Drop a real asset. We’ll tell you whether it survives Apple Quick Look and the web, repair what doesn’t with the same pipeline that runs in CI, and give you a shareable report — no account needed. Sign in free to download the repaired .glb.

No sign-up to check · 25 MB max · honest verdict

Have a whole catalog? Catalog Rescue — send 3 product models and get commerce-ready GLB + USDZ back within 48 hours, Quick Look verified, free and with no card. After that, $15 per model after the free 3, 10-model minimum, $12 per model at 25 or more.