One engine trains and displays Gaussian splats across several platforms
Brush turns COLMAP or Nerfstudio photo datasets into Gaussian-splat scenes, then lets you inspect training while it runs. The same project also loads regular and compressed PLY files, streams scenes from URLs, and plays zipped splat sequences as animation. Its appeal is architectural: the Rust engine uses Burn and WebGPU-compatible technology to cover desktop GPUs, Android, and the browser instead of making CUDA the only useful route.
That range sits inside a substantial codebase. Our commit 8b7f5c6 checkout contained 236 files, about 31,838 lines of source, and occupied 49.9 MB before installation. The repository is a monorepo with Rust application code plus two npm web workspaces. A team can use the command line with an optional viewer, build the full application, or embed the JavaScript-facing package. Those are different delivery paths, so a successful web demo does not prove that an Android or native build is ready for your machines.
Chrome 134 gets the web path, while Safari and Firefox wait
The browser claim has a sharp boundary. The README says the current WASM build supports Chrome 134 or newer on Windows and macOS. Its demo note names Chrome and Edge, while Firefox and Safari support is something the author hopes to add. That makes Brush interesting for a controlled internal viewer or a kiosk where the browser is fixed. It is a poor foundation for a public upload tool that promises equal behavior across whatever browser a customer opens.
Our repository scan found 3 CI workflow files and no Dockerfile. The README covers cargo run --release, npm run dev, and Android commands, but each route brings its own tools. Android needs the SDK, NDK, an added Rust target, cargo-ndk, and a separate native build before Gradle. Android Studio does not rebuild that Rust code automatically. The optional Rerun view is another installation, useful during training but separate from Brush itself.
What happened when we ran it
Our sandbox installed 102 npm packages in 14 seconds, leaving 192 MB on disk. The checkout used a fresh unprivileged Debian container with 3 CPUs, 8 GB of RAM, Node 22, and no secrets. Npm audit reported 0 known vulnerabilities across all severity levels. Installation therefore worked as given; the next step did not.
The build stopped after 7 seconds with exit 127. Its log shows the brush-app-web workspace running wasm-pack build .. --release --target bundler --out-dir web/pkg, followed by failure of npm run build:wasm-release and the Vite build chain. The tail does not identify any deeper cause, so we would not pin this on Rust, WebGPU, or the application source. It does show that the root npm build was not self-contained in this clean Node image.
There was no npm test script or target to run, so our harness skipped tests. That is narrower than saying Brush has no tests: the README tells native developers to run cargo test --all, while our supplied measurement covers the npm workflow only. The practical result is still weak for a web adopter. We got neither a completed bundle nor a test result from the root package command at commit 8b7f5c6.
Fixed-seed training has an open reproducibility report
Issue 525 deserves attention from anyone using Brush for controlled experiments. The reporter ran three trials with seed 42 and received three different models. Five unseeded trials also fell into two outcome groups. The report is careful about its limits: it used a Brush 0.3.0 binary redistributed inside another application, and its proposed explanation is explicitly a hypothesis. This is evidence to reproduce on your own hardware, not proof that current main behaves the same way.
The 31,838-line checkout gives researchers room to inspect the training path, and the README exposes kernel benchmarks through Cargo. Our lab did not run those benchmarks or train a scene, so we make no speed or quality claim. If repeatability affects a paper or a production acceptance threshold, run several fixed-seed jobs on the exact backend you intend to use and compare the exported splat counts and held-out renders before standardizing on Brush.
Multi-camera evaluation can lose files with repeated basenames
Issue 516 reports a more concrete output problem on a COLMAP rig. Eight camera folders reused station filenames, and the evaluation save path discarded the folder names. The reporter expected 24 images at an evaluation point and found 3 because later renders overwrote earlier ones. Pull request 523 proposes retaining the relative path, but it remained open when checked. A multi-camera team should test that case or carry the fix before trusting saved evaluation sets.
The repository was pushed on August 17, 2026, and GitHub listed 46 combined issues and pull requests. Issue 525 was opened and updated on August 25, which shows current user activity even though the latest tagged release, v0.3.0, dates to September 14, 2025. The release is old relative to main, yet the push and issue record do not support calling the project abandoned. Pinning a commit is safer than assuming the release represents recent fixes.
Brush is easiest to justify when platform range decides the choice
Brush offers something the reference CUDA implementation does not: one project that treats native, mobile, and browser use as first-class goals. Interactive training, masking, PLY viewing, URL streaming, and animation playback make it more than a research kernel. Apache-2.0 licensing also leaves room for product integration. The cost is a platform matrix whose rough edges arrive early, including the failed 7-second web build in our sandbox and manual Android native steps.
For an Nvidia-only research environment, gsplat or the original Gaussian Splatting implementation will be easier to compare with existing Python work. Brush earns a trial when deployment on AMD, Intel, Android, or WebGPU is the requirement that would otherwise block the project. Keep that trial narrow: reproduce the build, train the same scene more than once, inspect saved evaluation files, and verify the exact browsers you promise to support.

