HAC++ bundle format
The hacpp-lzma preset is the only SplatForge preset that
operates on a Scaffold-GS checkpoint instead of a single splat file.
Drop in a tarball (or .tar.gz / .tgz) and
the encoder will extract it, run anchor-entropy + lzma, and hand you
back a .hacpp container that decodes back into the same
Scaffold-GS shape.
Required layout
The archive must contain these four files, either at the root or one level down inside a single subdirectory. Other files are ignored.
bundle.tar
├── point_cloud.ply # Scaffold-GS anchor PLY (~130 MB for bonsai)
├── color_mlp.pt # TorchScript color MLP
├── cov_mlp.pt # TorchScript covariance MLP
└── opacity_mlp.pt # TorchScript opacity MLP One-liner to pack a checkpoint
From a Scaffold-GS training output directory (the one that contains
point_cloud/iteration_30000/ and the three
*_mlp.pt files):
cd /path/to/scaffold_30k
tar -cf bundle.tar \
point_cloud/iteration_30000/point_cloud.ply \
color_mlp.pt cov_mlp.pt opacity_mlp.pt \
--transform 's,.*/,,' # flatten paths to the archive root
Then drop bundle.tar on the Try-it
surface with HAC++ lzma selected.
Sample bundle
A reference bundle built from the public bonsai Scaffold-GS
checkpoint is hosted at
https://splatforge.dev/samples/bonsai_scaffold_bundle.tar. Use it to
verify that your tooling round-trips before packing your own
captures. Expect roughly
130 MB → 24 MB after encode (-0.18 dB
render-PSNR vs. Scaffold-GS native).
If the sample link returns 404, the bundle has not yet been published to the public CDN; the layout above is still correct and the encoder is the source of truth — see Scaffold-GS upstream training instructions for producing a checkpoint of your own.
What happens server-side
- Browser uploads the archive to R2 via a presigned PUT.
-
The worker receives
{ preset: "hacpp-lzma", source_url }and forwards it to the private Modal endpoint. -
The endpoint extracts the archive with
tarfileinr:*mode, sotar,tar.gz,tgz, andtar.xzall unpack with the same code path. -
The encoder produces a single
scene.hacppcontainer, which is then uploaded to Vercel Blob and returned to the browser.