How to Deploy Gaussian Splatting to the Web: Complete Guide
Updated Mar 2026
You have trained a Gaussian Splatting scene — now you want to share it on the web. But a raw PLY file is 500 MB, most web viewers choke on files over 50 MB, and your visitors will not wait 30 seconds for a scene to load on mobile. This guide covers the complete pipeline from raw PLY to a fast-loading, embeddable 3DGS experience: choosing the right compressed format, optimizing file size, selecting a viewer, hosting your files, and embedding on your website. Every recommendation is based on real performance data from deploying 3DGS scenes in production.
Tools used in this guide
Step-by-Step Guide
- 1
Step 1 — Understand Your File Size Budget
The first question is: how large can your compressed scene be? This depends on your audience. For broadband desktop users, 50-100 MB is acceptable (loads in 5-15 seconds). For mobile users on 4G, keep it under 20 MB (3-5 seconds). For embedding on pages that also load other content, 10-30 MB is ideal. A raw 3DGS PLY file with 1 million Gaussians and SH degree 3 is about 236 MB. After compression to SPZ, it becomes ~24 MB. After compression to SOG, it becomes ~12 MB. Both are within the mobile budget. If your scene has more than 2 million Gaussians, you will need to reduce the count before deploying.
- 2
Step 2 — Choose a Compressed Format
For web delivery, you have three options. SPZ (Niantic): 90% compression, preserves all spherical harmonics, widest viewer support, glTF ecosystem alignment. Best all-around choice. SOG (PlayCanvas): 95% compression, Morton spatial ordering for faster decode, but fewer viewers support it. Best for maximum compression. SPLAT (antimatter15): 85% compression, drops spherical harmonics (flat colors only), broadest legacy viewer support. Best if you need compatibility with older viewers. Use our format converter (polyvia3d.com) to convert between any of these formats. Our recommendation: use SPZ unless you need SOG's extra compression or SPLAT's legacy compatibility.
- 3
Step 3 — Compress Your PLY File
Upload your PLY file to our PLY to SPZ compressor (polyvia3d.com/splat-compress/ply). The compression runs entirely in your browser — your file never leaves your device. For most scenes, default settings work well. After compression, check the output file size. If it exceeds your budget from Step 1, consider: (1) reducing the Gaussian count using our LOD tool, (2) using SOG format instead of SPZ for more compression, or (3) cropping unnecessary parts of the scene in Blender before compressing. Use our File Inspector (polyvia3d.com/splat-inspector) to check your file before and after compression.
- 4
Step 4 — Choose a Web Viewer
You need a JavaScript library to render 3DGS in the browser. Options: Spark.js (@sparkjsdev/spark) — MIT, Three.js integration, supports PLY/SPZ/SPLAT/KSplat/SOG, built-in LOD tree, WASM-accelerated sorting. This is what polyvia3d uses. GaussianSplats3D (mkkellogg) — Three.js, supports PLY/SPLAT/KSplat, progressive loading, widely used. PlayCanvas Engine — supports SOG natively, full game engine with editor. If you just want to embed a scene without writing code, use our embed tool (polyvia3d.com/splat-embed) to generate an iframe snippet.
- 5
Step 5 — Host Your Compressed File
Your compressed 3DGS file needs to be served from a URL that supports CORS (Cross-Origin Resource Sharing) and large file downloads. Options: Cloudflare R2 — free tier includes 10 GB storage and zero egress fees, ideal for 3DGS files. AWS S3 + CloudFront — established CDN, pay for egress. Vercel/Netlify — easy but size limits apply (Vercel: 50 MB per file, Netlify: 100 MB). GitHub Releases — free for public repos, up to 2 GB per file. Your own server — make sure CORS headers are set: Access-Control-Allow-Origin: *. Whichever you choose, set the Content-Type to application/octet-stream and enable gzip/brotli compression at the CDN level (though SPZ is already gzip-compressed internally).
- 6
Step 6 — Embed on Your Website
The simplest way: use an iframe pointing to a viewer that loads your hosted file. Our embed tool generates this code for you. For custom integration: install Spark.js (npm install @sparkjsdev/spark), create a Three.js scene, and load your file with SplatMesh({ url: "https://your-cdn.com/scene.spz" }). For WordPress: use the Custom HTML block to paste the iframe. For Squarespace: use the Code block. For React/Next.js: import SplatMesh and use it in a Canvas component. Make sure to add loading states — 3DGS files take seconds to load, and users need visual feedback.
- 7
Step 7 — Optimize Loading Performance
Three optimizations make the biggest difference: (1) Use SOG format if possible — its WebP-based compression decodes directly into GPU textures, skipping JavaScript decompression. (2) Add a loading skeleton or progress bar — the Three.js loader provides progress events. (3) Lazy-load the viewer — do not load the 3DGS viewer JavaScript until the user scrolls to the 3D section. On mobile, consider showing a static preview image first with a "Load 3D View" button that initializes the viewer on tap. This avoids loading megabytes of data for users who may not interact with the 3D content.
- 8
Step 8 — Test Across Devices
Before publishing, test on: (1) Desktop Chrome with fast internet — should load in under 5 seconds. (2) Mobile Safari on iPhone — test WebGL2 compatibility and memory limits. (3) A budget Android phone on 4G — this is your worst-case scenario. Common issues: scenes with more than 1 million Gaussians may crash on mobile (limit to 500K for mobile). Some iOS versions have WebGL memory limits that cause silent failures. If your scene does not render on a specific device, reduce the Gaussian count or switch to SPLAT format (smaller memory footprint due to no SH data).