~/satyajit

Echo-3, taken apart from the outside: a room scan as 7.3 million flat discs

mdjsonmcp

2026-10-27 · 13 min · 3d · gaussian-splatting · world-models · reconstruction

Why read this

Nichelast 15%

Closed model, no paper; value is a byte-level read of one public sample splat (7,276,512 discs, 16.4 B each) plus the price list and the training clause.

  • Original analysis

3D & spatialAPI onlyProprietaryPractitioner model

How this was scored
Is it new?
1 of 3: An incremental tweak
Can I trust it?
2 of 3: Measures key facts from files, code or configs
Can I run it?
0 of 3: Closed, nothing to run
Will I understand it?
1 of 3: Partial mechanism
Can I act on it?
1 of 3: General advice
Will it last?
1 of 3: Relevant for months
Does it affect many?
1 of 3: A specialist community
Only here?
2 of 3: A teardown or measurement few others did

Score 42 of 100, ranked 611 of 666 rated articles. Each question is answered 0–3 by hand, and a 3 is rare. How articles are scored

A post made the rounds this week: a four-minute scan of a hotel room, rebuilt by SpAItial's new Echo-3 into something you can walk through in a browser. The claim is a good one. A phone, a slow lap of a room, and a few minutes later a photorealistic splat scene at real-world scale.

I cannot tell you how Echo-3 works. Nobody outside SpAItial can. There is no technical report on the company's site, no GitHub organisation I could find, and a search of the Hugging Face API for the name returned an empty list. What I can do is read everything the launch exposes: the product page, the launch posts, the terms, and the files behind one public sample world. Each claim below is labelled reported (someone said it), measured (I read it out of a file) or reasoned (I inferred it and say how).

What is claimed

The launch is dated 27 October 2026. Three outlets and the company's own pages agree on the outline (reported):

That last sentence is the one to hold on to. "Faithful" and "state of the art" are the company's words. I found nothing that would let a reader check either.

What you can get

Reported. An iPhone app is out now, Android is "coming soon". Scans are saved on the phone and uploaded for cloud processing. On a LiDAR iPhone the app shows live coverage guidance and a dense point-cloud preview; other iPhones capture without them. An enterprise API is promised for real-estate visualisation, simulation inputs and agents that understand or edit scenes. A Claude plugin and a hosted MCP server for the earlier Echo models shipped in June.

Weights: not released, as far as I can find. The model is reachable through the app, the web viewer and, for enterprises, the API. That is why the article's runsOn says API.

Pricing is a credit meter. Processing costs 300 credits per recorded scan minute with a 900-credit minimum. Standard gives 7,500 credits a month, about 25 scan minutes, for non-commercial use. Pro gives 15,000 credits, about 50 minutes, with commercial rights. Eligible new subscribers get the first month free. The slider below is that arithmetic and nothing else, so a four-minute scan is 1,200 credits: 16% of a Standard month.

The table under the bars uses the file size I measured later in this piece. Only the first row is a download; the other two are the same bytes per splat applied to their counts, an estimate (reasoned).

The terms

I read the terms of service rather than summarising a summary. Four clauses matter to anyone scanning somewhere that is not theirs (reported, clause numbers as the document gives them):

Read together: you own the room, and the company may train on your scan of it forever. A capture of a client's factory floor is not yours alone to give. The terms say nothing I could find about world visibility, so I cannot tell you whether a link is private by default.

The sample world

The tweet links a world in SpAItial's web viewer. The viewer page is plain HTML that points at its assets, and the asset links are public. That gives me a real Echo-3 output to measure. Two caveats up front. I cannot show that this world is the four-minute hotel scan; its title is "Modern room with wood floors and white walls", and the output path of the file contains video2splat. And it is one scene, so nothing below is a statistic about Echo-3. It is a reading of one output.

What the viewer loads (measured):

FileWhat it isSize
splat.spzthe scene, Niantic SPZ119,247,965 bytes
lod-meta.jsona three-level streaming hierarchy10,777 bytes
splat.voxel.jsonan occupancy grid for the same scene623 bytes

