
I built a web-based Gaussian Splatting viewer that runs on a €200 Android phone — here's what I learned
Hey everyone. I've been working on a web-based Gaussian Splatting viewer for the last few months and wanted to share some findings.
Make a viewer that works on any device, including budget phones, without plugins or native apps.
- SparkJS 2.0 for rendering
- Progressive streaming via chunked RAD files
- HTTP Range requests from Cloudflare R2
- Adaptive quality system that detects GPU capabilities in real-time
Real-world results (tested on actual devices):
| Scene | Desktop (RTX 3070) | Xiaomi 15 Ultra | Redmi Note 11 (€200) |
|---|---|---|---|
| Tufia (8.5M splats) | 60 fps | 55 fps | 40 fps |
| XGrids Demo (12M) | 60 fps | 45 fps | 30 fps |
| 50M splats | 60 fps | 25 fps | 15 fps |
| 100M splats | 55 fps | 15 fps | 8 fps |
What I got wrong:
1. Optimized too early. Spent weeks on custom compression before realizing `build-lod --rad-chunked --max-sh=3` already hit the sweet spot. The tooling is better than I expected.
2. Ignored the data problem. Users were uploading raw 500MB PLY files and wondering why nothing loaded. Had to build the conversion step into the workflow.
3. Assumed all phones are equal. They're wildly different. The adaptive quality system exists because of this mistake.
What I learned:
- Streaming > monolithic files. Progressive loading changes the UX entirely.
- `--max-sh=3` is the sweet spot for mobile. Higher SH bands have diminishing returns on small screens.
- The web is underrated as a platform for this. More people can click a link than download an app.
Happy to answer questions about the technical details. Live demo:
https://mirador3d.com/v/penthouse-demo