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

  1. Browser uploads the archive to R2 via a presigned PUT.
  2. The worker receives { preset: "hacpp-lzma", source_url } and forwards it to the private Modal endpoint.
  3. The endpoint extracts the archive with tarfile in r:* mode, so tar, tar.gz, tgz, and tar.xz all unpack with the same code path.
  4. The encoder produces a single scene.hacpp container, which is then uploaded to Vercel Blob and returned to the browser.

← back to Try it