System register · Forêt de Verrières, 24 October

How a phone clip becomes a measured surface.

One continuous route through the pipeline, stage by stage, naming the thing that ran and the number that came out. Every figure below is read from the published reconstruction, not estimated: 34 clips in, 26 independently reconstructed worlds out, placed on a national LiDAR base layer with the uncertainty of each placement stated.

ran on this captureapproximate placement, stated as suchno GNSS fix at capture

The service map.

what crosses each edge, and where it lands

  1. 01CaptureiPhone · Vercel edge
    • Browser
    • Vertex AI
    • Cloud Storage

    34 clips + SHA-256 manifest

  2. 02ReconstructCompute Engine · L4 spot
    • Artifact Registry
    • Cloud Build
    • Compute Engine
    • Cloud Storage

    26 × SPZ v3, 6.2M gaussians

  3. 03RegisterDataproc · open geodata
    • Dataproc Serverless
    • Open geodata
    • Cloud Storage

    tiered placement, ±15 m to 532 m

  4. 04ServeCloud Run · GCS v3
    • Cloud Run
    • Cloud Storage
    • Browser

The route, end to end.

select a stage to isolate it

  1. 01Capture34 clips captured, zero geotagsA drone pass, a phone panorama, or imagery you already hold. No surveyed control point and no satellite fix needed at capture time.
    • iPhone 16, 34 clipshandheld, 09:30–11:30, no control point set
    • ifuse / Photos exportoriginals copied out, SHA-256 per frame, nothing deleted
    • Route trace2.36 km path recovered from the Mapillary 2026 sequence
    • Gemini 4 Argonper-frame canopy fraction, blur and scene class
    IMG_4087.MOV … IMG_4124.MOV 34 clipsframes/*.jpg hashed manifestcorridor.json 2.36 km, 1.57 m/sBrowserVertex AICloud Storage
  2. 02World model26 of 34 clips reconstructed independentlyThe footage becomes geometry through open world-model reconstruction, with high-density splats carrying the fine surface.
    • COLMAPSIFT, sequential matching overlap 40 — required or the clip loses its initial pair
    • LingBot-Mappose-free fallback: windowed, window 32, overlap 8, no render
    • LichtFeld-StudioGaussian training on one L4; frames must live in images/
    • splat-transformdecimate to budget, drop SH to band 0, emit SPZ v3
    sparse/0 posed framespoint_cloud.ply raw gaussiansverriere-IMG_4087.spz 3.0 MB, 197,511 gaussiansCompute EngineArtifact RegistryCloud Storage
  3. 03Fusion220,000 LiDAR points from 21 tilesRegistered against open geodata — street network, national terrain and elevation models, existing LiDAR — so it lands in a real coordinate system.
    • IGN LiDAR HDEPT depth 6, 21 tiles, EPSG:2154 → WGS84, vertical datum IGN69
    • build_verrieres_layer.pyinverse Lambert-93 with k0 undone before r, asserted round-trip
    • Decimation220,000 points kept, 45% ground (class 2), 13-byte stride
    • Ground samplingeach world's elevation read off the nearest ground-classified point
    verrieres-points.bin 220,000 points, 2.9 MBverrieres-points.json CRS, bounds, height range 66.05–207.0 mlidar.ts browser parse and ground lookupOpen geodataDataproc ServerlessCloud Storage
  4. 04Positioning14 / 12 anchored at 15 m / approximate to 532 mA visual positioning system resolves where each capture sits, and re-resolves it on every later visit. Position becomes a measurement, not an assumption.
    • Timestamp → arc lengthclip start mapped onto the 2.36 km corridor at 1.57 m/s
    • Tier assignmentanchored only where the clip sits on a known control point
    • Visual matching489 Mapillary reference thumbnails, 16×16 grey + hue shortlist, ORB verify
    • Honest refusal12 clips kept approximate rather than promoted
    anchors.json A, D and geometric via pointsplacement per world anchored 15 m · approximate ≤532 mVertex AICloud RunOpen geodata
  5. 05Surface and change6,237,739 gaussians across 26 worlds, 96.0 MBNational LiDAR is the ground-truth base layer, splats are superimposed on it, and differencing two epochs gives the movement with its uncertainty stated.
    • Ground base layer159,114 ground-classified points carry the terrain, not the splat
    • Superimpositionsplat origin snapped to the sampled ground height, never sea level
    • Epoch differencingtwo observations of one station, delta carried with its sigma
    • Publishmanifest + sog-report to GCS v3, CORS open, gzip + NGSP v3 asserted
    v3/manifest.json 36 worlds, tiers inlinev3/splat/*.spz 96.0 MB for 26 Verrières worlds/v2/map OSM basemap + LiDAR + stationsCloud StorageCloud RunBrowser

One clip, followed the whole way.

the shortest honest demo

IMG_4087.MOV

48.7536 N, 2.2290 E

197,511 gaussians · 3.0 MB · SPZ v3

placed anchored, ±15 m

  1. 01Recorded09:41, roundabout at Batterie de Bièvres. No control point, no GNSS fix logged.
  2. 02PosedCOLMAP registers the clip on its own; 197,511 gaussians trained in 3.0 MB of SPZ.
  3. 03GeoreferencedPlaced against IGN LiDAR HD; ground height sampled at 78 m, not assumed.
  4. 04PositionedTimestamp lands it on the corridor; tier resolves to anchored, ±15 m.
  5. 05ServedStreams as SPZ v3 into the anchored map beside the LiDAR surface.

What the run produced.

read from manifest.json and the LiDAR sidecar

Clips captured
34iPhone 16, 24 October
Worlds reconstructed
26independent, never merged
Gaussians
6,237,73996.0 MB as SPZ v3
LiDAR points
220,00021 EPT tiles, 159,114 ground
Route length
2.36 kmtraced from Mapillary
Anchored / approximate
14 / 1215 m / up to 532 m

Where each part runs.

Google Cloud, plus the open tools it schedules

Cloud StorageFrames, LiDAR tiles, trained splats and the published manifest
Compute Engineg2-standard-4 spot, one L4, for pose and splat training
Cloud RunHTTP services: tiling, fusion, the viewer cache
Vertex AIGemini 4 Argon frame classification and copy audit
Cloud BuildContainer images for every stage, built from the repo
Artifact RegistryVersioned stage images, pulled by the GPU workers
Secret ManagerCapture and geodata keys, never in the image
Dataproc ServerlessBatch jobs over the LiDAR tile set
Open geodataIGN LiDAR HD, OSM, Mapillary and Panoramax priors
BrowserStreams SPZ v3 into the viewer with no plugin

The GPU stages run open reconstruction — COLMAP for pose, LingBot-Map where SIFT finds no initial pair, LichtFeld for Gaussian training — scheduled onto Compute Engine and the serverless batch services. The national base layer is IGN LiDAR HD, reprojected from Lambert-93 to WGS84 in-application rather than at read time. Nothing here is a black box: the pipeline is in the repository, and the viewer reads the same manifest this page describes.