📱 Open the app — ethical-tech-colab.github.io/plumb
No install, no account. Works in the browser on your phone. Served over HTTPS because the camera and orientation sensors require it. Android Chrome gets the full feature set — add it to your home screen to run fullscreen.
New to this? Start with the 15-minute illustrated field guide, written for someone who has never done this before.
Measured photography for landmarks. A browser-based system for producing measured, verifiable photographs of historic buildings and bridges — with a calibrated on-screen grid and ruler, a raw photograph that stays raw, and cryptographically verifiable provenance.
plumb (adj.) — exactly vertical; true. to plumb (v.) — to measure the depth of; to examine closely. plumb (adv.) — precisely.
The plumb line is the oldest measuring instrument in building. This is the same idea, with a camera.
An Ethical Tech CoLab project.
Architectural and preservation work needs photographs that are evidence, not illustrations: images you can measure from, whose location, creator, date and lineage can be verified, and which meet the documentation standards landmark work is actually held to.
The Secretary of the Interior's Standards for Architectural and Engineering Documentation (HABS/HAER/HALS) already require a scale in the photograph:
"Level I photographs shall include duplicate photographs that include a scale. Level II and III photographs shall include, at a minimum, at least one photograph with a scale, usually of the principal facade."
So the ruler in the frame is not a feature idea — it's the deliverable requirement. Plumb makes it routine, and makes the resulting measurement honest about its own uncertainty.
- Android Chrome is the primary platform. Full-resolution in-page capture, lockable optics, WebXR depth sensing and Bluetooth laser meters are Android capabilities, and Plumb is designed to use them. iOS Safari is a supported, honestly-labelled reduced-capability client — it doesn't get a veto over the feature set.
- Capture is not real-time metrology. The field client produces a provenance-complete bundle; authoritative measurement happens in server-side post-processing, which can use every image of a subject together — and can be re-run years later on the same immutable bytes to produce a better answer.
- C2PA is the provenance backbone. Raw captures are signed at ingest; every derivative names its parents as C2PA ingredients, giving verifiable lineage from any deliverable back to the original exposure.
| Document | Contents |
|---|---|
| 01 — Research findings | Standards (SOI/HABS, Historic England, USIBD LOA, ASPRS, CIPA), accuracy reality check, open-source building blocks, Android-vs-iOS capability matrix, market scan, crowd-sourcing precedents, Brooklyn Bridge / DUMBO context |
| 02 — Calibration methodology | How to calibrate the grid. Five calibration tiers, homography maths, the optics-lock precondition, uncertainty budget, hold-out verification, the off-plane problem, physical kit |
| 03 — Feature list | ~95 features across capture, overlay, calibration, measurement, provenance, server pipeline, corpus, 3D, field ops and governance |
| 04 — Implementation plan | Architecture, stack, data model, 6-phase roadmap with exit criteria, 18-item risk register |
| 05 — Server & provenance | Server architecture, the post-processing pipeline stage by stage, and the C2PA provenance chain with custom survey assertions |
| 06 — Trust anchor & licensing | On-device keystore signing, why a blockchain can't be the C2PA trust anchor (but is a good archival anchor), and CC BY vs CC BY-SA |
| 07 — Backend & twin integration | Why Plumb is an evidence provider to the existing CoLab twins, not a new twin; container and Azure deployment |
| 08 — Measuring what you cannot touch | Scaling a bridge tower in water: baselines, rangefinders, published dimensions — and why a projector can't supply scale |
| HOW-TO-PLUMB | Novice field guide — illustrated, start to finish |
| Question | Decision |
|---|---|
| Contributor licence | CC BY 4.0 (photos) + CC0 (measurement data) + Apache-2.0 (code), with contributor vetting and a click-through CLA. Share-alike rejected — it would block the architects and engineers the corpus exists to serve |
| C2PA trust anchor | X.509 from a C2PA Trust List CA + RFC 3161 TSA. A blockchain key cannot sign a conformant C2PA claim |
| Blockchain role | Optional archival anchor — daily Merkle root to Base, < $1/yr, institution-independent existence proof. Additive, droppable, explicitly not the trust anchor |
| On-device keystore signing | Deferred. It's the only route to C2PA Assurance Level 2 (Pixel 10 precedent), but unreachable from a PWA. A nullable capture_attestation block is reserved from v1 |
A working, dependency-free browser prototype of the client:
cd prototype
python -m http.server 8777
# open http://127.0.0.1:8777/
node --test test/geometry.test.mjs # 26 testsEnd to end: camera capture with optics locking → toggleable metric grid and ruler → 4-point homography calibration → mandatory hold-out check → measurement with a validated uncertainty budget and USIBD LOA band → raw + overlay + provenance sidecar export. Plus WebXR AR measurement and plane-deviation scaffolding for Android, and Wi-Fi-only upload gating by default. See prototype/README.md.
A containerised ingest/trust service that publishes into the CoLab twin stack:
cd server
docker compose -f deploy/compose/docker-compose.yml up -d --build
curl http://localhost:8080/v1/meta
pytest tests -q # 15 tests
python smoke_test.py http://localhost:8080 # live end-to-endIt emits photo-survey documents conforming to
digital-3d-shared-contracts,
so dumbo-district-3d and the bridge twins consume Plumb captures directly — turning inferred facade
data (C) into observed evidence (B). Runs on a laptop, a LAN box, B3IQ infrastructure, or Azure
Container Apps from the same image. See server/README.md.
All research was gathered with the Tavily API, called directly over REST: 119 queries across 10 thematic batches, plus 14 targeted page extractions. Raw responses and query sets are preserved in research/ so every claim is traceable and every batch is re-runnable.
$env:TAVILY_API_KEY = "..."
.\research\tavily.ps1 -QueryFile .\research\q1_opensource.txt -OutFile .\research\raw\r1_opensource.json- Not a replacement for a total station, terrestrial laser scan, or a licensed survey.
- Not a claim that a phone photograph is survey-grade — achievable accuracy is stated honestly (roughly USIBD LOA20–LOA10 for marker-calibrated single images; better with external control).
- Not a system that trusts GNSS as scale, or a device clock as a legal timestamp.
- Not a system that lets an uncalibrated grid imply a measurement.
CAL-0measurement is disabled, not merely warned about. - Not a tool for solid objects you can walk around — that is Turnstone.
Turnstone is the sibling tool for 3D records of cultural objects — statues, vessels, masks, carved fragments. It began in this repository and now lives on its own.
The split is geometric, not organisational. Plumb solves for one calibrated plane and its output is a photograph you can measure from; Turnstone solves for the whole viewing sphere and its output is a mesh. They share a philosophy — the raw capture stays raw, uncertainty is stated rather than implied, and a record declares what it does not prove — and almost no code.
| Plumb | Turnstone | |
|---|---|---|
| Subject | Flat facade, often unreachable | Solid object you can walk around |
| Scale from | Printed target in shot | Scale bar in shot, or AR |
| Output | Measurable photograph + sidecar | Mesh / point cloud + sidecar |
| Compute | Entirely in-browser | Capture in-browser, reconstruction on a server |
See CONTRIBUTING.md. Contribution is open but gated — measured evidence is only as good as the people producing it, so contributors are vetted and submissions are curated before publication.
- Code — Apache-2.0
- Documentation, photographs and derived imagery — CC BY 4.0
- Measurement data and metadata — CC0 1.0
Rationale in docs/06-trust-anchor-and-licensing.md §3.