| file | hero.glb · main → hero-ar |
| size | 3.60 MB → 0.44 MB (−87.7%) |
| ΔE94 max | 1.4 (worst view: front-elev-30°) |
| SSIM min | 0.997 |
| frame est. | 10.6 ms (target ≤ 16.7 ms) |
| GPU mem | 11.55 MB (target ≤ 64 MB) |
| conformance | 12/14 passed · 2 warns (usdz_meters_per_unit_not_one, usdz_jpeg_progressive) |
The glTF pipeline
your CI actually trusts.
Real-time validation, deterministic optimization, and a 6-view perceptual quality gate. Same pipeline locally and on every PR — shipping a 3D regression to production becomes the path of more resistance.
Powers the standards your runtime already speaks
- Shopify 3Dproduct viewers
- Apple USDZQuick Look + AR
- Khronos glTF2.0 + extensions
- Pixar USDround-trip
- GitHub ActionsCI gate
- VS Code8 commands
See the analyzer on real assets.
Every sample is a license-verified Khronos reference model. Switch tabs to swap the model and the readout in lockstep — no special-case path, the same pipeline you'd get from spatialpack analyze.
- 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
One pipeline, six superpowers.
Everything below ships in the same CLI, embeds in the same GitHub Action, and exports via the same MCP server. No picking and choosing — and no proprietary lock-in.
Analyze
Triangle counts, draw calls, predicted frame, predicted GPU memory, extension audit — in milliseconds, deterministic.
Optimize
web-mobile / web-desktop / quality-max presets. Meshopt + WebP + KTX2. Average 65% reduction across the bench, with ΔE94 gating.
6-view visual diff
Same perceptual gate runs locally and on every PR. ΔE94, SSIM, per-view tiles, threshold-fails the build before a regression ships.
USDZ parity
12+ Apple-AR breaking checks that usdchecker misses — metersPerUnit, progressive JPEG, palette PNG, iridescence drop-on-export.
Texture dedup
Content-hashed image dedup across glTF / USD bundles. The single fastest path to a “why is my catalog 400 MB” fix.
Embedding search
Drop one asset, find the 5 closest in your library. CLIP-style retrieval over geometry + textures, no proprietary index.
Quick-View gallery
Browse the bench corpus (free) or your own analyzed-asset history (Pro). Filters, favorites, and saved views in one click.
Top reductions on 3DAssetBench.
54 license-verified Khronos sample assets, web-mobile preset. Average reduction across the corpus: 65.0%. Regressions included. Full table at /3dassetbench.
- GlassHurricaneCandleHolder4,920 tris · 2.58 → 0.11 MB4,9202.58 → 0.11 MB−95.8%
- BoomBox6,036 tris · 10.12 → 0.55 MB6,03610.12 → 0.55 MB−94.6%
- WaterBottle4,510 tris · 8.55 → 0.57 MB4,5108.55 → 0.57 MB−93.3%
- MaterialsVariantsShoe13,780 tris · 7.47 → 0.57 MB13,7807.47 → 0.57 MB−92.4%
- MosquitoInAmber4,096 tris · 23.11 → 2.32 MB4,09623.11 → 2.32 MB−89.9%
- BarramundiFish4,068 tris · 11.91 → 1.25 MB4,06811.91 → 1.25 MB−89.5%
- Lantern5,394 tris · 9.12 → 1.07 MB5,3949.12 → 1.07 MB−88.2%
- ABeautifulGame96,084 tris · 40.99 → 3.91 MB96,08440.99 → 3.91 MB−88.0%
- DamagedHelmet15,452 tris · 3.60 → 0.44 MB15,4523.60 → 0.44 MB−87.7%
The same pipeline runs on every PR.
Install the GitHub Action; every PR that touches a .glb gets this comment with a fidelity badge from a 6-view perceptual diff. Threshold breach fails the build.
Catches what usdchecker misses.
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.
- USDZFAILFirst archive entry isn't a .usd/.usda/.usdc — Quick Look refuses to open the file.
usdz_no_default_stageUSDZFAIL - USDZFAILEntry uses DEFLATE; USDZ requires STORE (0). Apple's loader won't read it.
usdz_entry_compressedUSDZFAIL - USDZFAILEntry data isn't 64-byte aligned; required for memory-mapped reads on iOS.
usdz_entry_unalignedUSDZFAIL - ARWARNOver Apple's ~25 MB Quick Look budget. iOS will start, but stutter on cellular.
usdz_file_size_budget_exceededARWARN - USDZWARNmetersPerUnit ≠ 1.0 → AR scale wrong on placement. usdchecker is silent on this.
usdz_meters_per_unit_not_oneUSDZWARN - USDZWARNZ-up stage → asset lands on its side in Quick Look. Reality Composer assumes Y-up.
usdz_up_axis_not_yUSDZWARN - USDZWARNPalette PNG (color type 3) — Quick Look skips it silently. Convert to truecolor.
usdz_png_palette_detectedUSDZWARN - USDZWARN>8 bpc PNG — re-encode at 8-bit per channel; iOS caps depth here.
usdz_png_bit_depth_unsupportedUSDZWARN - USDZFAILFile is named .png but lacks the PNG signature / IHDR chunk.
usdz_png_invalid_headerUSDZFAIL - USDZWARNProgressive JPEG (SOF2) — Quick Look prefers baseline DCT. Re-encode without progressive.
usdz_jpeg_progressiveUSDZWARN - USDZFAILJPEG missing the SOI (FF D8) start marker.
usdz_jpeg_invalid_headerUSDZFAIL - ARWARNUses iridescence / volume / clearcoat / sheen — drops on USDZ export. Test on-device.
material_may_not_roundtrip_to_usdzARWARN - glTFFAILStage references an image that isn't in the archive. Quick Look renders white.
missing_texture_assetglTFFAIL - glTFFAILFile extension misrepresents the contents.
wrong_extensionglTFFAIL
packages/core/src/usdz.ts and conformance.tsNumbers, not adjectives.
- 97
- Specs shipped
- 2,000+
- Tests passing
- 65%
- Average reduction
- 8
- VS Code commands
- 50+
- SDK methods
- 14
- Conformance checks
one per change, traceable
Vitest + Playwright + visual diff
web-mobile preset, 54-asset bench
analyze, optimize, diff, dedup, …
TypeScript + MCP server
beyond what usdchecker catches
Run this on your own .glb.
No sign-up, no proprietary container. We process the file in-memory, hand you back a downloadable .glb and a shareable report URL. 25 MB max in the public surface.
npm i -g @spatialpack/cliuses: spatialpack/spatialpack-action@v0Free CLI. Paid CI.
The optimizer, validator, web analyzer, and MCP server are MIT-licensed and free. We charge for multi-tenant CI, premium presets, and the kind of support a team actually needs.
Everything an indie dev needs to ship one polished AR product.
- CLI + MCP server + web analyzer
- web-mobile preset
- Public-repo GitHub Action
- 14-point conformance + USDZ checks
For teams shipping a catalog. Quality presets, private CI, similars.
- web-desktop + quality-max presets
- Private-repo GitHub Action
- Embedding search across your library
- Priority support + roadmap input
Start optimizing in 30 seconds.
Drop one of your real assets. We'll analyze it, optimize it with the same pipeline that runs in CI, and hand you a downloadable .glb plus a shareable report.