Note: This project won at the 2026 Claude Hackathon hosted by Claude Builder Club at Purdue University! 🎉
Room Reveal is a platform where students can explore 3D Gaussian Splat models of various living spaces around campus. Models are created when users upload a video of their rooms (after specifying their location and room type) that is transformed into a Gaussian Splat 3D model by our processing pipeline. From there, any user can explore the space interactively on our website to get a sense of potential future living spaces.
Room Reveal helps students explore living spaces in dorms or apartments around campus, helping them plan ahead for how to effectively use space, what to buy, or what accommodations they may need. This is especially useful for those with disabilities or accessibility needs, as they can get a better sense of the space before moving in. Different room configurations such as lofted beds, double vs triple occupancy within the same room type, and possibilities for furniture arrangement can be better visualized through our platform. The need for this project was inspired by the fact that currently, Purdue only provides a top-down floor plan of most dorm rooms without any pictures or videos. The floor plan leaves out important details such as the location of furnishings and actually usable space. We aim to provide a more immersive and informative way for students to explore their future living spaces before moving in.
- Browse Purdue residences on a 3D map and choose room types
- Upload room videos (max 5 minutes) to generate new splats
- View available scans for a building/room type in an interactive viewer
- Navigate multiple scans for the same room type with left/right controls
- Frontend: Vite + vanilla JS
- 3D viewer: Three.js +
@sparkjsdev/spark - Map UI: MapLibre GL
- Backend API + jobs: FastAPI on Modal
- Gaussian Splatting pipeline: Nerfstudio (
ns-process-data,ns-train,ns-export) container run on Modal
src/landing.js: main landing page (/) with map, selectors, upload modal, and viewer routingsrc/main.js: viewer page (/viewer.html) for loading and navigating splatssrc/upload.js: standalone upload page (/upload.html)src/select.js: standalone selector page (/select.html)src/landing-dev.js: coordinate tuning tool (/landing-dev.html)src/api.js: frontend API URL helper usingVITE_MODAL_ENDPOINTsrc/room-config.json: configuration file for buildings + room types + map coordinatesmodal_app.py: Modal/FastAPI backend (/upload,/splats/...) and GPU pipeline job orchestrationpipeline/pipeline.sh: script executed in Modal GPU jobs to producesplat.ply
/-> landing experience (src/landing.js)/viewer.html?building=...&room_type=...&splat_id=...-> splat viewer/upload.html-> standalone upload form/select.html-> standalone selector for building/room/splat/landing-dev.html-> internal dev tool for coordinate tuning
npm installCreate a local .env from .env.example and set:
VITE_MODAL_ENDPOINT="https://your-modal-app.modal.run"If VITE_MODAL_ENDPOINT is not set, the frontend falls back to relative API paths and requests will only work if an API is served from the same origin.
npm run devnpm run build
npm run previewDefined in modal_app.py:
GET /splats/{building}/{room_type}: list available splatsGET /splats/{building}/{room_type}/{file_name}: fetch.plyfilePOST /upload: upload a room video and enqueue processing
Upload/pipeline safeguards:
- Maximum upload duration: 300 seconds
- Concurrency cap: 2 GPU jobs at a time
- Locking via
/splats/_locksto avoid over-scheduling
To run/deploy backend, use Modal CLI against modal_app.py (for example, modal serve during development or modal deploy for production).
W A S DorArrow Keys: moveSpace: move upShift: move downMouse: look around (click canvas to lock pointer)Esc: release pointer lockArrow Left/Arrow Right: switch rooms (when pointer is not locked)Re-centerbutton: reset camera to origin
The Gaussian Splatting pipeline used by the backend lives in pipeline/pipeline.sh.
For local, manual pipeline instructions, see pipeline/README.md.
