Walk through a house with your phone camera → photorealistic 3D model (Gaussian Splatting) → author and render artificial drone shots through the space.
Phone video ──upload──> Next.js app (Vercel)
│ Vercel Blob (video + results)
│ Neon Postgres (projects/jobs)
▼
FarmShare worker (polls the app's API)
ffmpeg frames → COLMAP → ns-train splatfacto
→ export splat → compress → upload
▼
Browser viewer + drone-path editor
→ instant WebM recording in the browser
→ or queue a high-quality MP4 render on FarmShare
app/,components/,lib/— the Next.js web appworker/— Python + Slurm scripts you run on Stanford FarmShare
npm install
node scripts/generate-demo-splat.mjs # creates public/demo.ply
npm run devOpen http://localhost:3000/demo — a synthetic room splat loads and you can try the full drone-path editor: fly around, + Keyframe a few shots, Preview flight, Record drone shot (WebM).
Flying: click the scene to capture the mouse (Esc releases it). Mouse = pitch/yaw, W/S forward/back, A/D strafe, Q/E down/up, Shift boost, scroll wheel adjusts speed. Movement has smooth acceleration for drone-like motion.
With no DATABASE_URL / BLOB_READ_WRITE_TOKEN set, the app stores data in .data/ (JSON + files), so uploads and the whole project flow work locally too.
- Move slowly; avoid fast pans (motion blur kills COLMAP).
- Landscape orientation, good lighting, 1–3 minutes, 1080p is plenty.
- Overlap your path — walk a loop, revisit doorways from both sides.
- Featureless white walls are hard; keep furniture/edges in frame.
- Deploy this repo to Vercel (
vercel deployor Git integration). - Add a Blob store (Storage tab) — sets
BLOB_READ_WRITE_TOKEN. - Add Neon Postgres via the Vercel Marketplace — sets
DATABASE_URL. - Set
WORKER_TOKENto a long random string (e.g.openssl rand -hex 32).
ssh <sunetid>@rice.stanford.edu
git clone <this repo> chuddyarchitect && cd chuddyarchitect/worker
bash setup.sh # one-time: micromamba + COLMAP + nerfstudio
vi .env # API_URL + WORKER_TOKEN
sbatch train.sbatch # drains queued jobs on a GPU node (L40S)
squeue -u $USER # watch; logs land in worker/logs/<jobid>.outTraining takes ~30–60 min per video on an L40S. Trained artifacts persist in ~/chuddy-work/<project-id>/, so drone-shot render jobs (also drained by train.sbatch) can run any time later.
Open a ready project → frame a shot → + Keyframe (4–8 of them) → set duration:
- Record drone shot (WebM) — instant, rendered in your browser at viewer quality.
- Render high-quality MP4 (FarmShare) — queues a
ns-render camera-pathjob at 1080p with full model quality; runsbatch train.sbatchagain to process it, then download from the project page.
If a scene loads tilted, use the Up axis selector in the panel (nerfstudio scenes are usually +Z up).
- Personal MVP: no auth on the UI; worker API is protected by
WORKER_TOKEN. ns-renderinterprets the camera path in the model's own coordinate space — the same space the web viewer displays — so paths authored in the viewer line up. If a server render comes out mis-oriented, check the exportedcamera-path.jsonagainstns-vieweroutput for the same scene.- Splats are compressed to PlayCanvas compressed PLY (~15–20× smaller) before upload; the viewer reads them natively. Raw PLY is the fallback.