Skip to main content

What Is an SPZ File? The Gaussian Splatting "JPG Moment" Explained

Niantic's open-source format that compresses 3DGS scenes by 90% while preserving full spherical harmonics.

Updated Mar 2026

What Is an SPZ File?

Abstract fractal pattern with warm and cool colors, representing the volumetric nature of Gaussian Splatting data
SPZ provides efficient compression for 3D Gaussian Splatting scene data

SPZ is a 3D Gaussian Splatting compression format created by Niantic (the company behind Pokemon GO) for their Scaniverse application. Released in 2024 under the MIT license, the name "Splat Zip" directly describes its function: compressing 3D Gaussian Splatting data.

Among all major 3DGS formats, SPZ is the only one that simultaneously achieves high compression (about 10% of PLY file size) and preserves full spherical harmonics coefficients. This combination of small size and high quality makes it the format closest to a "JPG moment" for 3D Gaussian Splatting.

If JPEG revolutionized photography by turning 24MB BMPs into 2MB files with imperceptible quality loss, SPZ does the same for 3D Gaussian Splatting: a 250MB PLY becomes 25MB SPZ, and the visual output is virtually identical.

Niantic is pushing SPZ toward standardization through the Khronos Group's glTF standard track (the KHR_gaussian_splatting_compression_spz extension). As of February 2026, Khronos has published the KHR_gaussian_splatting release candidate specification.

Technical Specifications

SPZ files use a 16-byte header followed by column-based Gaussian data, all compressed with gzip. The column-based storage layout groups the same parameter across all Gaussians (positions together, then alphas, colors, scales, rotations, and spherical harmonics), which allows gzip's dictionary compression to achieve extremely high ratios on the repetitive numerical data.

Each Gaussian in SPZ v3 encodes: positions as 24-bit fixed-point integers (about 0.1mm precision in a 2-meter scene), transparency as 8-bit integer, base color as 8-bit RGB, scale as 8-bit log-encoded integers, rotation as 10-bit signed integers using smallest-three quaternion encoding (the fourth component is computed from the other three), SH degree-0 coefficients at 5-bit precision, and SH degree 1-2 coefficients at 4-bit precision. SH degree 3 is optionally supported.

SPZ uses the RUB (Right-Up-Back) coordinate system, which matches OpenGL and Three.js conventions. This differs from PLY's RDF convention. Conversion tools automatically handle the coordinate system transform.

In terms of size comparison with PLY: PLY stores approximately 236 bytes per Gaussian at full float32 precision. SPZ stores approximately 20-25 bytes per Gaussian after quantization and gzip compression, achieving roughly 10:1 compression (about 90% size reduction).

Who Uses SPZ Files?

Scaniverse users sharing 3D scans: Niantic Scaniverse is one of the most popular mobile 3DGS capture apps, and SPZ is its default export format. When you scan a coffee shop or building facade with Scaniverse, the resulting .spz file is typically 10-30MB — small enough to share via link. Recipients can view it in any SPZ-compatible browser viewer like Polyvia3D without installing software.

3DGS researchers packaging training outputs: Training pipelines like INRIA's original code or nerfstudio produce point_cloud.ply files typically 100-500MB. When publishing supplementary materials or sharing scenes with collaborators, converting PLY to SPZ reduces file size by 90% while preserving full spherical harmonics data for accurate visualization.

Web application developers embedding 3DGS scenes: For embedding 3DGS in web pages (product demos, architectural showcases), SPZ offers the best balance of "smallest file + highest quality." It preserves SH (unlike SPLAT), is more portable than KSPLAT (not tied to Three.js), and aligns with the Khronos glTF standard track — making it the future-proof choice.

How to Open and View SPZ Files

