voxelkloudBack to the project

COMPARISON

voxelkloud and Potree,
side by side.

Potree is the reason a point cloud can be looked at in a browser at all, and this project verifies its own Potree v2 driver against Potree’s own implementation. What follows is about architecture, API and integration — and then about speed, measured on the same hardware, the same data and the same camera, with the conditions written next to the numbers.

DIMENSIONPOTREEVOXELKLOUD
DeliveryAn app or bundle you copy into your pagenpm packages, ESM, TypeScript, tree-shakeable
RendererWebGLWebGPU via three.js WebGPURenderer + TSL
SceneThe viewer owns the loop and the sceneview.camera and view.scene are your three objects
FrameworksHand-rolled integrationFirst-party React and Vue bindings
Standalone loaderCoupled to the viewerNo three, no DOM: runs in Node and in a worker
Potree v2The origin of the formatReads it as it is, DEFAULT and BROTLI
COPCReads it@voxelkloud/format-copc: streamed by HTTP Range, no conversion step
EPTReads it@voxelkloud/format-ept: binary, laszip and zstandard node payloads
3D Tiles—@voxelkloud/format-3dtiles: external tilesets, implicit tiling, .pnts and glTF POINTS
Single-file LAS/LAZReads it@voxelkloud/format-single: downloaded whole, the octree built in a worker by the converter's own partitioner in wasm
E57, PLY, PCD, XYZReads E57@voxelkloud/format-single, in the page and in the CLI: scan poses applied, spherical records converted, no-returns dropped
Reprojection—@voxelkloud/wasm-proj: EPSG and proj4, so two clouds in different systems share one scene
ConversionPotreeConverter, a CLIvoxelkloud convert: a Rust library and a CLI, writing COPC, EPT or Potree v2
Deployment checks—voxelkloud doctor grades a served cloud on ranges, CORS and encoding — including a Potree one
Diagnostics—stats.limitedBy: whether quality or the point budget stopped selection
TypesJavaScriptTypeScript end to end
LicenseBSD 2-ClauseMIT

Performance, measured

All four arms render the same cloud, from the same origin, at the same camera, to the same on-screen point count — about 2,999,500 points and 105 MB transferred each. That equalisation is what makes the rows below a comparison rather than four unrelated numbers.

The voxelkloud column is what npm install gives you: sinkMode defaults to "auto", which is the compute rasteriser wherever WebGPU provides a device. That default is itself a measurement — the instanced path costs ~320 ms of INP at this budget where compute costs 56.

METRICvoxelkloudPotree 1.8potree-core
INP — orbit drag56 ms104 ms200 ms
Idle fps at 3M points60.259.529.9
JS heap66.6 MB254.1 MB211.8 MB
First ink522 ms1,233 ms622 ms
First contentful paint324 ms732 ms364 ms
First selection275 ms812 ms374 ms
Speed Index1,9181,4938,487
Visually complete23.5 s21.4 s25.3 s
JS decoded0.39 MB2.39 MB0.74 MB

Conditions. Median of 2 cold runs, 26 August 2026. Chrome running headed on a real GPU — headless has no WebGPU adapter and would score a software rasteriser against WebGL. One origin serving every arm and the dataset, throttled to 20 Mbit with 40 ms RTT. Autzen, camera at 0.25 of the longest extent, 3M point budget. The raw JSON is versioned in the monorepo. An earlier sitting was discarded: idle fps came back as exactly 50.0 for two different engines and exactly 25.0 for the third, and figures that round are missed vsync rather than a result — a background updater was taking 27% of a core. With it closed the same arms read 60.2, 59.5 and 29.9.

Why these deltas can be trusted. potree-core is unchanged code between this round and the previous one, so it doubles as a control — it reproduced its own first contentful paint, first ink and INP to within a few percent. The same control also shows that visually complete and Speed Index shifted scale for every arm between rounds, which is why neither is compared here against any earlier number.

Speed Index measures each arm against its own final frame. A renderer whose finished image is sharper has further to travel and scores worse for it, and ours is sharper than Potree’s — verified by screenshot. Some of that 1,918 against 1,493 is the metric, not latency. How much, nobody has isolated, so the row stands as a loss.

What Potree still does better

  • Potree is a complete application — measuring tools, annotations, clipping volumes, the profile tool. voxelkloud is a rendering library, and a library is not an application.
  • Potree has years of exposure to real-world clouds and real-world browsers. That is not a feature list, it is scar tissue, and it cannot be shortcut.
  • WebGL runs everywhere today. voxelkloud wants WebGPU for its fast path, which is still a narrower set of machines.
  • Potree is one artifact people have deployed for a decade. voxelkloud is fifteen packages at 0.5.1 and a CLI at 0.5.2 — every row above is installable today, but “installable” and “battle-tested” are not the same claim.
  • PotreeConverter has converted a great deal of the world’s LiDAR and is fast and IO-bound. voxelkloud convert is new. It is checked against PotreeConverter’s own output on the same file — same quantum, same origin, same cube, same spacing, same record — but the two have never been timed against each other, and this table is the wrong place to claim a number nobody has earned.
  • The GPU-side frame time has not been characterised.

Already running Potree? What switching involves — the short version is that your existing directory is read as it is.