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 - Same output + same report, no local install
- Free tier: 100 jobs / month
- PR-badge integration via splatforge/optimize-action
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.