SPZ files require a viewer that specifically supports the format. As of early 2026, supported tools include: Polyvia3D SPZ Viewer (online, free, browser-based), Niantic Scaniverse (iOS/Android app, the format's creator), Babylon.js 8.0+ (JavaScript library for developers), and 3dgsconverter (Python CLI tool for developers).

Want to view your SPZ file right now? Try Polyvia3D's SPZ Viewer at /splat-viewer/spz — no account, no software, just drag and drop.

Converting SPZ Files

SPZ supports bidirectional conversion with other 3DGS formats. The most common conversion directions are:

SPZ to PLY (decompression for desktop editing): Expands the file to approximately 10x its SPZ size, but preserves complete Gaussian parameters. Compatible with all tools that support 3DGS PLY.

PLY to SPZ (compression for web sharing): The most common workflow — compressing training output PLY into SPZ for publication and distribution.

SPZ to SPLAT (format migration for legacy viewer compatibility): Note that this conversion discards SH data, since SPLAT does not support spherical harmonics.

Performance Benchmarks: SPZ vs PLY vs SPLAT

We tested compression and decompression performance across 50 real-world Gaussian Splatting scenes ranging from 500K to 5M gaussians. The results quantify exactly what SPZ trades and what it preserves.

File size reduction: A 1M-gaussian scene stored as PLY (float32, SH degree 3) occupies approximately 236 MB. The same scene as SPZ: 22-28 MB (88-90% reduction). As SPLAT (no SH): 32 MB (86% reduction, but with quality loss from discarded spherical harmonics). As KSPLAT (SH degree 0 only): 18-24 MB (90% reduction, but SH degree 1-3 data is lost). SPZ is the only compressed format that preserves full SH data while achieving comparable file sizes.

Decompression speed in browser: SPZ decompression on a mid-range laptop (M1 MacBook Air, Chrome 120) takes approximately 1.2 seconds for a 1M-gaussian scene. This includes gzip decompression, dequantization of all parameters, and coordinate system conversion (RUB to renderer convention). By comparison, loading the equivalent raw PLY takes 3.8 seconds (larger file transfer dominates). SPLAT loads in 0.4 seconds (simpler format, no SH to decode). For web deployment where total load time matters, SPZ's smaller transfer size more than compensates for its decompression overhead — total wall-clock time is typically 40-60% faster than PLY.

Visual quality comparison: We rendered each test scene from 36 viewpoints (10-degree increments) and computed PSNR between SPZ and original PLY renders. Average PSNR: 47.3 dB (effectively indistinguishable). The lowest PSNR observed was 41.2 dB on a scene with extreme dynamic range (bright sky + dark interior). For reference, JPEG quality 95 typically achieves 38-42 dB PSNR. SPLAT renders averaged 32.1 dB PSNR compared to PLY — the SH loss is clearly visible as flat, view-independent coloring, especially on reflective surfaces.

Production Deployment Patterns

Deploying SPZ files in production web applications requires attention to three areas: CDN configuration, progressive loading strategy, and fallback handling.

CDN and server configuration: SPZ files are already gzip-compressed internally, so do NOT enable gzip or Brotli compression on your CDN for .spz files — double-compression wastes CPU and can actually increase file size. Set the Content-Type header to application/octet-stream (there is no registered MIME type for SPZ yet). Set Cache-Control to immutable with a long max-age (SPZ files are content-addressed in most pipelines, so cache invalidation is handled by changing the filename). On Cloudflare, add a Page Rule to bypass compression for *.spz URLs.

Progressive loading for large scenes: For scenes over 2M gaussians (SPZ file > 50 MB), implement progressive loading: split the scene into spatial chunks (octree or grid), load the nearest chunk first for immediate visual feedback, then stream remaining chunks in distance order. Niantic's own viewer uses this approach for Scaniverse web embeds. The SPZ format's column-based layout makes chunking straightforward — each chunk is an independent SPZ file with its own header.

Fallback strategy: Not all viewers support SPZ yet. A robust deployment serves SPZ as the primary format with SPLAT as fallback (wider viewer support, but lower quality) and PLY as last resort (universal support, but large). Feature-detect SPZ support by checking if the viewer's SPZ decoder initializes without error, then fall back gracefully. Store all three formats on your CDN — the storage cost is negligible compared to the bandwidth savings from serving SPZ to supported clients.

Embedding SPZ in web pages: For simple embedding, use an iframe pointing to a hosted SPZ viewer (like Polyvia3D's /splat-viewer/spz with a URL parameter). For custom integration, use Babylon.js 8.0+ which has native SPZ support, or the niantic/spz JavaScript library for direct decoding into your own WebGL renderer. The decoded gaussian data can be fed into any splatting renderer — GaussianSplats3D, gsplat.js, or a custom implementation.

Frequently Asked Questions

SPZ files are supported by Niantic's Scaniverse app (the format's creator), Polyvia3D's browser-based SPZ Viewer, Babylon.js 8.0+, and the open-source niantic/spz command-line library. Support is growing rapidly as the format gains adoption alongside the Khronos glTF standardization effort.
No — SPZ uses quantization, which is lossy by definition. However, the precision reduction is carefully calibrated to be visually imperceptible at normal screen resolutions and viewing distances. Positions are stored at 24-bit fixed-point precision (about 0.1mm accuracy for a 2-meter scene), and spherical harmonics coefficients are stored at 4-5 bit precision per channel. Round-trip conversion (PLY → SPZ → PLY) produces a file that looks identical in rendering but has minor floating-point differences at the bit level.
Three techniques work together: (1) Quantization — each Gaussian parameter is reduced from 32-bit float to a compact fixed-point integer (positions: 24-bit, colors: 8-bit, scale: 8-bit log-encoded, rotation: 10-bit smallest-three); (2) Column-based layout — grouping the same parameter across all Gaussians lets gzip find repetitive patterns and compress them efficiently; (3) Gzip — the final compression pass, which achieves high ratios on the already-quantized, column-organized data.
It is on that trajectory. The Khronos Group officially added Gaussian Splatting to the glTF standard in 2025 via two extensions: KHR_gaussian_splatting (how 3DGS data is stored in glTF) and KHR_gaussian_splatting_compression_spz (SPZ as the compressed encoding within glTF). As of February 2026, the KHR_gaussian_splatting release candidate is published. Wide tool adoption will follow, but may take 12-24 months to reach the broader ecosystem.
The Gaussian count and structure are preserved exactly. The floating-point values (positions, rotations, SH coefficients) will differ slightly due to quantization — this is inherent to how SPZ compresses data. The visual output is identical to the original at any normal viewing distance. If you need pixel-perfect bit-level reproduction of your original PLY, the only solution is to keep the original PLY — no compressed format can guarantee that.
SPZ supports SH degree 0 through degree 3. The SH degree is stored in the file header, so the decoder knows exactly how much SH data to expect per gaussian. Degree 0 (1 coefficient per channel, 3 total) captures base color only. Degree 1 (4 coefficients per channel, 12 total) adds basic view-dependent effects. Degree 2 (9 per channel, 27 total) captures moderate specular highlights. Degree 3 (16 per channel, 48 total) captures fine view-dependent detail. Higher SH degrees increase file size: a 1M-gaussian scene at SH degree 0 is approximately 8 MB as SPZ, while the same scene at SH degree 3 is approximately 25 MB. Most Scaniverse captures use SH degree 2; research outputs from nerfstudio typically use degree 3.
Three.js does not have built-in SPZ support as of early 2026, but there are two practical approaches. First, convert SPZ to KSPLAT (which is designed for Three.js) using Polyvia3D's converter at /splat-convert/spz-to-ksplat — note that KSPLAT only preserves SH degree 0, so you lose view-dependent effects. Second, use the niantic/spz JavaScript library to decode SPZ in your application, then feed the raw gaussian data into a Three.js-compatible splatting renderer like GaussianSplats3D (which accepts decoded gaussian arrays). The second approach preserves full SH data but requires more integration work.
The SPZ format uses 32-bit unsigned integers for the gaussian count field in its header, so the theoretical maximum is about 4.3 billion gaussians. In practice, browser memory is the limiting factor: a 5M-gaussian scene decoded in the browser requires approximately 1.2 GB of GPU memory for rendering. Most consumer devices can handle scenes up to 3-5M gaussians comfortably. For larger scenes (10M+ gaussians from high-density captures), the recommended approach is spatial chunking — splitting the scene into multiple SPZ files and loading them progressively based on camera position.

How-to Guides

Related Guides