A nice and vibe coded 3D Gaussian Splat viewer built with React, TypeScript, and Three.js using the @sparkjsdev/spark renderer.
- 📷 View Gaussian Splats in an interactive 3D gallery
- 🎮 Smooth navigation with WASD fly controls + mouse orbit
- 🔮 Reveal animation when loading splats
- 🥽 AR mode support (WebXR on Android only - see below)
- 📱 Lenticular postcard effect on mobile using device sensors
- ⚡ Compressed
.spzformat for fast loading
⚠️ iOS Note: Safari on iPhone/iPad does not support WebXR AR sessions. The AR feature only works on Android with Chrome/Edge. This is an Apple platform limitation.
- React 19 + TypeScript
- Three.js + @sparkjsdev/spark
- Vite
- TailwindCSS
- Express (for local development server)
# Install dependencies
npm install
# Start the full development stack (with API server)
./scripts/start.sh
# Or just run the frontend
npm run devThis gallery displays pre-generated 3D Gaussian Splats. To create your own splats from photos:
- Use a tool like ml-sharp or other Gaussian Splatting software
- Export as
.plyformat - Place the
.plyfiles inpublic/splats/ - Run
node scripts/compress_spark.jsto compress to.spzformat - Run
./scripts/start.shto generate thumbnails and start the server
Note: The 2D-to-splat conversion is not included in this repository.
- Add your
.plyfiles topublic/splats/ - Compress them:
node scripts/compress_spark.js - Generate thumbnails by running the server and using Puppeteer screenshot automation
- For manual thumbnails, use the camera button in the viewer to set a default view
public/
├── splats/ # Original .ply files (not committed to git)
├── splats-compressed/ # Compressed .spz files (deployed)
├── thumbnails/ # Gallery thumbnails
└── configs/ # Saved camera positions
scripts/
├── start.sh # Full development stack
├── api-server.cjs # Express API server
├── preview-server.cjs # Static file server
└── compress_spark.js # PLY to SPZ compression
MIT