← platform

transport protocol · v0.1 — v0.2 draft

Splat HTTP Live Streaming

SHLS is how PAXAL delivers gigabyte-scale captured worlds to commodity browsers — a manifest-driven, byte-ranged streaming protocol for Gaussian-splat scenes. The same URL plays on a phone, a Chromebook, and a workstation; the wire format and the cache discipline are the reason it can.

what it is

HLS for splats.

SHLS is a transport-layer spec for delivering 3D Gaussian splat scenes over HTTP / CDN to browser renderers. It is the splat analog of HLS for video. A JSON manifest describes a scene as a set of spatial chunks at multiple LODs; each chunk is addressable as a byte range into a single CDN-cached blob per LOD; a view-driven scheduler picks which chunks to fetch when. The spec is payload-agnostic — it carries SuperSplat, SOG, or SPZ bytes unchanged. The wins are in the transport.

why it exists

A 4 km² scan is not one file.

A photoreal world at the density PAXAL targets does not fit in a single download. It cannot be served the way games ship today — a 60 GB install behind a launcher — and it cannot be served the way splat viewers ship today — one .ply, one fetch, one hope. The bytes have to flow the way video bytes flow: chunked, prefetched, cached at the edge, scheduled against where the viewer is looking next.

SHLS is that protocol. HLS had to exist before Netflix could exist; this is the same shape of problem, one media type over.

architecture

One manifest, six stages.

The manifest is fetched once at scene load. The LOD blobs are progressively populated in OPFS as chunks are requested. Per frame, the scheduler scores active and candidate chunks against current camera state and dispatches fetches through the existing worker topology.

MANIFESTone JSON file describes the sceneSCHEDULERcamera + velocity → request priorityFETCH WORKERHTTP Range into a per-LOD blobDECODE WORKERsplat codec, off-main-threadPERSIST WORKEROPFS warm cache, content-addressedRENDERERWebGPU raster, two-state LOD swap

The fetch, decode, and persist workers already live in PAXAL's runtime. SHLS is the contract that lets them share one source of truth.

the manifest

One JSON file per scene.

The manifest is the index. It declares the codec, the bounding volume, the LOD ladder, where each variant lives in which blob, and a few optional sidecars for collision or cubemap. Five to fifty kilobytes for a scene. Versioned with a strict major / minor rule so older renderers can still read newer manifests.

{
  "shls_version": "0.2",
  "scene_id": "room",
  "asset":      { "codec": "compressed.ply", "sh_degree": 0 },
  "bounds":     { "min": [-12.3, -3.8, -10.5], "max": [11.7, 4.2, 12.1] },
  "lod_ladder": [ { "id": 0, ... }, { "id": 1, ... }, { "id": 2, ... } ],
  "packaging":  { "type": "byterange", "blobs": [ ... ] },
  "chunks":     [ { "id": "0_0_1", "variants": [ ... ] }, ... ]
}

Forward-compatible by design. v0.2 added optional view-aware fields — per-variant geometric error, mean opacity, parent chunk id — that v0.1 renderers ignore without complaint.

packaging

Three blobs, not six hundred files.

The compressed insight is the packaging mode. The naive splat layout puts each tile in its own file — a 4 km² scene at three LODs is easily six hundred requests. SHLS concatenates every tile at a given LOD into one blob and addresses each tile by HTTP Range: bytes=offset-length. One blob per LOD, three blobs per scene. Roughly thirty times fewer requests, dramatically better CDN cache hit, no per-tile handshake.

The blobs are served Cache-Control: immutable with content-addressed URLs. Brotli is discouraged on already- compressed payloads. CORS exposes the byte-range headers so the renderer can sanity-check what came back. The format is a drop-in upgrade — existing per-file scenes work too, just slower at the edge.

scheduler

A pure function, every frame.

The scheduler is the bridge between the renderer's per-frame camera state and the streaming host's request queue. It takes camera pose, velocity, the set of active chunks, a bandwidth estimate, and a GPU-memory budget, and returns a priority-ordered list of fetches plus a set of evictions. Pure, no I/O, sixteen-millisecond budget. It picks the smallest LOD whose projected screen-space error clears the threshold for that chunk; biases toward chunks inside the frustum and inside the velocity-extruded prefetch cone; truncates the queue at two seconds of fetch work outstanding. Renderers may swap the scoring policy — the input and output shapes are what conform.

what's shipped

v0.1 — v0.2 milestones, in product voice.

  • 01Spec published — v0.1 draft, v0.2 view-aware fields, forward-compat rules. Single source of truth in the repo.
  • 02Manifest loader, validator, and discriminated-union variant shapes wired into the existing chunk-manager. Legacy manifests still load.
  • 03Reference scheduler — distance + frustum + prefetch cone + LOD upgrade pressure. Replaces ad-hoc motion-adaptive LOD.
  • 04Pack-and-index encoder. The room scene re-emitted as three byte-range blobs — an order of magnitude fewer requests on cold load, with the multiple climbing as scenes grow.
  • 05Foveation-aware scheduler upgrade. Screen-space-error scoring with a foveation hint biases LOD up inside the central-vision radius — the scheduler reads where the eye is, not just where the camera is.
  • 06ABR feedback loop — bandwidth estimate flows back into the scheduler so the queue tightens on slow links.
  • 07Render robustness — two-state LOD swap, hold-N latest, fade between variants. No black frames during a swap.

what's next

Kept lean for v0.1 — v0.2.

The bet is to keep SHLS small until it has to be big. Open questions reserved for later versions: 3D Tiles 1.1 alignment once Cesium's spec stabilises; foveation hints that bias LOD inside the central-vision radius; ADD-mode refinement for PCGS-style progressive layers; WebTransport and Raptor FEC for lossy mobile networks; multi-codec manifests that serve legacy and modern clients from one index. None of these block v0.1. All of them have a slot carved out in the manifest's extensions block.

The same URL plays on a phone, a Chromebook, and a desktop with a discrete card. That's the bet. SHLS is the wire format that makes it cheap enough to keep.

Drive it →