Film a narrated walkthrough of your home → get a mover-ready inventory ("cube sheet").
Live demo: https://move-scan.vercel.app
- Customer uploads a walkthrough video (browser → Vercel Blob direct upload, up to 2 GB).
/api/analyzecreates a load record, returns instantly, and runs analysis viaafter().- The video is streamed Blob → GCS staging bucket (never buffered in the function), then
passed to Gemini 2.5 Pro on Vertex AI as a
gs://URI with a structured-output schema. - Gemini watches the video AND listens to the narration. Spoken statements override visuals
("this dresser stays" → marked not-going with an ✗). Unmentioned visible furniture is
included as
assumed— movers over-count rather than miss. - Items come back grouped by room with quantity, size, per-item cubic feet (standard cube-sheet reference values), a note for the mover, and a video timestamp. Totals derive cubic feet → estimated weight (7 lbs/cu ft) → suggested truck size.
- Results page: video + inventory side by side, tap a timestamp to seek, toggle ✓/✗ to correct
the list (persists).
/loadslists every past survey.
- Next.js (App Router) + Tailwind v4, deployed on Vercel
- Vercel Blob — video storage + load records (JSON)
- Vertex AI Gemini 2.5 Pro (
@google/genai, service-account auth) - GCS staging bucket
xmatch-move-scan-staging(us-east1, 7-day auto-delete lifecycle)
| Var | Purpose |
|---|---|
BLOB_READ_WRITE_TOKEN |
Vercel Blob (auto-added by the linked store) |
GCP_SERVICE_ACCOUNT_KEY |
service-account JSON (Vertex + GCS) |
VERTEX_PROJECT |
GCP project id (falls back to the SA's project) |
GCS_STAGING_BUCKET |
staging bucket name (default xmatch-move-scan-staging) |
GEMINI_MODEL |
optional override (default gemini-2.5-pro) |
VERTEX_LOCATION |
optional override (default us-east1) |
npm install
vercel env pull .env.local # then add GCP_SERVICE_ACCOUNT_KEY + VERTEX_PROJECT
npm run dev
Pipeline smoke test without the UI: npx tsx scripts/test-pipeline.ts <video file>
(uploads to Blob, runs the real analysis, prints the inventory JSON + totals).
- Boxes and closet/cabinet contents are deliberately excluded (not visible on video); the UI says so. Fixtures/built-ins are excluded.
- Vertex's HTTPS-URL media fetch caps near 20 MB — that's why the GCS staging hop exists. Verified working with a 108 MB video (analyzed in ~86s).
- Demo has no auth by design (shareable with the moving company). Don't put anything sensitive in front of it without adding access control.