Inspiration

Every time a physical item changes hands (a marketplace sale, a return, a rental) someone has to trust the other side about its condition. Today the evidence is a handful of photos: they only show the angles someone chose, a 3 mm dent can vanish under the wrong light, and two sets of photos can't be compared objectively. Disputes come down to one person's word against another's, and someone eats the loss. We wanted to replace "trust me" with a measured before-and-after record.

What it does

ScanDiff is a scan versioning and diff engine for physical items, with a marketplace checkout built on top.

  1. Baseline at handoff. The seller scans the item with a LiDAR iPhone in the ScanDiff app. The app reconstructs a textured 3D model on-device, saves key photos with their camera poses, fingerprints every file with SHA-256, and uploads the scan.
  2. Check-in on arrival. The buyer scans the same item when it arrives. A QR code from the listing opens the app straight on the right item.
  3. Comparison. The engine aligns the two scans and measures, point by point, how far the surface moved, down to a few millimetres. It groups changes into regions, and a vision model (Claude) looks at before-and-after photo crops of each region to label it as a dent, missing part, scuff or normal wear.
  4. Evidence. The website shows a heat map on the 3D model, a histogram, numbered findings, and a printable evidence page with both scans' fingerprints.
  5. Decision and payment. In the demo checkout, the buyer's Visa payment is held until the check-in scan is accepted. Accept releases it the moment the decision lands (Supabase realtime); a dispute keeps it held with the evidence attached, and refunds run through Capital One's Nessie sandbox.

Honest limits: it's tamper-evident evidence of condition at handoff, not proof an item is as advertised. Only surface both scans saw is compared, and areas one scan missed are reported as "no data", never as damage. Payments are a demo; no real money moves.

How we built it

  • iOS (Swift, SwiftUI, RealityKit Object Capture): guided capture with live quality warnings and an orbit plan, on-device photogrammetry, OBJ/texture export, key photos with poses from the reconstruction, SHA-256 manifests, retrying uploads, and an in-app 3D viewer for the heat map.
  • Engine (Python, FastAPI, Open3D, trimesh): global registration (FPFH + RANSAC) refined with point-to-plane ICP, signed point-to-surface distances, a measured noise floor, coverage masking, DBSCAN change regions, Claude vision classification of each region, and textured GLB heat maps. It runs in Docker behind Caddy on AWS EC2.
  • Web (Next.js, TypeScript, three.js): list an item, QR deep links into the app, comparison viewer, live demo checkout, printable evidence page.
  • Supabase: Postgres, Storage, Auth (Google and email) and realtime, with a shared JSON contract for the diff response validated by the engine, the app and the site.

Challenges we ran into

  • Two scans of the same object never line up exactly, so separating real damage from scan noise meant measuring the noise floor instead of guessing a threshold.
  • Loose, soft parts (a coffee maker's cord) moved between scans and showed up as "damage"; we learned to filter and demo on rigid items.
  • Keeping three codebases agreeing on one response format: we caught a field mismatch that would have shown 0% confidence and fixed it with a shared, tested contract.
  • Getting a phone, a cloud engine, a database and a web checkout to react to each other live.

Accomplishments that we're proud of

  • A real end-to-end loop: scan on a phone, compare in the cloud, and watch a held payment release on the web the instant the buyer accepts.
  • Millimetre-level surface comparison from a phone, with honest "no data" handling instead of false accusations.
  • Tamper evidence: a modified model file is rejected by checksum.

What we learned

3D registration in the real world, why photos are weak evidence, and how much trust design matters: calling the output "triage for a person" instead of a verdict, and being clear about what a hash does and doesn't prove.

What's next for ScanDiff

  • Per-account access with share links (built and tested, rolling out next).
  • Rental cars and hotel rooms with room-scale capture on the same engine.
  • An SDK so marketplaces, rental platforms and shippers can embed scan-gated payments and returns.

Built With

Share this project:

Updates

Submission history