Comparison

SplatForge vs splat-transform

PlayCanvas's splat-transform is a great Gaussian-Splat conversion CLI. SplatForge is a different shape of tool: a Rust production pipeline with a hosted API, byte-deterministic outputs, perceptual fidelity gates, and a benchmark corpus. We share ~80% of the conversion surface; the differentiation is everything downstream of convert.

The honest take: if you live inside the PlayCanvas / SOG ecosystem and run one-off conversions on your laptop, npm i -g @playcanvas/splat-transform is the right answer. If you ship splats into a team workflow, a CI pipeline, multiple runtimes, or an enterprise integration, the production primitives below are why teams pick SplatForge.

Side-by-side: same job, two tools

Optimize a 1.16M-splat real Mip-NeRF 360 scene (bonsai) down to a web-mobile target.

splat-transform

npm i -g @playcanvas/splat-transform

splat-transform convert \
  bonsai.ply \
  --output bonsai.sog
  • Output: SOG (PlayCanvas format)
  • No fidelity report
  • No determinism guarantee
  • Runs only on your machine

SplatForge — local

# single static binary, no runtime
splatforge optimize \
  --preset web-mobile \
  bonsai.ply \
  --output bonsai.glb

# fidelity report next to the output
splatforge fidelity \
  bonsai.glb \
  --baseline bonsai.ply \
  --report bonsai-fidelity.json
  • Output: glTF + KHR_gaussian_splatting
  • JSON fidelity report (ΔE94 / SSIM / ML-Score over 8 orbit poses)
  • BLAKE3-deterministic — re-run produces identical bytes

SplatForge — hosted

# same pipeline, on splatforge-api.fly.dev
curl -X POST https://splatforge-api.fly.dev/v1/jobs \
  -H "Authorization: Bearer $SPLATFORGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"preset":"web-mobile",
       "source_url":"https://.../bonsai.ply"}'

# poll → download → public report URL

Capability comparison

Capability splat-transform SplatForge Why it matters
Convert PLY ↔ SPZ ↔ glTF yes yes Table stakes for either tool.
Single static binary (no Node) no — Node + npm runtime yes — Rust binary, no runtime Matters for CI containers and air-gapped runs.
Byte-deterministic outputs no published guarantee yes — BLAKE3 hash on canonical IR; same input + version = same bytes Required for cache-by-hash and provenance audits.
Per-scene fidelity gates (ΔE94, SSIM, ML-Score) no yes — 8-orbit deterministic render, JSON report alongside output splat-transform converts; it doesn't tell you if the conversion broke anything.
Hosted API with SLA no yes — splatforge-api.fly.dev, free + paid tiers The OSS CLI can't ship hosted by definition.
GitHub Action with PR badge no yes — splatforge/optimize-action Drop in any repo, fail CI on fidelity regression.
MCP server (Claude / Cursor / Cline) no yes — analyze / optimize / list_presets over stdio The distribution channel splat-transform structurally can't grow into.
Differentiable repack (RDO-optimized compression) no yes — hosted-tier, +6.4 dB PSNR over opacity-prune at 50% byte budget on bonsai
Standards conformance suite (KHR_gaussian_splatting) no yes — published validator + golden fixture corpus
OpenUSD ParticleField3DGaussianSplat support no in progress — USDC bit-exact round-trip against `usdcat`
OSS license MIT Apache-2.0 (CLI + viewer SDK + benchmark) Both are permissive. Hosted features are commercial-license.
SOG / SOGS adoption native (PlayCanvas invented SOG) reads SOG via splatforge-spz; comparison column on the benchmark If your runtime is PlayCanvas Engine, splat-transform's SOG path is the path of least resistance.

Real fidelity on real scenes

SplatBench v0 measurements on representative scenes. We publish ΔE94 and ML-Score alongside compression ratio so the leaderboard never hides quality cost behind compression headlines. Numbers come from splatbench-v0.json. splat-transform numbers will land here once we wire its CLI into the same harness.

Scene Splats web-mobile ratio web-mobile ΔE94 web-mobile ML-Score size-min ratio size-min ΔE94
bonsai_mipnerf360_iter7k 1,157,141 22.81× 0.0060 0.465 31.83× 0.0064
bicycle_mipnerf360_iter7k 3,616,103 25.46× 0.0286 0.000 38.92× 0.0260
splatbench_indoor_proxy 100,000 20.58× 0.0003 0.951 21.57× 0.0010

Use splat-transform when

  • You ship inside the PlayCanvas / SuperSplat / Snap pipeline and SOG is the runtime format.
  • You want a one-liner npm install with zero infrastructure footprint.
  • Your scene count is small enough that local CLI runs are all you need — no CI, no reports, no multi-developer regression tracking.

Use SplatForge when

  • You ship splat assets to multiple platforms (web, mobile, AR, geospatial, USD) and need every output validated.
  • You run compression in CI and want a fidelity badge on every PR.
  • Your team is more than one person and reproducibility matters across machines.
  • You're building enterprise-grade assets (e-commerce, AEC, geospatial via Cesium, VFX via USD) and need an SLA-backed pipeline.
  • You want hosted-only access to research-grade compression (PostHAC entropy coding, differentiable repack, splat-aware perceptual metrics) that requires more than a local CPU.

Try it on a real scene

Drop a PLY at splatforge.dev/#try and watch the full pipeline run against the hosted API. Or run it locally — the five-minute quickstart doesn't require a key.