Both JSON files name their generator: PlayCanvas's splat-transform v2.6.0. So the web viewer is built on the standard open splat tooling, with SpAItial's model upstream of it (reasoned; the generator string tells me the converter, not the model).

Header and layout

SPZ is a gzip stream. I decompressed it and parsed the header (measured): magic NGSP, version 3, 7,276,512 points, spherical-harmonics degree 0, 12 fractional bits for positions, flag 1 (antialiased). Degree 0 means colour is one RGB triple per splat: no view-dependent shading, so a reflection will not slide across a wall as you move. Raw layout is 9 bytes of position, 1 of opacity, 3 of colour, 3 of scale and 4 of rotation: 20 bytes. The gzipped file is 119,247,965 bytes, which is 16.39 bytes per splat, 82% of raw.

For comparison, the SOG teardown measured 13.64 bytes per splat for a trained scene in PlayCanvas's own format, from 248 for the raw PLY. SPZ at 16.4 sits between those; this is what the "download SPZ" button hands you.

lod-meta.json lists 10,696,472 splats in three levels: 7,276,512, 2,546,779 and 873,181. The first equals the SPZ's count exactly, so the SPZ export is the finest level and the viewer streams coarser ones over 18 chunk files (measured, the match; the reading that level 0 is the SPZ is reasoned).

How big is the room

Positions are 24-bit fixed point, so decoding is exact to 1/4096 m. The SPZ documentation for this service says positions are exported in the RDF (OpenCV/COLMAP) frame: x right, y down, z forward. I took that as given and checked it against the data. The two tallest bands in the height histogram are at y = +1.35 and y around −1.15, and the first carries 875,553 splats in a single 5 cm bin. If y points down, +1.35 is the floor and −1.15 the ceiling, which makes the room 2.5 m high (measured, with the axis convention taken from the docs). That is a normal room height, which is mild evidence for the scale claim. It is one dimension of one room and no substitute for a tape measure.

The occupancy grid agrees about the footprint. Its gridBounds span 11.0 by 4.0 by 8.8 m at 5 cm voxels, in a different axis order and padded; the splats span 10.75 by 3.0 by 8.54 m (measured). Counting 0.25 m floor cells that hold at least 200 splats gives 893 cells, or 55.8 m². Move the threshold and watch the number; the heat map is every splat, binned.

The grid file also tells you something about use. A leaf size of 4 voxels and a tree depth of 6 gives 14,440 nodes, 11,421 of them mixed leaves (measured). Occupancy at that resolution is what a walking camera needs to stay out of walls. That is my reading of its purpose (reasoned); the file does not say.

The splats are discs

This is the finding I did not expect. In SPZ, scale is stored per axis as byte/16 − 10 in the log domain. I decoded all of them and sorted each splat's three axes (measured):

Three-dimensional Gaussian splatting usually trains full ellipsoids. A distribution with 99.2% of the mass pinned at the format's minimum is not that. The splats are flat discs (surfels), the representation of 2D Gaussian splatting, where each primitive is a small oriented patch lying on a surface (reasoned from the scale arrays; SpAItial has not said which representation Echo-3 emits, and a clamp to the minimum would look identical).

Why it matters: a flat disc has a normal, and the launch material lists "normals" and "depth" among exports. Discs give clean geometry for a mesh or a depth map in a way blobs do not. It would also explain the "no floaters" claim, since a disc not lying on a surface has nothing to hold it up. Both are speculation about why; the measurement is the 99.2%.

Opacity follows suit. The lowest stored value is byte 11, about 0.04, so nothing fainter survived. A quarter of the splats, 24.5%, are at 250 or above out of 255, and the median is 0.616. Colour is a single triple. At a median 3.84 by 2.19 mm a disc covers roughly 7 mm², so one square metre of surface takes on the order of a hundred thousand of them before overlap (reasoned, back of the envelope). That is where 7.3 million splats goes.

Where it sits among the splat articles here

It is a different kind of subject from the others on this site, which is why the comparison is short.

Read it yourself

The whole measurement is a page of Python and works on any SPZ you export. The format is a gzip stream, a 16-byte header, then planar arrays in a fixed order.

import gzip, struct, numpy as np
f = gzip.open("splat.spz", "rb")
magic, ver, n, sh, frac, flags, _ = struct.unpack("<IIIBBBB", f.read(16))
pos = np.frombuffer(f.read(n * 9), np.uint8).reshape(n, 3, 3).astype(np.int32)
v = pos[:, :, 0] | (pos[:, :, 1] << 8) | (pos[:, :, 2] << 16)
v = np.where(v & 0x800000, v - (1 << 24), v) / (1 << frac)   # metres
alpha = np.frombuffer(f.read(n), np.uint8)
f.read(n * 3)                                                # colour
scale = np.frombuffer(f.read(n * 3), np.uint8).reshape(n, 3)
print((scale.min(1) == 0).mean())                            # the 99.2%

It decompresses to a few hundred megabytes of arrays for this file, so keep the intermediate steps in 32-bit integers. If your number for the flat fraction on a different Echo-3 scene is not near 99%, the disc reading is wrong, and I would like to hear it.

Why filling in is the hard part

A walkthrough never sees the back of a sofa, the top of a wardrobe or the floor under a bed. A pure reconstruction leaves holes there, and a viewer who steps close enough sees through the wall of the scan into the void. Echo-3's selling point is that it does not leave them (reported). Making the fill credible needs a prior over what rooms look like, which is a generative model's job, and it is the reason this is called a world model rather than a reconstruction pipeline (reasoned; the label is the company's, the justification is mine).

The same strength is the audit problem. A measuring tool built on this output has two kinds of surface in it, captured and invented, and the file does not mark which is which. The app offers measurements, so the useful question for SpAItial is whether a distance between two captured walls and a distance across a filled gap come with the same error bar. Until that is published, treat a measurement as accurate only between surfaces you walked past.

What I could not check

Everything numeric above came from two commands' worth of Python: gunzip the SPZ, read the 16-byte header, read the arrays in order. Nothing from SpAItial was executed; the only files I fetched were public assets the viewer itself requests.

What I would do with it

If you scan places you own and want a metric splat without an SfM stack, the app is a convenient front end, and the price list is simple enough to budget: 300 credits a minute, and keep scans short because the minimum is 900. If you scan anyone else's space, read clause 7.1 first. If you need to know how good it is, wait for a number: the sentence "the same scene against three competitors" is a demo, and the question that decides it is the error in centimetres on a room you can measure by hand.

The artefact is useful even so. A flat-disc splat with degree-0 colour and 14,440 voxel nodes of occupancy beside it is a well-chosen delivery format for a web viewer, and everything past the capture is closed.

playcanvas/splat-transform@cf7bd62 · snapshot 2026-11-01
tracked files
328
license
MIT
branch
main
tests
86 files
source
3.0 MB
commit date
2026-10-29
source by language
TypeScript2.0 MB(206)JavaScript1.0 MB(93)C3.3 kB(1)

by size of tracked source at this commit, file counts in brackets; docs, data and vendored trees excluded

local clone, 2026-11-01 at cf7bd62 — branch, commit, commitDate, fileCount, hasTests, languages, license, licenseFile, shallow, testFileCount

shallow clone: counts describe the pinned tree, not the history

Cite this article

For attribution, please use the following reference or BibTeX:

Satyajit Ghana, "Echo-3, taken apart from the outside: a room scan as 7.3 million flat discs", ai.thesatyajit.com, October 2026.

bibtex
@misc{ghana2026echo3worldmodel,
  author = {Satyajit Ghana},
  title  = {Echo-3, taken apart from the outside: a room scan as 7.3 million flat discs},
  url    = {https://ai.thesatyajit.com/articles/echo-3-world-model},
  year   = {2026}
}
share